diff --git a/config/overlays.mk b/config/overlays.mk index 7133520fb..5b107a8f4 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -43,7 +43,7 @@ ov_SC01_005_ELF := $(ov_SC01_005_OUT).elf ov_SC01_005_MAPFILE := $(ov_SC01_005_OUT).map ov_SC01_005_LD_SCRIPT := $(ov_SC01_005_OUT).ld ov_SC01_005_SPLAT_YAML := config/splat.ov_SC01_005.yaml -ov_SC01_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_005_jr_8012ACE0.o,tail2.data.o,ov_SC01_005_jr_8013FFD8.o,tail3.data.o,ov_SC01_005_jr_8015444C.o,tail4.data.o,ov_SC01_005_jr_8015A3C8.o,tail5.data.o,ov_SC01_005_jr_8015AE2C.o,tail6.data.o,ov_SC01_005_jr_8016AB6C.o,tail7.data.o,ov_SC01_005_jr_801734BC.o,tail8.data.o,ov_SC01_005_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_005_jr_8012ACE0.o,tail2.data.o,ov_SC01_005_jr_801380E0.o,tail3.data.o,ov_SC01_005_jr_8013FFD8.o,tail4.data.o,ov_SC01_005_jr_8015444C.o,tail5.data.o,ov_SC01_005_jr_8015A3C8.o,tail6.data.o,ov_SC01_005_jr_8015AE2C.o,tail7.data.o,ov_SC01_005_jr_8016AB6C.o,tail8.data.o,ov_SC01_005_jr_801734BC.o,tail9.data.o,ov_SC01_005_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_005_CHECK_SHA := config/check.ov_SC01_005.sha ov_SC01_005_SYMBOLS := config/symbols.ov_SC01_005.txt ov_SC01_005_SIG := .run/sig.ov_SC01_005.jsonl @@ -65,7 +65,7 @@ ov_SC01_006_ELF := $(ov_SC01_006_OUT).elf ov_SC01_006_MAPFILE := $(ov_SC01_006_OUT).map ov_SC01_006_LD_SCRIPT := $(ov_SC01_006_OUT).ld ov_SC01_006_SPLAT_YAML := config/splat.ov_SC01_006.yaml -ov_SC01_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_006_jr_8012ACE0.o,tail2.data.o,ov_SC01_006_jr_8013FFD8.o,tail3.data.o,ov_SC01_006_jr_8015444C.o,tail4.data.o,ov_SC01_006_jr_8015A3C8.o,tail5.data.o,ov_SC01_006_jr_8015AE2C.o,tail6.data.o,ov_SC01_006_jr_8016AB6C.o,tail7.data.o,ov_SC01_006_jr_801734BC.o,tail8.data.o,ov_SC01_006_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_006_jr_8012ACE0.o,tail2.data.o,ov_SC01_006_jr_801380E0.o,tail3.data.o,ov_SC01_006_jr_8013FFD8.o,tail4.data.o,ov_SC01_006_jr_8015444C.o,tail5.data.o,ov_SC01_006_jr_8015A3C8.o,tail6.data.o,ov_SC01_006_jr_8015AE2C.o,tail7.data.o,ov_SC01_006_jr_8016AB6C.o,tail8.data.o,ov_SC01_006_jr_801734BC.o,tail9.data.o,ov_SC01_006_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_006_CHECK_SHA := config/check.ov_SC01_006.sha ov_SC01_006_SYMBOLS := config/symbols.ov_SC01_006.txt ov_SC01_006_SIG := .run/sig.ov_SC01_006.jsonl @@ -87,7 +87,7 @@ ov_SC03_001_ELF := $(ov_SC03_001_OUT).elf ov_SC03_001_MAPFILE := $(ov_SC03_001_OUT).map ov_SC03_001_LD_SCRIPT := $(ov_SC03_001_OUT).ld ov_SC03_001_SPLAT_YAML := config/splat.ov_SC03_001.yaml -ov_SC03_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_001_jr_8012ACE0.o,tail2.data.o,ov_SC03_001_jr_8013FFD8.o,tail3.data.o,ov_SC03_001_jr_8015444C.o,tail4.data.o,ov_SC03_001_jr_8015A3C8.o,tail5.data.o,ov_SC03_001_jr_8015AE2C.o,tail6.data.o,ov_SC03_001_jr_8016AB6C.o,tail7.data.o,ov_SC03_001_jr_801734BC.o,tail8.data.o,ov_SC03_001_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_001_jr_8012ACE0.o,tail2.data.o,ov_SC03_001_jr_801380E0.o,tail3.data.o,ov_SC03_001_jr_8013FFD8.o,tail4.data.o,ov_SC03_001_jr_8015444C.o,tail5.data.o,ov_SC03_001_jr_8015A3C8.o,tail6.data.o,ov_SC03_001_jr_8015AE2C.o,tail7.data.o,ov_SC03_001_jr_8016AB6C.o,tail8.data.o,ov_SC03_001_jr_801734BC.o,tail9.data.o,ov_SC03_001_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_001_CHECK_SHA := config/check.ov_SC03_001.sha ov_SC03_001_SYMBOLS := config/symbols.ov_SC03_001.txt ov_SC03_001_SIG := .run/sig.ov_SC03_001.jsonl @@ -109,7 +109,7 @@ ov_SC01_000_ELF := $(ov_SC01_000_OUT).elf ov_SC01_000_MAPFILE := $(ov_SC01_000_OUT).map ov_SC01_000_LD_SCRIPT := $(ov_SC01_000_OUT).ld ov_SC01_000_SPLAT_YAML := config/splat.ov_SC01_000.yaml -ov_SC01_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_000_jr_8012ACE0.o,tail2.data.o,ov_SC01_000_jr_8013FFD8.o,tail3.data.o,ov_SC01_000_jr_8015444C.o,tail4.data.o,ov_SC01_000_jr_8015A3C8.o,tail5.data.o,ov_SC01_000_jr_8015AE2C.o,tail6.data.o,ov_SC01_000_jr_8016AB6C.o,tail7.data.o,ov_SC01_000_jr_801734BC.o,tail8.data.o,ov_SC01_000_jr_80178D40.o,tail9.data.o,ov_SC01_000_jr_8017BEBC.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_000_jr_8012ACE0.o,tail2.data.o,ov_SC01_000_jr_801380E0.o,tail3.data.o,ov_SC01_000_jr_8013FFD8.o,tail4.data.o,ov_SC01_000_jr_8015444C.o,tail5.data.o,ov_SC01_000_jr_8015A3C8.o,tail6.data.o,ov_SC01_000_jr_8015AE2C.o,tail7.data.o,ov_SC01_000_jr_8016AB6C.o,tail8.data.o,ov_SC01_000_jr_801734BC.o,tail9.data.o,ov_SC01_000_jr_80178D40.o,tail10.data.o,ov_SC01_000_jr_8017BEBC.o,tail11.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_000_CHECK_SHA := config/check.ov_SC01_000.sha ov_SC01_000_SYMBOLS := config/symbols.ov_SC01_000.txt ov_SC01_000_SIG := .run/sig.ov_SC01_000.jsonl @@ -131,7 +131,7 @@ ov_SC01_001_ELF := $(ov_SC01_001_OUT).elf ov_SC01_001_MAPFILE := $(ov_SC01_001_OUT).map ov_SC01_001_LD_SCRIPT := $(ov_SC01_001_OUT).ld ov_SC01_001_SPLAT_YAML := config/splat.ov_SC01_001.yaml -ov_SC01_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_001_jr_8012ACE0.o,tail2.data.o,ov_SC01_001_jr_8013FFD8.o,tail3.data.o,ov_SC01_001_jr_8015444C.o,tail4.data.o,ov_SC01_001_jr_8015A3C8.o,tail5.data.o,ov_SC01_001_jr_8015AE2C.o,tail6.data.o,ov_SC01_001_jr_8016AB6C.o,tail7.data.o,ov_SC01_001_jr_801734BC.o,tail8.data.o,ov_SC01_001_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_001_jr_8012ACE0.o,tail2.data.o,ov_SC01_001_jr_801380E0.o,tail3.data.o,ov_SC01_001_jr_8013FFD8.o,tail4.data.o,ov_SC01_001_jr_8015444C.o,tail5.data.o,ov_SC01_001_jr_8015A3C8.o,tail6.data.o,ov_SC01_001_jr_8015AE2C.o,tail7.data.o,ov_SC01_001_jr_8016AB6C.o,tail8.data.o,ov_SC01_001_jr_801734BC.o,tail9.data.o,ov_SC01_001_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_001_CHECK_SHA := config/check.ov_SC01_001.sha ov_SC01_001_SYMBOLS := config/symbols.ov_SC01_001.txt ov_SC01_001_SIG := .run/sig.ov_SC01_001.jsonl @@ -153,7 +153,7 @@ ov_SC02_000_ELF := $(ov_SC02_000_OUT).elf ov_SC02_000_MAPFILE := $(ov_SC02_000_OUT).map ov_SC02_000_LD_SCRIPT := $(ov_SC02_000_OUT).ld ov_SC02_000_SPLAT_YAML := config/splat.ov_SC02_000.yaml -ov_SC02_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_000_jr_8012ACE0.o,tail2.data.o,ov_SC02_000_jr_8013FFD8.o,tail3.data.o,ov_SC02_000_jr_8015444C.o,tail4.data.o,ov_SC02_000_jr_8015A3C8.o,tail5.data.o,ov_SC02_000_jr_8015AE2C.o,tail6.data.o,ov_SC02_000_jr_8016AB6C.o,tail7.data.o,ov_SC02_000_jr_801734BC.o,tail8.data.o,ov_SC02_000_jr_80178D40.o,tail9.data.o,ov_SC02_000_jr_8017FCB0.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_000_jr_8012ACE0.o,tail2.data.o,ov_SC02_000_jr_801380E0.o,tail3.data.o,ov_SC02_000_jr_8013FFD8.o,tail4.data.o,ov_SC02_000_jr_8015444C.o,tail5.data.o,ov_SC02_000_jr_8015A3C8.o,tail6.data.o,ov_SC02_000_jr_8015AE2C.o,tail7.data.o,ov_SC02_000_jr_8016AB6C.o,tail8.data.o,ov_SC02_000_jr_801734BC.o,tail9.data.o,ov_SC02_000_jr_80178D40.o,tail10.data.o,ov_SC02_000_jr_8017FCB0.o,tail11.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_000_CHECK_SHA := config/check.ov_SC02_000.sha ov_SC02_000_SYMBOLS := config/symbols.ov_SC02_000.txt ov_SC02_000_SIG := .run/sig.ov_SC02_000.jsonl @@ -175,7 +175,7 @@ ov_SC02_003_ELF := $(ov_SC02_003_OUT).elf ov_SC02_003_MAPFILE := $(ov_SC02_003_OUT).map ov_SC02_003_LD_SCRIPT := $(ov_SC02_003_OUT).ld ov_SC02_003_SPLAT_YAML := config/splat.ov_SC02_003.yaml -ov_SC02_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_003_jr_8012ACE0.o,tail2.data.o,ov_SC02_003_jr_8013FFD8.o,tail3.data.o,ov_SC02_003_jr_8015444C.o,tail4.data.o,ov_SC02_003_jr_8015A3C8.o,tail5.data.o,ov_SC02_003_jr_8015AE2C.o,tail6.data.o,ov_SC02_003_jr_8016AB6C.o,tail7.data.o,ov_SC02_003_jr_801734BC.o,tail8.data.o,ov_SC02_003_jr_80178D40.o,tail9.data.o,ov_SC02_003_jr_8017FCB0.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_003_jr_8012ACE0.o,tail2.data.o,ov_SC02_003_jr_801380E0.o,tail3.data.o,ov_SC02_003_jr_8013FFD8.o,tail4.data.o,ov_SC02_003_jr_8015444C.o,tail5.data.o,ov_SC02_003_jr_8015A3C8.o,tail6.data.o,ov_SC02_003_jr_8015AE2C.o,tail7.data.o,ov_SC02_003_jr_8016AB6C.o,tail8.data.o,ov_SC02_003_jr_801734BC.o,tail9.data.o,ov_SC02_003_jr_80178D40.o,tail10.data.o,ov_SC02_003_jr_8017FCB0.o,tail11.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_003_CHECK_SHA := config/check.ov_SC02_003.sha ov_SC02_003_SYMBOLS := config/symbols.ov_SC02_003.txt ov_SC02_003_SIG := .run/sig.ov_SC02_003.jsonl @@ -197,7 +197,7 @@ ov_SC03_002_ELF := $(ov_SC03_002_OUT).elf ov_SC03_002_MAPFILE := $(ov_SC03_002_OUT).map ov_SC03_002_LD_SCRIPT := $(ov_SC03_002_OUT).ld ov_SC03_002_SPLAT_YAML := config/splat.ov_SC03_002.yaml -ov_SC03_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_002_jr_8012ACE0.o,tail2.data.o,ov_SC03_002_jr_8013FFD8.o,tail3.data.o,ov_SC03_002_jr_8015444C.o,tail4.data.o,ov_SC03_002_jr_8015A3C8.o,tail5.data.o,ov_SC03_002_jr_8015AE2C.o,tail6.data.o,ov_SC03_002_jr_8016AB6C.o,tail7.data.o,ov_SC03_002_jr_801734BC.o,tail8.data.o,ov_SC03_002_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_002_jr_8012ACE0.o,tail2.data.o,ov_SC03_002_jr_801380E0.o,tail3.data.o,ov_SC03_002_jr_8013FFD8.o,tail4.data.o,ov_SC03_002_jr_8015444C.o,tail5.data.o,ov_SC03_002_jr_8015A3C8.o,tail6.data.o,ov_SC03_002_jr_8015AE2C.o,tail7.data.o,ov_SC03_002_jr_8016AB6C.o,tail8.data.o,ov_SC03_002_jr_801734BC.o,tail9.data.o,ov_SC03_002_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_002_CHECK_SHA := config/check.ov_SC03_002.sha ov_SC03_002_SYMBOLS := config/symbols.ov_SC03_002.txt ov_SC03_002_SIG := .run/sig.ov_SC03_002.jsonl @@ -219,7 +219,7 @@ ov_SC03_006_ELF := $(ov_SC03_006_OUT).elf ov_SC03_006_MAPFILE := $(ov_SC03_006_OUT).map ov_SC03_006_LD_SCRIPT := $(ov_SC03_006_OUT).ld ov_SC03_006_SPLAT_YAML := config/splat.ov_SC03_006.yaml -ov_SC03_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_006_jr_8012ACE0.o,tail2.data.o,ov_SC03_006_jr_8013FFD8.o,tail3.data.o,ov_SC03_006_jr_8015444C.o,tail4.data.o,ov_SC03_006_jr_8015A3C8.o,tail5.data.o,ov_SC03_006_jr_8015AE2C.o,tail6.data.o,ov_SC03_006_jr_8016AB6C.o,tail7.data.o,ov_SC03_006_jr_801734BC.o,tail8.data.o,ov_SC03_006_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_006_jr_8012ACE0.o,tail2.data.o,ov_SC03_006_jr_801380E0.o,tail3.data.o,ov_SC03_006_jr_8013FFD8.o,tail4.data.o,ov_SC03_006_jr_8015444C.o,tail5.data.o,ov_SC03_006_jr_8015A3C8.o,tail6.data.o,ov_SC03_006_jr_8015AE2C.o,tail7.data.o,ov_SC03_006_jr_8016AB6C.o,tail8.data.o,ov_SC03_006_jr_801734BC.o,tail9.data.o,ov_SC03_006_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_006_CHECK_SHA := config/check.ov_SC03_006.sha ov_SC03_006_SYMBOLS := config/symbols.ov_SC03_006.txt ov_SC03_006_SIG := .run/sig.ov_SC03_006.jsonl @@ -241,7 +241,7 @@ ov_SC04_000_ELF := $(ov_SC04_000_OUT).elf ov_SC04_000_MAPFILE := $(ov_SC04_000_OUT).map ov_SC04_000_LD_SCRIPT := $(ov_SC04_000_OUT).ld ov_SC04_000_SPLAT_YAML := config/splat.ov_SC04_000.yaml -ov_SC04_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_000_jr_8012ACE0.o,tail2.data.o,ov_SC04_000_jr_8013FFD8.o,tail3.data.o,ov_SC04_000_jr_8015444C.o,tail4.data.o,ov_SC04_000_jr_8015A3C8.o,tail5.data.o,ov_SC04_000_jr_8015AE2C.o,tail6.data.o,ov_SC04_000_jr_8016AB6C.o,tail7.data.o,ov_SC04_000_jr_801734BC.o,tail8.data.o,ov_SC04_000_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_000_jr_8012ACE0.o,tail2.data.o,ov_SC04_000_jr_801380E0.o,tail3.data.o,ov_SC04_000_jr_8013FFD8.o,tail4.data.o,ov_SC04_000_jr_8015444C.o,tail5.data.o,ov_SC04_000_jr_8015A3C8.o,tail6.data.o,ov_SC04_000_jr_8015AE2C.o,tail7.data.o,ov_SC04_000_jr_8016AB6C.o,tail8.data.o,ov_SC04_000_jr_801734BC.o,tail9.data.o,ov_SC04_000_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_000_CHECK_SHA := config/check.ov_SC04_000.sha ov_SC04_000_SYMBOLS := config/symbols.ov_SC04_000.txt ov_SC04_000_SIG := .run/sig.ov_SC04_000.jsonl @@ -263,7 +263,7 @@ ov_SC04_018_ELF := $(ov_SC04_018_OUT).elf ov_SC04_018_MAPFILE := $(ov_SC04_018_OUT).map ov_SC04_018_LD_SCRIPT := $(ov_SC04_018_OUT).ld ov_SC04_018_SPLAT_YAML := config/splat.ov_SC04_018.yaml -ov_SC04_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_018_jr_8012ACE0.o,tail2.data.o,ov_SC04_018_jr_8013FFD8.o,tail3.data.o,ov_SC04_018_jr_8015444C.o,tail4.data.o,ov_SC04_018_jr_8015A3C8.o,tail5.data.o,ov_SC04_018_jr_8015AE2C.o,tail6.data.o,ov_SC04_018_jr_8016AB6C.o,tail7.data.o,ov_SC04_018_jr_801734BC.o,tail8.data.o,ov_SC04_018_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_018_jr_8012ACE0.o,tail2.data.o,ov_SC04_018_jr_801380E0.o,tail3.data.o,ov_SC04_018_jr_8013FFD8.o,tail4.data.o,ov_SC04_018_jr_8015444C.o,tail5.data.o,ov_SC04_018_jr_8015A3C8.o,tail6.data.o,ov_SC04_018_jr_8015AE2C.o,tail7.data.o,ov_SC04_018_jr_8016AB6C.o,tail8.data.o,ov_SC04_018_jr_801734BC.o,tail9.data.o,ov_SC04_018_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_018_CHECK_SHA := config/check.ov_SC04_018.sha ov_SC04_018_SYMBOLS := config/symbols.ov_SC04_018.txt ov_SC04_018_SIG := .run/sig.ov_SC04_018.jsonl @@ -285,7 +285,7 @@ ov_SC04_019_ELF := $(ov_SC04_019_OUT).elf ov_SC04_019_MAPFILE := $(ov_SC04_019_OUT).map ov_SC04_019_LD_SCRIPT := $(ov_SC04_019_OUT).ld ov_SC04_019_SPLAT_YAML := config/splat.ov_SC04_019.yaml -ov_SC04_019_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_019_jr_8012ACE0.o,tail2.data.o,ov_SC04_019_jr_8013FFD8.o,tail3.data.o,ov_SC04_019_jr_8015444C.o,tail4.data.o,ov_SC04_019_jr_8015A3C8.o,tail5.data.o,ov_SC04_019_jr_8015AE2C.o,tail6.data.o,ov_SC04_019_jr_8016AB6C.o,tail7.data.o,ov_SC04_019_jr_801734BC.o,tail8.data.o,ov_SC04_019_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_019_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_019_jr_8012ACE0.o,tail2.data.o,ov_SC04_019_jr_801380E0.o,tail3.data.o,ov_SC04_019_jr_8013FFD8.o,tail4.data.o,ov_SC04_019_jr_8015444C.o,tail5.data.o,ov_SC04_019_jr_8015A3C8.o,tail6.data.o,ov_SC04_019_jr_8015AE2C.o,tail7.data.o,ov_SC04_019_jr_8016AB6C.o,tail8.data.o,ov_SC04_019_jr_801734BC.o,tail9.data.o,ov_SC04_019_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_019_CHECK_SHA := config/check.ov_SC04_019.sha ov_SC04_019_SYMBOLS := config/symbols.ov_SC04_019.txt ov_SC04_019_SIG := .run/sig.ov_SC04_019.jsonl @@ -307,7 +307,7 @@ ov_SC05_000_ELF := $(ov_SC05_000_OUT).elf ov_SC05_000_MAPFILE := $(ov_SC05_000_OUT).map ov_SC05_000_LD_SCRIPT := $(ov_SC05_000_OUT).ld ov_SC05_000_SPLAT_YAML := config/splat.ov_SC05_000.yaml -ov_SC05_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_000_jr_8012ACE0.o,tail2.data.o,ov_SC05_000_jr_8013FFD8.o,tail3.data.o,ov_SC05_000_jr_8015444C.o,tail4.data.o,ov_SC05_000_jr_8015A3C8.o,tail5.data.o,ov_SC05_000_jr_8015AE2C.o,tail6.data.o,ov_SC05_000_jr_8016AB6C.o,tail7.data.o,ov_SC05_000_jr_801734BC.o,tail8.data.o,ov_SC05_000_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_000_jr_8012ACE0.o,tail2.data.o,ov_SC05_000_jr_801380E0.o,tail3.data.o,ov_SC05_000_jr_8013FFD8.o,tail4.data.o,ov_SC05_000_jr_8015444C.o,tail5.data.o,ov_SC05_000_jr_8015A3C8.o,tail6.data.o,ov_SC05_000_jr_8015AE2C.o,tail7.data.o,ov_SC05_000_jr_8016AB6C.o,tail8.data.o,ov_SC05_000_jr_801734BC.o,tail9.data.o,ov_SC05_000_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_000_CHECK_SHA := config/check.ov_SC05_000.sha ov_SC05_000_SYMBOLS := config/symbols.ov_SC05_000.txt ov_SC05_000_SIG := .run/sig.ov_SC05_000.jsonl @@ -329,7 +329,7 @@ ov_SC06_000_ELF := $(ov_SC06_000_OUT).elf ov_SC06_000_MAPFILE := $(ov_SC06_000_OUT).map ov_SC06_000_LD_SCRIPT := $(ov_SC06_000_OUT).ld ov_SC06_000_SPLAT_YAML := config/splat.ov_SC06_000.yaml -ov_SC06_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_000.o,tail2.data.o,ov_SC06_000_jr_8015444C.o,tail3.data.o,ov_SC06_000_jr_8015A3C8.o,tail4.data.o,ov_SC06_000_jr_8015AE2C.o,tail5.data.o,ov_SC06_000_jr_8016AB6C.o,tail6.data.o,ov_SC06_000_jr_801734BC.o,tail7.data.o,ov_SC06_000_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_000_jr_8012ACE0.o,tail2.data.o,ov_SC06_000_jr_801380E0.o,tail3.data.o,ov_SC06_000_jr_8015444C.o,tail4.data.o,ov_SC06_000_jr_8015A3C8.o,tail5.data.o,ov_SC06_000_jr_8015AE2C.o,tail6.data.o,ov_SC06_000_jr_8016AB6C.o,tail7.data.o,ov_SC06_000_jr_801734BC.o,tail8.data.o,ov_SC06_000_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_000_CHECK_SHA := config/check.ov_SC06_000.sha ov_SC06_000_SYMBOLS := config/symbols.ov_SC06_000.txt ov_SC06_000_SIG := .run/sig.ov_SC06_000.jsonl @@ -351,7 +351,7 @@ ov_SC07_000_ELF := $(ov_SC07_000_OUT).elf ov_SC07_000_MAPFILE := $(ov_SC07_000_OUT).map ov_SC07_000_LD_SCRIPT := $(ov_SC07_000_OUT).ld ov_SC07_000_SPLAT_YAML := config/splat.ov_SC07_000.yaml -ov_SC07_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_000_jr_8012ACE0.o,tail2.data.o,ov_SC07_000_jr_8013FFD8.o,tail3.data.o,ov_SC07_000_jr_8015444C.o,tail4.data.o,ov_SC07_000_jr_8015A3C8.o,tail5.data.o,ov_SC07_000_jr_8015AE2C.o,tail6.data.o,ov_SC07_000_jr_8016AB6C.o,tail7.data.o,ov_SC07_000_jr_801734BC.o,tail8.data.o,ov_SC07_000_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC07_000_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_000_jr_8012ACE0.o,tail2.data.o,ov_SC07_000_jr_801380E0.o,tail3.data.o,ov_SC07_000_jr_8013FFD8.o,tail4.data.o,ov_SC07_000_jr_8015444C.o,tail5.data.o,ov_SC07_000_jr_8015A3C8.o,tail6.data.o,ov_SC07_000_jr_8015AE2C.o,tail7.data.o,ov_SC07_000_jr_8016AB6C.o,tail8.data.o,ov_SC07_000_jr_801734BC.o,tail9.data.o,ov_SC07_000_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC07_000_CHECK_SHA := config/check.ov_SC07_000.sha ov_SC07_000_SYMBOLS := config/symbols.ov_SC07_000.txt ov_SC07_000_SIG := .run/sig.ov_SC07_000.jsonl @@ -373,7 +373,7 @@ ov_SC01_004_ELF := $(ov_SC01_004_OUT).elf ov_SC01_004_MAPFILE := $(ov_SC01_004_OUT).map ov_SC01_004_LD_SCRIPT := $(ov_SC01_004_OUT).ld ov_SC01_004_SPLAT_YAML := config/splat.ov_SC01_004.yaml -ov_SC01_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_004_jr_8012ACE0.o,tail2.data.o,ov_SC01_004_jr_8013FFD8.o,tail3.data.o,ov_SC01_004_jr_8015444C.o,tail4.data.o,ov_SC01_004_jr_8015A3C8.o,tail5.data.o,ov_SC01_004_jr_8015AE2C.o,tail6.data.o,ov_SC01_004_jr_8016AB6C.o,tail7.data.o,ov_SC01_004_jr_801734BC.o,tail8.data.o,ov_SC01_004_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_004_jr_8012ACE0.o,tail2.data.o,ov_SC01_004_jr_801380E0.o,tail3.data.o,ov_SC01_004_jr_8013FFD8.o,tail4.data.o,ov_SC01_004_jr_8015444C.o,tail5.data.o,ov_SC01_004_jr_8015A3C8.o,tail6.data.o,ov_SC01_004_jr_8015AE2C.o,tail7.data.o,ov_SC01_004_jr_8016AB6C.o,tail8.data.o,ov_SC01_004_jr_801734BC.o,tail9.data.o,ov_SC01_004_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_004_CHECK_SHA := config/check.ov_SC01_004.sha ov_SC01_004_SYMBOLS := config/symbols.ov_SC01_004.txt ov_SC01_004_SIG := .run/sig.ov_SC01_004.jsonl @@ -395,7 +395,7 @@ ov_SC01_008_ELF := $(ov_SC01_008_OUT).elf ov_SC01_008_MAPFILE := $(ov_SC01_008_OUT).map ov_SC01_008_LD_SCRIPT := $(ov_SC01_008_OUT).ld ov_SC01_008_SPLAT_YAML := config/splat.ov_SC01_008.yaml -ov_SC01_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_008_jr_8012ACE0.o,tail2.data.o,ov_SC01_008_jr_8013FFD8.o,tail3.data.o,ov_SC01_008_jr_8015444C.o,tail4.data.o,ov_SC01_008_jr_8015A3C8.o,tail5.data.o,ov_SC01_008_jr_8015AE2C.o,tail6.data.o,ov_SC01_008_jr_8016AB6C.o,tail7.data.o,ov_SC01_008_jr_801734BC.o,tail8.data.o,ov_SC01_008_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_008_jr_8012ACE0.o,tail2.data.o,ov_SC01_008_jr_801380E0.o,tail3.data.o,ov_SC01_008_jr_8013FFD8.o,tail4.data.o,ov_SC01_008_jr_8015444C.o,tail5.data.o,ov_SC01_008_jr_8015A3C8.o,tail6.data.o,ov_SC01_008_jr_8015AE2C.o,tail7.data.o,ov_SC01_008_jr_8016AB6C.o,tail8.data.o,ov_SC01_008_jr_801734BC.o,tail9.data.o,ov_SC01_008_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_008_CHECK_SHA := config/check.ov_SC01_008.sha ov_SC01_008_SYMBOLS := config/symbols.ov_SC01_008.txt ov_SC01_008_SIG := .run/sig.ov_SC01_008.jsonl @@ -417,7 +417,7 @@ ov_SC01_009_ELF := $(ov_SC01_009_OUT).elf ov_SC01_009_MAPFILE := $(ov_SC01_009_OUT).map ov_SC01_009_LD_SCRIPT := $(ov_SC01_009_OUT).ld ov_SC01_009_SPLAT_YAML := config/splat.ov_SC01_009.yaml -ov_SC01_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_009_jr_8012ACE0.o,tail2.data.o,ov_SC01_009_jr_8013FFD8.o,tail3.data.o,ov_SC01_009_jr_8015444C.o,tail4.data.o,ov_SC01_009_jr_8015A3C8.o,tail5.data.o,ov_SC01_009_jr_8015AE2C.o,tail6.data.o,ov_SC01_009_jr_8016AB6C.o,tail7.data.o,ov_SC01_009_jr_801734BC.o,tail8.data.o,ov_SC01_009_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_009_jr_8012ACE0.o,tail2.data.o,ov_SC01_009_jr_801380E0.o,tail3.data.o,ov_SC01_009_jr_8013FFD8.o,tail4.data.o,ov_SC01_009_jr_8015444C.o,tail5.data.o,ov_SC01_009_jr_8015A3C8.o,tail6.data.o,ov_SC01_009_jr_8015AE2C.o,tail7.data.o,ov_SC01_009_jr_8016AB6C.o,tail8.data.o,ov_SC01_009_jr_801734BC.o,tail9.data.o,ov_SC01_009_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_009_CHECK_SHA := config/check.ov_SC01_009.sha ov_SC01_009_SYMBOLS := config/symbols.ov_SC01_009.txt ov_SC01_009_SIG := .run/sig.ov_SC01_009.jsonl @@ -439,7 +439,7 @@ ov_SC01_074_ELF := $(ov_SC01_074_OUT).elf ov_SC01_074_MAPFILE := $(ov_SC01_074_OUT).map ov_SC01_074_LD_SCRIPT := $(ov_SC01_074_OUT).ld ov_SC01_074_SPLAT_YAML := config/splat.ov_SC01_074.yaml -ov_SC01_074_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_074_jr_8012ACE0.o,tail2.data.o,ov_SC01_074_jr_8013FFD8.o,tail3.data.o,ov_SC01_074_jr_8015444C.o,tail4.data.o,ov_SC01_074_jr_8015A3C8.o,tail5.data.o,ov_SC01_074_jr_8015AE2C.o,tail6.data.o,ov_SC01_074_jr_8016AB6C.o,tail7.data.o,ov_SC01_074_jr_801734BC.o,tail8.data.o,ov_SC01_074_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_074_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_074_jr_8012ACE0.o,tail2.data.o,ov_SC01_074_jr_801380E0.o,tail3.data.o,ov_SC01_074_jr_8013FFD8.o,tail4.data.o,ov_SC01_074_jr_8015444C.o,tail5.data.o,ov_SC01_074_jr_8015A3C8.o,tail6.data.o,ov_SC01_074_jr_8015AE2C.o,tail7.data.o,ov_SC01_074_jr_8016AB6C.o,tail8.data.o,ov_SC01_074_jr_801734BC.o,tail9.data.o,ov_SC01_074_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_074_CHECK_SHA := config/check.ov_SC01_074.sha ov_SC01_074_SYMBOLS := config/symbols.ov_SC01_074.txt ov_SC01_074_SIG := .run/sig.ov_SC01_074.jsonl @@ -461,7 +461,7 @@ ov_SC01_080_ELF := $(ov_SC01_080_OUT).elf ov_SC01_080_MAPFILE := $(ov_SC01_080_OUT).map ov_SC01_080_LD_SCRIPT := $(ov_SC01_080_OUT).ld ov_SC01_080_SPLAT_YAML := config/splat.ov_SC01_080.yaml -ov_SC01_080_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_080_jr_8012ACE0.o,tail2.data.o,ov_SC01_080_jr_8013FFD8.o,tail3.data.o,ov_SC01_080_jr_8015444C.o,tail4.data.o,ov_SC01_080_jr_8015A3C8.o,tail5.data.o,ov_SC01_080_jr_8015AE2C.o,tail6.data.o,ov_SC01_080_jr_8016AB6C.o,tail7.data.o,ov_SC01_080_jr_801734BC.o,tail8.data.o,ov_SC01_080_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_080_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_080_jr_8012ACE0.o,tail2.data.o,ov_SC01_080_jr_801380E0.o,tail3.data.o,ov_SC01_080_jr_8013FFD8.o,tail4.data.o,ov_SC01_080_jr_8015444C.o,tail5.data.o,ov_SC01_080_jr_8015A3C8.o,tail6.data.o,ov_SC01_080_jr_8015AE2C.o,tail7.data.o,ov_SC01_080_jr_8016AB6C.o,tail8.data.o,ov_SC01_080_jr_801734BC.o,tail9.data.o,ov_SC01_080_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_080_CHECK_SHA := config/check.ov_SC01_080.sha ov_SC01_080_SYMBOLS := config/symbols.ov_SC01_080.txt ov_SC01_080_SIG := .run/sig.ov_SC01_080.jsonl @@ -483,7 +483,7 @@ ov_SC01_084_ELF := $(ov_SC01_084_OUT).elf ov_SC01_084_MAPFILE := $(ov_SC01_084_OUT).map ov_SC01_084_LD_SCRIPT := $(ov_SC01_084_OUT).ld ov_SC01_084_SPLAT_YAML := config/splat.ov_SC01_084.yaml -ov_SC01_084_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_084_jr_8012ACE0.o,tail2.data.o,ov_SC01_084_jr_8013FFD8.o,tail3.data.o,ov_SC01_084_jr_8015444C.o,tail4.data.o,ov_SC01_084_jr_8015A3C8.o,tail5.data.o,ov_SC01_084_jr_8015AE2C.o,tail6.data.o,ov_SC01_084_jr_8016AB6C.o,tail7.data.o,ov_SC01_084_jr_801734BC.o,tail8.data.o,ov_SC01_084_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC01_084_JTBL_INTERLEAVE := --order tail.data.o,ov_SC01_084_jr_8012ACE0.o,tail2.data.o,ov_SC01_084_jr_801380E0.o,tail3.data.o,ov_SC01_084_jr_8013FFD8.o,tail4.data.o,ov_SC01_084_jr_8015444C.o,tail5.data.o,ov_SC01_084_jr_8015A3C8.o,tail6.data.o,ov_SC01_084_jr_8015AE2C.o,tail7.data.o,ov_SC01_084_jr_8016AB6C.o,tail8.data.o,ov_SC01_084_jr_801734BC.o,tail9.data.o,ov_SC01_084_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC01_084_CHECK_SHA := config/check.ov_SC01_084.sha ov_SC01_084_SYMBOLS := config/symbols.ov_SC01_084.txt ov_SC01_084_SIG := .run/sig.ov_SC01_084.jsonl @@ -505,7 +505,7 @@ ov_SC02_004_ELF := $(ov_SC02_004_OUT).elf ov_SC02_004_MAPFILE := $(ov_SC02_004_OUT).map ov_SC02_004_LD_SCRIPT := $(ov_SC02_004_OUT).ld ov_SC02_004_SPLAT_YAML := config/splat.ov_SC02_004.yaml -ov_SC02_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_004_jr_8012ACE0.o,tail2.data.o,ov_SC02_004_jr_8013FFD8.o,tail3.data.o,ov_SC02_004_jr_8015444C.o,tail4.data.o,ov_SC02_004_jr_8015A3C8.o,tail5.data.o,ov_SC02_004_jr_8015AE2C.o,tail6.data.o,ov_SC02_004_jr_8016AB6C.o,tail7.data.o,ov_SC02_004_jr_801734BC.o,tail8.data.o,ov_SC02_004_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_004_jr_8012ACE0.o,tail2.data.o,ov_SC02_004_jr_801380E0.o,tail3.data.o,ov_SC02_004_jr_8013FFD8.o,tail4.data.o,ov_SC02_004_jr_8015444C.o,tail5.data.o,ov_SC02_004_jr_8015A3C8.o,tail6.data.o,ov_SC02_004_jr_8015AE2C.o,tail7.data.o,ov_SC02_004_jr_8016AB6C.o,tail8.data.o,ov_SC02_004_jr_801734BC.o,tail9.data.o,ov_SC02_004_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_004_CHECK_SHA := config/check.ov_SC02_004.sha ov_SC02_004_SYMBOLS := config/symbols.ov_SC02_004.txt ov_SC02_004_SIG := .run/sig.ov_SC02_004.jsonl @@ -527,7 +527,7 @@ ov_SC02_005_ELF := $(ov_SC02_005_OUT).elf ov_SC02_005_MAPFILE := $(ov_SC02_005_OUT).map ov_SC02_005_LD_SCRIPT := $(ov_SC02_005_OUT).ld ov_SC02_005_SPLAT_YAML := config/splat.ov_SC02_005.yaml -ov_SC02_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_005_jr_8012ACE0.o,tail2.data.o,ov_SC02_005_jr_8013FFD8.o,tail3.data.o,ov_SC02_005_jr_8015444C.o,tail4.data.o,ov_SC02_005_jr_8015A3C8.o,tail5.data.o,ov_SC02_005_jr_8015AE2C.o,tail6.data.o,ov_SC02_005_jr_8016AB6C.o,tail7.data.o,ov_SC02_005_jr_801734BC.o,tail8.data.o,ov_SC02_005_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_005_jr_8012ACE0.o,tail2.data.o,ov_SC02_005_jr_801380E0.o,tail3.data.o,ov_SC02_005_jr_8013FFD8.o,tail4.data.o,ov_SC02_005_jr_8015444C.o,tail5.data.o,ov_SC02_005_jr_8015A3C8.o,tail6.data.o,ov_SC02_005_jr_8015AE2C.o,tail7.data.o,ov_SC02_005_jr_8016AB6C.o,tail8.data.o,ov_SC02_005_jr_801734BC.o,tail9.data.o,ov_SC02_005_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_005_CHECK_SHA := config/check.ov_SC02_005.sha ov_SC02_005_SYMBOLS := config/symbols.ov_SC02_005.txt ov_SC02_005_SIG := .run/sig.ov_SC02_005.jsonl @@ -549,7 +549,7 @@ ov_SC02_011_ELF := $(ov_SC02_011_OUT).elf ov_SC02_011_MAPFILE := $(ov_SC02_011_OUT).map ov_SC02_011_LD_SCRIPT := $(ov_SC02_011_OUT).ld ov_SC02_011_SPLAT_YAML := config/splat.ov_SC02_011.yaml -ov_SC02_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_011_jr_8012ACE0.o,tail2.data.o,ov_SC02_011_jr_8013FFD8.o,tail3.data.o,ov_SC02_011_jr_8015444C.o,tail4.data.o,ov_SC02_011_jr_8015A3C8.o,tail5.data.o,ov_SC02_011_jr_8015AE2C.o,tail6.data.o,ov_SC02_011_jr_8016AB6C.o,tail7.data.o,ov_SC02_011_jr_801734BC.o,tail8.data.o,ov_SC02_011_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_011_jr_8012ACE0.o,tail2.data.o,ov_SC02_011_jr_801380E0.o,tail3.data.o,ov_SC02_011_jr_8013FFD8.o,tail4.data.o,ov_SC02_011_jr_8015444C.o,tail5.data.o,ov_SC02_011_jr_8015A3C8.o,tail6.data.o,ov_SC02_011_jr_8015AE2C.o,tail7.data.o,ov_SC02_011_jr_8016AB6C.o,tail8.data.o,ov_SC02_011_jr_801734BC.o,tail9.data.o,ov_SC02_011_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_011_CHECK_SHA := config/check.ov_SC02_011.sha ov_SC02_011_SYMBOLS := config/symbols.ov_SC02_011.txt ov_SC02_011_SIG := .run/sig.ov_SC02_011.jsonl @@ -571,7 +571,7 @@ ov_SC02_015_ELF := $(ov_SC02_015_OUT).elf ov_SC02_015_MAPFILE := $(ov_SC02_015_OUT).map ov_SC02_015_LD_SCRIPT := $(ov_SC02_015_OUT).ld ov_SC02_015_SPLAT_YAML := config/splat.ov_SC02_015.yaml -ov_SC02_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_015_jr_8012ACE0.o,tail2.data.o,ov_SC02_015_jr_8013FFD8.o,tail3.data.o,ov_SC02_015_jr_8015444C.o,tail4.data.o,ov_SC02_015_jr_8015A3C8.o,tail5.data.o,ov_SC02_015_jr_8015AE2C.o,tail6.data.o,ov_SC02_015_jr_8016AB6C.o,tail7.data.o,ov_SC02_015_jr_801734BC.o,tail8.data.o,ov_SC02_015_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_015_jr_8012ACE0.o,tail2.data.o,ov_SC02_015_jr_801380E0.o,tail3.data.o,ov_SC02_015_jr_8013FFD8.o,tail4.data.o,ov_SC02_015_jr_8015444C.o,tail5.data.o,ov_SC02_015_jr_8015A3C8.o,tail6.data.o,ov_SC02_015_jr_8015AE2C.o,tail7.data.o,ov_SC02_015_jr_8016AB6C.o,tail8.data.o,ov_SC02_015_jr_801734BC.o,tail9.data.o,ov_SC02_015_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_015_CHECK_SHA := config/check.ov_SC02_015.sha ov_SC02_015_SYMBOLS := config/symbols.ov_SC02_015.txt ov_SC02_015_SIG := .run/sig.ov_SC02_015.jsonl @@ -593,7 +593,7 @@ ov_SC02_016_ELF := $(ov_SC02_016_OUT).elf ov_SC02_016_MAPFILE := $(ov_SC02_016_OUT).map ov_SC02_016_LD_SCRIPT := $(ov_SC02_016_OUT).ld ov_SC02_016_SPLAT_YAML := config/splat.ov_SC02_016.yaml -ov_SC02_016_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_016_jr_8012ACE0.o,tail2.data.o,ov_SC02_016_jr_8013FFD8.o,tail3.data.o,ov_SC02_016_jr_8015444C.o,tail4.data.o,ov_SC02_016_jr_8015A3C8.o,tail5.data.o,ov_SC02_016_jr_8015AE2C.o,tail6.data.o,ov_SC02_016_jr_8016AB6C.o,tail7.data.o,ov_SC02_016_jr_801734BC.o,tail8.data.o,ov_SC02_016_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_016_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_016_jr_8012ACE0.o,tail2.data.o,ov_SC02_016_jr_801380E0.o,tail3.data.o,ov_SC02_016_jr_8013FFD8.o,tail4.data.o,ov_SC02_016_jr_8015444C.o,tail5.data.o,ov_SC02_016_jr_8015A3C8.o,tail6.data.o,ov_SC02_016_jr_8015AE2C.o,tail7.data.o,ov_SC02_016_jr_8016AB6C.o,tail8.data.o,ov_SC02_016_jr_801734BC.o,tail9.data.o,ov_SC02_016_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_016_CHECK_SHA := config/check.ov_SC02_016.sha ov_SC02_016_SYMBOLS := config/symbols.ov_SC02_016.txt ov_SC02_016_SIG := .run/sig.ov_SC02_016.jsonl @@ -615,7 +615,7 @@ ov_SC02_017_ELF := $(ov_SC02_017_OUT).elf ov_SC02_017_MAPFILE := $(ov_SC02_017_OUT).map ov_SC02_017_LD_SCRIPT := $(ov_SC02_017_OUT).ld ov_SC02_017_SPLAT_YAML := config/splat.ov_SC02_017.yaml -ov_SC02_017_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_017_jr_8012ACE0.o,tail2.data.o,ov_SC02_017_jr_8013FFD8.o,tail3.data.o,ov_SC02_017_jr_8015444C.o,tail4.data.o,ov_SC02_017_jr_8015A3C8.o,tail5.data.o,ov_SC02_017_jr_8015AE2C.o,tail6.data.o,ov_SC02_017_jr_8016AB6C.o,tail7.data.o,ov_SC02_017_jr_801734BC.o,tail8.data.o,ov_SC02_017_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_017_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_017_jr_8012ACE0.o,tail2.data.o,ov_SC02_017_jr_801380E0.o,tail3.data.o,ov_SC02_017_jr_8013FFD8.o,tail4.data.o,ov_SC02_017_jr_8015444C.o,tail5.data.o,ov_SC02_017_jr_8015A3C8.o,tail6.data.o,ov_SC02_017_jr_8015AE2C.o,tail7.data.o,ov_SC02_017_jr_8016AB6C.o,tail8.data.o,ov_SC02_017_jr_801734BC.o,tail9.data.o,ov_SC02_017_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_017_CHECK_SHA := config/check.ov_SC02_017.sha ov_SC02_017_SYMBOLS := config/symbols.ov_SC02_017.txt ov_SC02_017_SIG := .run/sig.ov_SC02_017.jsonl @@ -637,7 +637,7 @@ ov_SC02_021_ELF := $(ov_SC02_021_OUT).elf ov_SC02_021_MAPFILE := $(ov_SC02_021_OUT).map ov_SC02_021_LD_SCRIPT := $(ov_SC02_021_OUT).ld ov_SC02_021_SPLAT_YAML := config/splat.ov_SC02_021.yaml -ov_SC02_021_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_021_jr_8012ACE0.o,tail2.data.o,ov_SC02_021_jr_8013FFD8.o,tail3.data.o,ov_SC02_021_jr_8015444C.o,tail4.data.o,ov_SC02_021_jr_8015A3C8.o,tail5.data.o,ov_SC02_021_jr_8015AE2C.o,tail6.data.o,ov_SC02_021_jr_8016AB6C.o,tail7.data.o,ov_SC02_021_jr_801734BC.o,tail8.data.o,ov_SC02_021_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_021_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_021_jr_8012ACE0.o,tail2.data.o,ov_SC02_021_jr_801380E0.o,tail3.data.o,ov_SC02_021_jr_8013FFD8.o,tail4.data.o,ov_SC02_021_jr_8015444C.o,tail5.data.o,ov_SC02_021_jr_8015A3C8.o,tail6.data.o,ov_SC02_021_jr_8015AE2C.o,tail7.data.o,ov_SC02_021_jr_8016AB6C.o,tail8.data.o,ov_SC02_021_jr_801734BC.o,tail9.data.o,ov_SC02_021_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_021_CHECK_SHA := config/check.ov_SC02_021.sha ov_SC02_021_SYMBOLS := config/symbols.ov_SC02_021.txt ov_SC02_021_SIG := .run/sig.ov_SC02_021.jsonl @@ -659,7 +659,7 @@ ov_SC02_026_ELF := $(ov_SC02_026_OUT).elf ov_SC02_026_MAPFILE := $(ov_SC02_026_OUT).map ov_SC02_026_LD_SCRIPT := $(ov_SC02_026_OUT).ld ov_SC02_026_SPLAT_YAML := config/splat.ov_SC02_026.yaml -ov_SC02_026_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_026_jr_8012ACE0.o,tail2.data.o,ov_SC02_026_jr_8013FFD8.o,tail3.data.o,ov_SC02_026_jr_8015444C.o,tail4.data.o,ov_SC02_026_jr_8015A3C8.o,tail5.data.o,ov_SC02_026_jr_8015AE2C.o,tail6.data.o,ov_SC02_026_jr_8016AB6C.o,tail7.data.o,ov_SC02_026_jr_801734BC.o,tail8.data.o,ov_SC02_026_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_026_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_026_jr_8012ACE0.o,tail2.data.o,ov_SC02_026_jr_801380E0.o,tail3.data.o,ov_SC02_026_jr_8013FFD8.o,tail4.data.o,ov_SC02_026_jr_8015444C.o,tail5.data.o,ov_SC02_026_jr_8015A3C8.o,tail6.data.o,ov_SC02_026_jr_8015AE2C.o,tail7.data.o,ov_SC02_026_jr_8016AB6C.o,tail8.data.o,ov_SC02_026_jr_801734BC.o,tail9.data.o,ov_SC02_026_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_026_CHECK_SHA := config/check.ov_SC02_026.sha ov_SC02_026_SYMBOLS := config/symbols.ov_SC02_026.txt ov_SC02_026_SIG := .run/sig.ov_SC02_026.jsonl @@ -681,7 +681,7 @@ ov_SC02_027_ELF := $(ov_SC02_027_OUT).elf ov_SC02_027_MAPFILE := $(ov_SC02_027_OUT).map ov_SC02_027_LD_SCRIPT := $(ov_SC02_027_OUT).ld ov_SC02_027_SPLAT_YAML := config/splat.ov_SC02_027.yaml -ov_SC02_027_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_027_jr_8012ACE0.o,tail2.data.o,ov_SC02_027_jr_8013FFD8.o,tail3.data.o,ov_SC02_027_jr_8015444C.o,tail4.data.o,ov_SC02_027_jr_8015A3C8.o,tail5.data.o,ov_SC02_027_jr_8015AE2C.o,tail6.data.o,ov_SC02_027_jr_8016AB6C.o,tail7.data.o,ov_SC02_027_jr_801734BC.o,tail8.data.o,ov_SC02_027_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_027_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_027_jr_8012ACE0.o,tail2.data.o,ov_SC02_027_jr_801380E0.o,tail3.data.o,ov_SC02_027_jr_8013FFD8.o,tail4.data.o,ov_SC02_027_jr_8015444C.o,tail5.data.o,ov_SC02_027_jr_8015A3C8.o,tail6.data.o,ov_SC02_027_jr_8015AE2C.o,tail7.data.o,ov_SC02_027_jr_8016AB6C.o,tail8.data.o,ov_SC02_027_jr_801734BC.o,tail9.data.o,ov_SC02_027_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_027_CHECK_SHA := config/check.ov_SC02_027.sha ov_SC02_027_SYMBOLS := config/symbols.ov_SC02_027.txt ov_SC02_027_SIG := .run/sig.ov_SC02_027.jsonl @@ -703,7 +703,7 @@ ov_SC02_028_ELF := $(ov_SC02_028_OUT).elf ov_SC02_028_MAPFILE := $(ov_SC02_028_OUT).map ov_SC02_028_LD_SCRIPT := $(ov_SC02_028_OUT).ld ov_SC02_028_SPLAT_YAML := config/splat.ov_SC02_028.yaml -ov_SC02_028_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_028_jr_8012ACE0.o,tail2.data.o,ov_SC02_028_jr_8013FFD8.o,tail3.data.o,ov_SC02_028_jr_8015444C.o,tail4.data.o,ov_SC02_028_jr_8015A3C8.o,tail5.data.o,ov_SC02_028_jr_8015AE2C.o,tail6.data.o,ov_SC02_028_jr_8016AB6C.o,tail7.data.o,ov_SC02_028_jr_801734BC.o,tail8.data.o,ov_SC02_028_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_028_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_028_jr_8012ACE0.o,tail2.data.o,ov_SC02_028_jr_801380E0.o,tail3.data.o,ov_SC02_028_jr_8013FFD8.o,tail4.data.o,ov_SC02_028_jr_8015444C.o,tail5.data.o,ov_SC02_028_jr_8015A3C8.o,tail6.data.o,ov_SC02_028_jr_8015AE2C.o,tail7.data.o,ov_SC02_028_jr_8016AB6C.o,tail8.data.o,ov_SC02_028_jr_801734BC.o,tail9.data.o,ov_SC02_028_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_028_CHECK_SHA := config/check.ov_SC02_028.sha ov_SC02_028_SYMBOLS := config/symbols.ov_SC02_028.txt ov_SC02_028_SIG := .run/sig.ov_SC02_028.jsonl @@ -725,7 +725,7 @@ ov_SC02_031_ELF := $(ov_SC02_031_OUT).elf ov_SC02_031_MAPFILE := $(ov_SC02_031_OUT).map ov_SC02_031_LD_SCRIPT := $(ov_SC02_031_OUT).ld ov_SC02_031_SPLAT_YAML := config/splat.ov_SC02_031.yaml -ov_SC02_031_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_031_jr_8012ACE0.o,tail2.data.o,ov_SC02_031_jr_8013FFD8.o,tail3.data.o,ov_SC02_031_jr_8015444C.o,tail4.data.o,ov_SC02_031_jr_8015A3C8.o,tail5.data.o,ov_SC02_031_jr_8015AE2C.o,tail6.data.o,ov_SC02_031_jr_8016AB6C.o,tail7.data.o,ov_SC02_031_jr_801734BC.o,tail8.data.o,ov_SC02_031_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_031_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_031_jr_8012ACE0.o,tail2.data.o,ov_SC02_031_jr_801380E0.o,tail3.data.o,ov_SC02_031_jr_8013FFD8.o,tail4.data.o,ov_SC02_031_jr_8015444C.o,tail5.data.o,ov_SC02_031_jr_8015A3C8.o,tail6.data.o,ov_SC02_031_jr_8015AE2C.o,tail7.data.o,ov_SC02_031_jr_8016AB6C.o,tail8.data.o,ov_SC02_031_jr_801734BC.o,tail9.data.o,ov_SC02_031_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_031_CHECK_SHA := config/check.ov_SC02_031.sha ov_SC02_031_SYMBOLS := config/symbols.ov_SC02_031.txt ov_SC02_031_SIG := .run/sig.ov_SC02_031.jsonl @@ -747,7 +747,7 @@ ov_SC02_035_ELF := $(ov_SC02_035_OUT).elf ov_SC02_035_MAPFILE := $(ov_SC02_035_OUT).map ov_SC02_035_LD_SCRIPT := $(ov_SC02_035_OUT).ld ov_SC02_035_SPLAT_YAML := config/splat.ov_SC02_035.yaml -ov_SC02_035_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_035_jr_8012ACE0.o,tail2.data.o,ov_SC02_035_jr_8013FFD8.o,tail3.data.o,ov_SC02_035_jr_8015444C.o,tail4.data.o,ov_SC02_035_jr_8015A3C8.o,tail5.data.o,ov_SC02_035_jr_8015AE2C.o,tail6.data.o,ov_SC02_035_jr_8016AB6C.o,tail7.data.o,ov_SC02_035_jr_801734BC.o,tail8.data.o,ov_SC02_035_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_035_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_035_jr_8012ACE0.o,tail2.data.o,ov_SC02_035_jr_801380E0.o,tail3.data.o,ov_SC02_035_jr_8013FFD8.o,tail4.data.o,ov_SC02_035_jr_8015444C.o,tail5.data.o,ov_SC02_035_jr_8015A3C8.o,tail6.data.o,ov_SC02_035_jr_8015AE2C.o,tail7.data.o,ov_SC02_035_jr_8016AB6C.o,tail8.data.o,ov_SC02_035_jr_801734BC.o,tail9.data.o,ov_SC02_035_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_035_CHECK_SHA := config/check.ov_SC02_035.sha ov_SC02_035_SYMBOLS := config/symbols.ov_SC02_035.txt ov_SC02_035_SIG := .run/sig.ov_SC02_035.jsonl @@ -769,7 +769,7 @@ ov_SC02_039_ELF := $(ov_SC02_039_OUT).elf ov_SC02_039_MAPFILE := $(ov_SC02_039_OUT).map ov_SC02_039_LD_SCRIPT := $(ov_SC02_039_OUT).ld ov_SC02_039_SPLAT_YAML := config/splat.ov_SC02_039.yaml -ov_SC02_039_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_039_jr_8012ACE0.o,tail2.data.o,ov_SC02_039_jr_8013FFD8.o,tail3.data.o,ov_SC02_039_jr_8015444C.o,tail4.data.o,ov_SC02_039_jr_8015A3C8.o,tail5.data.o,ov_SC02_039_jr_8015AE2C.o,tail6.data.o,ov_SC02_039_jr_8016AB6C.o,tail7.data.o,ov_SC02_039_jr_801734BC.o,tail8.data.o,ov_SC02_039_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_039_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_039_jr_8012ACE0.o,tail2.data.o,ov_SC02_039_jr_801380E0.o,tail3.data.o,ov_SC02_039_jr_8013FFD8.o,tail4.data.o,ov_SC02_039_jr_8015444C.o,tail5.data.o,ov_SC02_039_jr_8015A3C8.o,tail6.data.o,ov_SC02_039_jr_8015AE2C.o,tail7.data.o,ov_SC02_039_jr_8016AB6C.o,tail8.data.o,ov_SC02_039_jr_801734BC.o,tail9.data.o,ov_SC02_039_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_039_CHECK_SHA := config/check.ov_SC02_039.sha ov_SC02_039_SYMBOLS := config/symbols.ov_SC02_039.txt ov_SC02_039_SIG := .run/sig.ov_SC02_039.jsonl @@ -791,7 +791,7 @@ ov_SC02_041_ELF := $(ov_SC02_041_OUT).elf ov_SC02_041_MAPFILE := $(ov_SC02_041_OUT).map ov_SC02_041_LD_SCRIPT := $(ov_SC02_041_OUT).ld ov_SC02_041_SPLAT_YAML := config/splat.ov_SC02_041.yaml -ov_SC02_041_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_041_jr_8012ACE0.o,tail2.data.o,ov_SC02_041_jr_8013FFD8.o,tail3.data.o,ov_SC02_041_jr_8015444C.o,tail4.data.o,ov_SC02_041_jr_8015A3C8.o,tail5.data.o,ov_SC02_041_jr_8015AE2C.o,tail6.data.o,ov_SC02_041_jr_8016AB6C.o,tail7.data.o,ov_SC02_041_jr_801734BC.o,tail8.data.o,ov_SC02_041_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC02_041_JTBL_INTERLEAVE := --order tail.data.o,ov_SC02_041_jr_8012ACE0.o,tail2.data.o,ov_SC02_041_jr_801380E0.o,tail3.data.o,ov_SC02_041_jr_8013FFD8.o,tail4.data.o,ov_SC02_041_jr_8015444C.o,tail5.data.o,ov_SC02_041_jr_8015A3C8.o,tail6.data.o,ov_SC02_041_jr_8015AE2C.o,tail7.data.o,ov_SC02_041_jr_8016AB6C.o,tail8.data.o,ov_SC02_041_jr_801734BC.o,tail9.data.o,ov_SC02_041_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC02_041_CHECK_SHA := config/check.ov_SC02_041.sha ov_SC02_041_SYMBOLS := config/symbols.ov_SC02_041.txt ov_SC02_041_SIG := .run/sig.ov_SC02_041.jsonl @@ -813,7 +813,7 @@ ov_SC03_003_ELF := $(ov_SC03_003_OUT).elf ov_SC03_003_MAPFILE := $(ov_SC03_003_OUT).map ov_SC03_003_LD_SCRIPT := $(ov_SC03_003_OUT).ld ov_SC03_003_SPLAT_YAML := config/splat.ov_SC03_003.yaml -ov_SC03_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_003_jr_8012ACE0.o,tail2.data.o,ov_SC03_003_jr_8013FFD8.o,tail3.data.o,ov_SC03_003_jr_8015444C.o,tail4.data.o,ov_SC03_003_jr_8015A3C8.o,tail5.data.o,ov_SC03_003_jr_8015AE2C.o,tail6.data.o,ov_SC03_003_jr_8016AB6C.o,tail7.data.o,ov_SC03_003_jr_801734BC.o,tail8.data.o,ov_SC03_003_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_003_jr_8012ACE0.o,tail2.data.o,ov_SC03_003_jr_801380E0.o,tail3.data.o,ov_SC03_003_jr_8013FFD8.o,tail4.data.o,ov_SC03_003_jr_8015444C.o,tail5.data.o,ov_SC03_003_jr_8015A3C8.o,tail6.data.o,ov_SC03_003_jr_8015AE2C.o,tail7.data.o,ov_SC03_003_jr_8016AB6C.o,tail8.data.o,ov_SC03_003_jr_801734BC.o,tail9.data.o,ov_SC03_003_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_003_CHECK_SHA := config/check.ov_SC03_003.sha ov_SC03_003_SYMBOLS := config/symbols.ov_SC03_003.txt ov_SC03_003_SIG := .run/sig.ov_SC03_003.jsonl @@ -835,7 +835,7 @@ ov_SC03_007_ELF := $(ov_SC03_007_OUT).elf ov_SC03_007_MAPFILE := $(ov_SC03_007_OUT).map ov_SC03_007_LD_SCRIPT := $(ov_SC03_007_OUT).ld ov_SC03_007_SPLAT_YAML := config/splat.ov_SC03_007.yaml -ov_SC03_007_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_007_jr_8012ACE0.o,tail2.data.o,ov_SC03_007_jr_8013FFD8.o,tail3.data.o,ov_SC03_007_jr_8015444C.o,tail4.data.o,ov_SC03_007_jr_8015A3C8.o,tail5.data.o,ov_SC03_007_jr_8015AE2C.o,tail6.data.o,ov_SC03_007_jr_8016AB6C.o,tail7.data.o,ov_SC03_007_jr_801734BC.o,tail8.data.o,ov_SC03_007_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_007_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_007_jr_8012ACE0.o,tail2.data.o,ov_SC03_007_jr_801380E0.o,tail3.data.o,ov_SC03_007_jr_8013FFD8.o,tail4.data.o,ov_SC03_007_jr_8015444C.o,tail5.data.o,ov_SC03_007_jr_8015A3C8.o,tail6.data.o,ov_SC03_007_jr_8015AE2C.o,tail7.data.o,ov_SC03_007_jr_8016AB6C.o,tail8.data.o,ov_SC03_007_jr_801734BC.o,tail9.data.o,ov_SC03_007_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_007_CHECK_SHA := config/check.ov_SC03_007.sha ov_SC03_007_SYMBOLS := config/symbols.ov_SC03_007.txt ov_SC03_007_SIG := .run/sig.ov_SC03_007.jsonl @@ -857,7 +857,7 @@ ov_SC03_010_ELF := $(ov_SC03_010_OUT).elf ov_SC03_010_MAPFILE := $(ov_SC03_010_OUT).map ov_SC03_010_LD_SCRIPT := $(ov_SC03_010_OUT).ld ov_SC03_010_SPLAT_YAML := config/splat.ov_SC03_010.yaml -ov_SC03_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_010_jr_8012ACE0.o,tail2.data.o,ov_SC03_010_jr_8013FFD8.o,tail3.data.o,ov_SC03_010_jr_8015444C.o,tail4.data.o,ov_SC03_010_jr_8015A3C8.o,tail5.data.o,ov_SC03_010_jr_8015AE2C.o,tail6.data.o,ov_SC03_010_jr_8016AB6C.o,tail7.data.o,ov_SC03_010_jr_801734BC.o,tail8.data.o,ov_SC03_010_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_010_jr_8012ACE0.o,tail2.data.o,ov_SC03_010_jr_801380E0.o,tail3.data.o,ov_SC03_010_jr_8013FFD8.o,tail4.data.o,ov_SC03_010_jr_8015444C.o,tail5.data.o,ov_SC03_010_jr_8015A3C8.o,tail6.data.o,ov_SC03_010_jr_8015AE2C.o,tail7.data.o,ov_SC03_010_jr_8016AB6C.o,tail8.data.o,ov_SC03_010_jr_801734BC.o,tail9.data.o,ov_SC03_010_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_010_CHECK_SHA := config/check.ov_SC03_010.sha ov_SC03_010_SYMBOLS := config/symbols.ov_SC03_010.txt ov_SC03_010_SIG := .run/sig.ov_SC03_010.jsonl @@ -879,7 +879,7 @@ ov_SC03_011_ELF := $(ov_SC03_011_OUT).elf ov_SC03_011_MAPFILE := $(ov_SC03_011_OUT).map ov_SC03_011_LD_SCRIPT := $(ov_SC03_011_OUT).ld ov_SC03_011_SPLAT_YAML := config/splat.ov_SC03_011.yaml -ov_SC03_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_011.o,tail2.data.o,ov_SC03_011_jr_8015444C.o,tail3.data.o,ov_SC03_011_jr_8015A3C8.o,tail4.data.o,ov_SC03_011_jr_8015AE2C.o,tail5.data.o,ov_SC03_011_jr_8016AB6C.o,tail6.data.o,ov_SC03_011_jr_801734BC.o,tail7.data.o,ov_SC03_011_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_011_jr_8012ACE0.o,tail2.data.o,ov_SC03_011_jr_801380E0.o,tail3.data.o,ov_SC03_011_jr_8015444C.o,tail4.data.o,ov_SC03_011_jr_8015A3C8.o,tail5.data.o,ov_SC03_011_jr_8015AE2C.o,tail6.data.o,ov_SC03_011_jr_8016AB6C.o,tail7.data.o,ov_SC03_011_jr_801734BC.o,tail8.data.o,ov_SC03_011_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_011_CHECK_SHA := config/check.ov_SC03_011.sha ov_SC03_011_SYMBOLS := config/symbols.ov_SC03_011.txt ov_SC03_011_SIG := .run/sig.ov_SC03_011.jsonl @@ -901,7 +901,7 @@ ov_SC03_012_ELF := $(ov_SC03_012_OUT).elf ov_SC03_012_MAPFILE := $(ov_SC03_012_OUT).map ov_SC03_012_LD_SCRIPT := $(ov_SC03_012_OUT).ld ov_SC03_012_SPLAT_YAML := config/splat.ov_SC03_012.yaml -ov_SC03_012_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_012_jr_8012ACE0.o,tail2.data.o,ov_SC03_012_jr_8013FFD8.o,tail3.data.o,ov_SC03_012_jr_8015444C.o,tail4.data.o,ov_SC03_012_jr_8015A3C8.o,tail5.data.o,ov_SC03_012_jr_8015AE2C.o,tail6.data.o,ov_SC03_012_jr_8016AB6C.o,tail7.data.o,ov_SC03_012_jr_801734BC.o,tail8.data.o,ov_SC03_012_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_012_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_012_jr_8012ACE0.o,tail2.data.o,ov_SC03_012_jr_801380E0.o,tail3.data.o,ov_SC03_012_jr_8013FFD8.o,tail4.data.o,ov_SC03_012_jr_8015444C.o,tail5.data.o,ov_SC03_012_jr_8015A3C8.o,tail6.data.o,ov_SC03_012_jr_8015AE2C.o,tail7.data.o,ov_SC03_012_jr_8016AB6C.o,tail8.data.o,ov_SC03_012_jr_801734BC.o,tail9.data.o,ov_SC03_012_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_012_CHECK_SHA := config/check.ov_SC03_012.sha ov_SC03_012_SYMBOLS := config/symbols.ov_SC03_012.txt ov_SC03_012_SIG := .run/sig.ov_SC03_012.jsonl @@ -923,7 +923,7 @@ ov_SC03_013_ELF := $(ov_SC03_013_OUT).elf ov_SC03_013_MAPFILE := $(ov_SC03_013_OUT).map ov_SC03_013_LD_SCRIPT := $(ov_SC03_013_OUT).ld ov_SC03_013_SPLAT_YAML := config/splat.ov_SC03_013.yaml -ov_SC03_013_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_013_jr_8012ACE0.o,tail2.data.o,ov_SC03_013_jr_8013FFD8.o,tail3.data.o,ov_SC03_013_jr_8015444C.o,tail4.data.o,ov_SC03_013_jr_8015A3C8.o,tail5.data.o,ov_SC03_013_jr_8015AE2C.o,tail6.data.o,ov_SC03_013_jr_8016AB6C.o,tail7.data.o,ov_SC03_013_jr_801734BC.o,tail8.data.o,ov_SC03_013_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_013_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_013_jr_8012ACE0.o,tail2.data.o,ov_SC03_013_jr_801380E0.o,tail3.data.o,ov_SC03_013_jr_8013FFD8.o,tail4.data.o,ov_SC03_013_jr_8015444C.o,tail5.data.o,ov_SC03_013_jr_8015A3C8.o,tail6.data.o,ov_SC03_013_jr_8015AE2C.o,tail7.data.o,ov_SC03_013_jr_8016AB6C.o,tail8.data.o,ov_SC03_013_jr_801734BC.o,tail9.data.o,ov_SC03_013_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_013_CHECK_SHA := config/check.ov_SC03_013.sha ov_SC03_013_SYMBOLS := config/symbols.ov_SC03_013.txt ov_SC03_013_SIG := .run/sig.ov_SC03_013.jsonl @@ -945,7 +945,7 @@ ov_SC03_014_ELF := $(ov_SC03_014_OUT).elf ov_SC03_014_MAPFILE := $(ov_SC03_014_OUT).map ov_SC03_014_LD_SCRIPT := $(ov_SC03_014_OUT).ld ov_SC03_014_SPLAT_YAML := config/splat.ov_SC03_014.yaml -ov_SC03_014_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_014_jr_8012ACE0.o,tail2.data.o,ov_SC03_014_jr_8013FFD8.o,tail3.data.o,ov_SC03_014_jr_8015444C.o,tail4.data.o,ov_SC03_014_jr_8015A3C8.o,tail5.data.o,ov_SC03_014_jr_8015AE2C.o,tail6.data.o,ov_SC03_014_jr_8016AB6C.o,tail7.data.o,ov_SC03_014_jr_801734BC.o,tail8.data.o,ov_SC03_014_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_014_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_014_jr_8012ACE0.o,tail2.data.o,ov_SC03_014_jr_801380E0.o,tail3.data.o,ov_SC03_014_jr_8013FFD8.o,tail4.data.o,ov_SC03_014_jr_8015444C.o,tail5.data.o,ov_SC03_014_jr_8015A3C8.o,tail6.data.o,ov_SC03_014_jr_8015AE2C.o,tail7.data.o,ov_SC03_014_jr_8016AB6C.o,tail8.data.o,ov_SC03_014_jr_801734BC.o,tail9.data.o,ov_SC03_014_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_014_CHECK_SHA := config/check.ov_SC03_014.sha ov_SC03_014_SYMBOLS := config/symbols.ov_SC03_014.txt ov_SC03_014_SIG := .run/sig.ov_SC03_014.jsonl @@ -967,7 +967,7 @@ ov_SC03_015_ELF := $(ov_SC03_015_OUT).elf ov_SC03_015_MAPFILE := $(ov_SC03_015_OUT).map ov_SC03_015_LD_SCRIPT := $(ov_SC03_015_OUT).ld ov_SC03_015_SPLAT_YAML := config/splat.ov_SC03_015.yaml -ov_SC03_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_015_jr_8012ACE0.o,tail2.data.o,ov_SC03_015_jr_8013FFD8.o,tail3.data.o,ov_SC03_015_jr_8015444C.o,tail4.data.o,ov_SC03_015_jr_8015A3C8.o,tail5.data.o,ov_SC03_015_jr_8015AE2C.o,tail6.data.o,ov_SC03_015_jr_8016AB6C.o,tail7.data.o,ov_SC03_015_jr_801734BC.o,tail8.data.o,ov_SC03_015_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_015_jr_8012ACE0.o,tail2.data.o,ov_SC03_015_jr_801380E0.o,tail3.data.o,ov_SC03_015_jr_8013FFD8.o,tail4.data.o,ov_SC03_015_jr_8015444C.o,tail5.data.o,ov_SC03_015_jr_8015A3C8.o,tail6.data.o,ov_SC03_015_jr_8015AE2C.o,tail7.data.o,ov_SC03_015_jr_8016AB6C.o,tail8.data.o,ov_SC03_015_jr_801734BC.o,tail9.data.o,ov_SC03_015_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_015_CHECK_SHA := config/check.ov_SC03_015.sha ov_SC03_015_SYMBOLS := config/symbols.ov_SC03_015.txt ov_SC03_015_SIG := .run/sig.ov_SC03_015.jsonl @@ -989,7 +989,7 @@ ov_SC03_023_ELF := $(ov_SC03_023_OUT).elf ov_SC03_023_MAPFILE := $(ov_SC03_023_OUT).map ov_SC03_023_LD_SCRIPT := $(ov_SC03_023_OUT).ld ov_SC03_023_SPLAT_YAML := config/splat.ov_SC03_023.yaml -ov_SC03_023_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_023_jr_8012ACE0.o,tail2.data.o,ov_SC03_023_jr_8013FFD8.o,tail3.data.o,ov_SC03_023_jr_8015444C.o,tail4.data.o,ov_SC03_023_jr_8015A3C8.o,tail5.data.o,ov_SC03_023_jr_8015AE2C.o,tail6.data.o,ov_SC03_023_jr_8016AB6C.o,tail7.data.o,ov_SC03_023_jr_801734BC.o,tail8.data.o,ov_SC03_023_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_023_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_023_jr_8012ACE0.o,tail2.data.o,ov_SC03_023_jr_801380E0.o,tail3.data.o,ov_SC03_023_jr_8013FFD8.o,tail4.data.o,ov_SC03_023_jr_8015444C.o,tail5.data.o,ov_SC03_023_jr_8015A3C8.o,tail6.data.o,ov_SC03_023_jr_8015AE2C.o,tail7.data.o,ov_SC03_023_jr_8016AB6C.o,tail8.data.o,ov_SC03_023_jr_801734BC.o,tail9.data.o,ov_SC03_023_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_023_CHECK_SHA := config/check.ov_SC03_023.sha ov_SC03_023_SYMBOLS := config/symbols.ov_SC03_023.txt ov_SC03_023_SIG := .run/sig.ov_SC03_023.jsonl @@ -1011,7 +1011,7 @@ ov_SC03_024_ELF := $(ov_SC03_024_OUT).elf ov_SC03_024_MAPFILE := $(ov_SC03_024_OUT).map ov_SC03_024_LD_SCRIPT := $(ov_SC03_024_OUT).ld ov_SC03_024_SPLAT_YAML := config/splat.ov_SC03_024.yaml -ov_SC03_024_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_024_jr_8012ACE0.o,tail2.data.o,ov_SC03_024_jr_8013FFD8.o,tail3.data.o,ov_SC03_024_jr_8015444C.o,tail4.data.o,ov_SC03_024_jr_8015A3C8.o,tail5.data.o,ov_SC03_024_jr_8015AE2C.o,tail6.data.o,ov_SC03_024_jr_8016AB6C.o,tail7.data.o,ov_SC03_024_jr_801734BC.o,tail8.data.o,ov_SC03_024_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_024_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_024_jr_8012ACE0.o,tail2.data.o,ov_SC03_024_jr_801380E0.o,tail3.data.o,ov_SC03_024_jr_8013FFD8.o,tail4.data.o,ov_SC03_024_jr_8015444C.o,tail5.data.o,ov_SC03_024_jr_8015A3C8.o,tail6.data.o,ov_SC03_024_jr_8015AE2C.o,tail7.data.o,ov_SC03_024_jr_8016AB6C.o,tail8.data.o,ov_SC03_024_jr_801734BC.o,tail9.data.o,ov_SC03_024_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_024_CHECK_SHA := config/check.ov_SC03_024.sha ov_SC03_024_SYMBOLS := config/symbols.ov_SC03_024.txt ov_SC03_024_SIG := .run/sig.ov_SC03_024.jsonl @@ -1033,7 +1033,7 @@ ov_SC03_028_ELF := $(ov_SC03_028_OUT).elf ov_SC03_028_MAPFILE := $(ov_SC03_028_OUT).map ov_SC03_028_LD_SCRIPT := $(ov_SC03_028_OUT).ld ov_SC03_028_SPLAT_YAML := config/splat.ov_SC03_028.yaml -ov_SC03_028_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_028_jr_8012ACE0.o,tail2.data.o,ov_SC03_028_jr_8013FFD8.o,tail3.data.o,ov_SC03_028_jr_8015444C.o,tail4.data.o,ov_SC03_028_jr_8015A3C8.o,tail5.data.o,ov_SC03_028_jr_8015AE2C.o,tail6.data.o,ov_SC03_028_jr_8016AB6C.o,tail7.data.o,ov_SC03_028_jr_801734BC.o,tail8.data.o,ov_SC03_028_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_028_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_028_jr_8012ACE0.o,tail2.data.o,ov_SC03_028_jr_801380E0.o,tail3.data.o,ov_SC03_028_jr_8013FFD8.o,tail4.data.o,ov_SC03_028_jr_8015444C.o,tail5.data.o,ov_SC03_028_jr_8015A3C8.o,tail6.data.o,ov_SC03_028_jr_8015AE2C.o,tail7.data.o,ov_SC03_028_jr_8016AB6C.o,tail8.data.o,ov_SC03_028_jr_801734BC.o,tail9.data.o,ov_SC03_028_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_028_CHECK_SHA := config/check.ov_SC03_028.sha ov_SC03_028_SYMBOLS := config/symbols.ov_SC03_028.txt ov_SC03_028_SIG := .run/sig.ov_SC03_028.jsonl @@ -1055,7 +1055,7 @@ ov_SC03_029_ELF := $(ov_SC03_029_OUT).elf ov_SC03_029_MAPFILE := $(ov_SC03_029_OUT).map ov_SC03_029_LD_SCRIPT := $(ov_SC03_029_OUT).ld ov_SC03_029_SPLAT_YAML := config/splat.ov_SC03_029.yaml -ov_SC03_029_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_029_jr_8012ACE0.o,tail2.data.o,ov_SC03_029_jr_8013FFD8.o,tail3.data.o,ov_SC03_029_jr_8015444C.o,tail4.data.o,ov_SC03_029_jr_8015A3C8.o,tail5.data.o,ov_SC03_029_jr_8015AE2C.o,tail6.data.o,ov_SC03_029_jr_8016AB6C.o,tail7.data.o,ov_SC03_029_jr_801734BC.o,tail8.data.o,ov_SC03_029_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_029_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_029_jr_8012ACE0.o,tail2.data.o,ov_SC03_029_jr_801380E0.o,tail3.data.o,ov_SC03_029_jr_8013FFD8.o,tail4.data.o,ov_SC03_029_jr_8015444C.o,tail5.data.o,ov_SC03_029_jr_8015A3C8.o,tail6.data.o,ov_SC03_029_jr_8015AE2C.o,tail7.data.o,ov_SC03_029_jr_8016AB6C.o,tail8.data.o,ov_SC03_029_jr_801734BC.o,tail9.data.o,ov_SC03_029_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_029_CHECK_SHA := config/check.ov_SC03_029.sha ov_SC03_029_SYMBOLS := config/symbols.ov_SC03_029.txt ov_SC03_029_SIG := .run/sig.ov_SC03_029.jsonl @@ -1077,7 +1077,7 @@ ov_SC03_030_ELF := $(ov_SC03_030_OUT).elf ov_SC03_030_MAPFILE := $(ov_SC03_030_OUT).map ov_SC03_030_LD_SCRIPT := $(ov_SC03_030_OUT).ld ov_SC03_030_SPLAT_YAML := config/splat.ov_SC03_030.yaml -ov_SC03_030_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_030.o,tail2.data.o,ov_SC03_030_jr_8015444C.o,tail3.data.o,ov_SC03_030_jr_8015A3C8.o,tail4.data.o,ov_SC03_030_jr_8015AE2C.o,tail5.data.o,ov_SC03_030_jr_8016AB6C.o,tail6.data.o,ov_SC03_030_jr_801734BC.o,tail7.data.o,ov_SC03_030_jr_80178D40.o,tail8.data.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_030_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_030_jr_8012ACE0.o,tail2.data.o,ov_SC03_030_jr_801380E0.o,tail3.data.o,ov_SC03_030_jr_8015444C.o,tail4.data.o,ov_SC03_030_jr_8015A3C8.o,tail5.data.o,ov_SC03_030_jr_8015AE2C.o,tail6.data.o,ov_SC03_030_jr_8016AB6C.o,tail7.data.o,ov_SC03_030_jr_801734BC.o,tail8.data.o,ov_SC03_030_jr_80178D40.o,tail9.data.o # Phase-26 §8 jtbl-rodata carve ov_SC03_030_CHECK_SHA := config/check.ov_SC03_030.sha ov_SC03_030_SYMBOLS := config/symbols.ov_SC03_030.txt ov_SC03_030_SIG := .run/sig.ov_SC03_030.jsonl @@ -1099,7 +1099,7 @@ ov_SC03_031_ELF := $(ov_SC03_031_OUT).elf ov_SC03_031_MAPFILE := $(ov_SC03_031_OUT).map ov_SC03_031_LD_SCRIPT := $(ov_SC03_031_OUT).ld ov_SC03_031_SPLAT_YAML := config/splat.ov_SC03_031.yaml -ov_SC03_031_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_031_jr_8012ACE0.o,tail2.data.o,ov_SC03_031_jr_8013FFD8.o,tail3.data.o,ov_SC03_031_jr_8015444C.o,tail4.data.o,ov_SC03_031_jr_8015A3C8.o,tail5.data.o,ov_SC03_031_jr_8015AE2C.o,tail6.data.o,ov_SC03_031_jr_8016AB6C.o,tail7.data.o,ov_SC03_031_jr_801734BC.o,tail8.data.o,ov_SC03_031_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_031_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_031_jr_8012ACE0.o,tail2.data.o,ov_SC03_031_jr_801380E0.o,tail3.data.o,ov_SC03_031_jr_8013FFD8.o,tail4.data.o,ov_SC03_031_jr_8015444C.o,tail5.data.o,ov_SC03_031_jr_8015A3C8.o,tail6.data.o,ov_SC03_031_jr_8015AE2C.o,tail7.data.o,ov_SC03_031_jr_8016AB6C.o,tail8.data.o,ov_SC03_031_jr_801734BC.o,tail9.data.o,ov_SC03_031_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_031_CHECK_SHA := config/check.ov_SC03_031.sha ov_SC03_031_SYMBOLS := config/symbols.ov_SC03_031.txt ov_SC03_031_SIG := .run/sig.ov_SC03_031.jsonl @@ -1121,7 +1121,7 @@ ov_SC03_089_ELF := $(ov_SC03_089_OUT).elf ov_SC03_089_MAPFILE := $(ov_SC03_089_OUT).map ov_SC03_089_LD_SCRIPT := $(ov_SC03_089_OUT).ld ov_SC03_089_SPLAT_YAML := config/splat.ov_SC03_089.yaml -ov_SC03_089_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_089_jr_8012ACE0.o,tail2.data.o,ov_SC03_089_jr_8013FFD8.o,tail3.data.o,ov_SC03_089_jr_8015444C.o,tail4.data.o,ov_SC03_089_jr_8015A3C8.o,tail5.data.o,ov_SC03_089_jr_8015AE2C.o,tail6.data.o,ov_SC03_089_jr_8016AB6C.o,tail7.data.o,ov_SC03_089_jr_801734BC.o,tail8.data.o,ov_SC03_089_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_089_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_089_jr_8012ACE0.o,tail2.data.o,ov_SC03_089_jr_801380E0.o,tail3.data.o,ov_SC03_089_jr_8013FFD8.o,tail4.data.o,ov_SC03_089_jr_8015444C.o,tail5.data.o,ov_SC03_089_jr_8015A3C8.o,tail6.data.o,ov_SC03_089_jr_8015AE2C.o,tail7.data.o,ov_SC03_089_jr_8016AB6C.o,tail8.data.o,ov_SC03_089_jr_801734BC.o,tail9.data.o,ov_SC03_089_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_089_CHECK_SHA := config/check.ov_SC03_089.sha ov_SC03_089_SYMBOLS := config/symbols.ov_SC03_089.txt ov_SC03_089_SIG := .run/sig.ov_SC03_089.jsonl @@ -1143,7 +1143,7 @@ ov_SC03_090_ELF := $(ov_SC03_090_OUT).elf ov_SC03_090_MAPFILE := $(ov_SC03_090_OUT).map ov_SC03_090_LD_SCRIPT := $(ov_SC03_090_OUT).ld ov_SC03_090_SPLAT_YAML := config/splat.ov_SC03_090.yaml -ov_SC03_090_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_090_jr_8012ACE0.o,tail2.data.o,ov_SC03_090_jr_8013FFD8.o,tail3.data.o,ov_SC03_090_jr_8015444C.o,tail4.data.o,ov_SC03_090_jr_8015A3C8.o,tail5.data.o,ov_SC03_090_jr_8015AE2C.o,tail6.data.o,ov_SC03_090_jr_8016AB6C.o,tail7.data.o,ov_SC03_090_jr_801734BC.o,tail8.data.o,ov_SC03_090_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_090_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_090_jr_8012ACE0.o,tail2.data.o,ov_SC03_090_jr_801380E0.o,tail3.data.o,ov_SC03_090_jr_8013FFD8.o,tail4.data.o,ov_SC03_090_jr_8015444C.o,tail5.data.o,ov_SC03_090_jr_8015A3C8.o,tail6.data.o,ov_SC03_090_jr_8015AE2C.o,tail7.data.o,ov_SC03_090_jr_8016AB6C.o,tail8.data.o,ov_SC03_090_jr_801734BC.o,tail9.data.o,ov_SC03_090_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_090_CHECK_SHA := config/check.ov_SC03_090.sha ov_SC03_090_SYMBOLS := config/symbols.ov_SC03_090.txt ov_SC03_090_SIG := .run/sig.ov_SC03_090.jsonl @@ -1165,7 +1165,7 @@ ov_SC03_091_ELF := $(ov_SC03_091_OUT).elf ov_SC03_091_MAPFILE := $(ov_SC03_091_OUT).map ov_SC03_091_LD_SCRIPT := $(ov_SC03_091_OUT).ld ov_SC03_091_SPLAT_YAML := config/splat.ov_SC03_091.yaml -ov_SC03_091_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_091_jr_8012ACE0.o,tail2.data.o,ov_SC03_091_jr_8013FFD8.o,tail3.data.o,ov_SC03_091_jr_8015444C.o,tail4.data.o,ov_SC03_091_jr_8015A3C8.o,tail5.data.o,ov_SC03_091_jr_8015AE2C.o,tail6.data.o,ov_SC03_091_jr_8016AB6C.o,tail7.data.o,ov_SC03_091_jr_801734BC.o,tail8.data.o,ov_SC03_091_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_091_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_091_jr_8012ACE0.o,tail2.data.o,ov_SC03_091_jr_801380E0.o,tail3.data.o,ov_SC03_091_jr_8013FFD8.o,tail4.data.o,ov_SC03_091_jr_8015444C.o,tail5.data.o,ov_SC03_091_jr_8015A3C8.o,tail6.data.o,ov_SC03_091_jr_8015AE2C.o,tail7.data.o,ov_SC03_091_jr_8016AB6C.o,tail8.data.o,ov_SC03_091_jr_801734BC.o,tail9.data.o,ov_SC03_091_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_091_CHECK_SHA := config/check.ov_SC03_091.sha ov_SC03_091_SYMBOLS := config/symbols.ov_SC03_091.txt ov_SC03_091_SIG := .run/sig.ov_SC03_091.jsonl @@ -1187,7 +1187,7 @@ ov_SC03_092_ELF := $(ov_SC03_092_OUT).elf ov_SC03_092_MAPFILE := $(ov_SC03_092_OUT).map ov_SC03_092_LD_SCRIPT := $(ov_SC03_092_OUT).ld ov_SC03_092_SPLAT_YAML := config/splat.ov_SC03_092.yaml -ov_SC03_092_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_092_jr_8012ACE0.o,tail2.data.o,ov_SC03_092_jr_8013FFD8.o,tail3.data.o,ov_SC03_092_jr_8015444C.o,tail4.data.o,ov_SC03_092_jr_8015A3C8.o,tail5.data.o,ov_SC03_092_jr_8015AE2C.o,tail6.data.o,ov_SC03_092_jr_8016AB6C.o,tail7.data.o,ov_SC03_092_jr_801734BC.o,tail8.data.o,ov_SC03_092_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_092_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_092_jr_8012ACE0.o,tail2.data.o,ov_SC03_092_jr_801380E0.o,tail3.data.o,ov_SC03_092_jr_8013FFD8.o,tail4.data.o,ov_SC03_092_jr_8015444C.o,tail5.data.o,ov_SC03_092_jr_8015A3C8.o,tail6.data.o,ov_SC03_092_jr_8015AE2C.o,tail7.data.o,ov_SC03_092_jr_8016AB6C.o,tail8.data.o,ov_SC03_092_jr_801734BC.o,tail9.data.o,ov_SC03_092_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_092_CHECK_SHA := config/check.ov_SC03_092.sha ov_SC03_092_SYMBOLS := config/symbols.ov_SC03_092.txt ov_SC03_092_SIG := .run/sig.ov_SC03_092.jsonl @@ -1209,7 +1209,7 @@ ov_SC03_093_ELF := $(ov_SC03_093_OUT).elf ov_SC03_093_MAPFILE := $(ov_SC03_093_OUT).map ov_SC03_093_LD_SCRIPT := $(ov_SC03_093_OUT).ld ov_SC03_093_SPLAT_YAML := config/splat.ov_SC03_093.yaml -ov_SC03_093_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_093_jr_8012ACE0.o,tail2.data.o,ov_SC03_093_jr_8013FFD8.o,tail3.data.o,ov_SC03_093_jr_8015444C.o,tail4.data.o,ov_SC03_093_jr_8015A3C8.o,tail5.data.o,ov_SC03_093_jr_8015AE2C.o,tail6.data.o,ov_SC03_093_jr_8016AB6C.o,tail7.data.o,ov_SC03_093_jr_801734BC.o,tail8.data.o,ov_SC03_093_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_093_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_093_jr_8012ACE0.o,tail2.data.o,ov_SC03_093_jr_801380E0.o,tail3.data.o,ov_SC03_093_jr_8013FFD8.o,tail4.data.o,ov_SC03_093_jr_8015444C.o,tail5.data.o,ov_SC03_093_jr_8015A3C8.o,tail6.data.o,ov_SC03_093_jr_8015AE2C.o,tail7.data.o,ov_SC03_093_jr_8016AB6C.o,tail8.data.o,ov_SC03_093_jr_801734BC.o,tail9.data.o,ov_SC03_093_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_093_CHECK_SHA := config/check.ov_SC03_093.sha ov_SC03_093_SYMBOLS := config/symbols.ov_SC03_093.txt ov_SC03_093_SIG := .run/sig.ov_SC03_093.jsonl @@ -1231,7 +1231,7 @@ ov_SC03_094_ELF := $(ov_SC03_094_OUT).elf ov_SC03_094_MAPFILE := $(ov_SC03_094_OUT).map ov_SC03_094_LD_SCRIPT := $(ov_SC03_094_OUT).ld ov_SC03_094_SPLAT_YAML := config/splat.ov_SC03_094.yaml -ov_SC03_094_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_094_jr_8012ACE0.o,tail2.data.o,ov_SC03_094_jr_8013FFD8.o,tail3.data.o,ov_SC03_094_jr_8015444C.o,tail4.data.o,ov_SC03_094_jr_8015A3C8.o,tail5.data.o,ov_SC03_094_jr_8015AE2C.o,tail6.data.o,ov_SC03_094_jr_8016AB6C.o,tail7.data.o,ov_SC03_094_jr_801734BC.o,tail8.data.o,ov_SC03_094_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_094_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_094_jr_8012ACE0.o,tail2.data.o,ov_SC03_094_jr_801380E0.o,tail3.data.o,ov_SC03_094_jr_8013FFD8.o,tail4.data.o,ov_SC03_094_jr_8015444C.o,tail5.data.o,ov_SC03_094_jr_8015A3C8.o,tail6.data.o,ov_SC03_094_jr_8015AE2C.o,tail7.data.o,ov_SC03_094_jr_8016AB6C.o,tail8.data.o,ov_SC03_094_jr_801734BC.o,tail9.data.o,ov_SC03_094_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_094_CHECK_SHA := config/check.ov_SC03_094.sha ov_SC03_094_SYMBOLS := config/symbols.ov_SC03_094.txt ov_SC03_094_SIG := .run/sig.ov_SC03_094.jsonl @@ -1253,7 +1253,7 @@ ov_SC03_095_ELF := $(ov_SC03_095_OUT).elf ov_SC03_095_MAPFILE := $(ov_SC03_095_OUT).map ov_SC03_095_LD_SCRIPT := $(ov_SC03_095_OUT).ld ov_SC03_095_SPLAT_YAML := config/splat.ov_SC03_095.yaml -ov_SC03_095_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_095_jr_8012ACE0.o,tail2.data.o,ov_SC03_095_jr_8013FFD8.o,tail3.data.o,ov_SC03_095_jr_8015444C.o,tail4.data.o,ov_SC03_095_jr_8015A3C8.o,tail5.data.o,ov_SC03_095_jr_8015AE2C.o,tail6.data.o,ov_SC03_095_jr_8016AB6C.o,tail7.data.o,ov_SC03_095_jr_801734BC.o,tail8.data.o,ov_SC03_095_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_095_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_095_jr_8012ACE0.o,tail2.data.o,ov_SC03_095_jr_801380E0.o,tail3.data.o,ov_SC03_095_jr_8013FFD8.o,tail4.data.o,ov_SC03_095_jr_8015444C.o,tail5.data.o,ov_SC03_095_jr_8015A3C8.o,tail6.data.o,ov_SC03_095_jr_8015AE2C.o,tail7.data.o,ov_SC03_095_jr_8016AB6C.o,tail8.data.o,ov_SC03_095_jr_801734BC.o,tail9.data.o,ov_SC03_095_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_095_CHECK_SHA := config/check.ov_SC03_095.sha ov_SC03_095_SYMBOLS := config/symbols.ov_SC03_095.txt ov_SC03_095_SIG := .run/sig.ov_SC03_095.jsonl @@ -1275,7 +1275,7 @@ ov_SC03_096_ELF := $(ov_SC03_096_OUT).elf ov_SC03_096_MAPFILE := $(ov_SC03_096_OUT).map ov_SC03_096_LD_SCRIPT := $(ov_SC03_096_OUT).ld ov_SC03_096_SPLAT_YAML := config/splat.ov_SC03_096.yaml -ov_SC03_096_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_096_jr_8012ACE0.o,tail2.data.o,ov_SC03_096_jr_8013FFD8.o,tail3.data.o,ov_SC03_096_jr_8015444C.o,tail4.data.o,ov_SC03_096_jr_8015A3C8.o,tail5.data.o,ov_SC03_096_jr_8015AE2C.o,tail6.data.o,ov_SC03_096_jr_8016AB6C.o,tail7.data.o,ov_SC03_096_jr_801734BC.o,tail8.data.o,ov_SC03_096_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_096_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_096_jr_8012ACE0.o,tail2.data.o,ov_SC03_096_jr_801380E0.o,tail3.data.o,ov_SC03_096_jr_8013FFD8.o,tail4.data.o,ov_SC03_096_jr_8015444C.o,tail5.data.o,ov_SC03_096_jr_8015A3C8.o,tail6.data.o,ov_SC03_096_jr_8015AE2C.o,tail7.data.o,ov_SC03_096_jr_8016AB6C.o,tail8.data.o,ov_SC03_096_jr_801734BC.o,tail9.data.o,ov_SC03_096_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_096_CHECK_SHA := config/check.ov_SC03_096.sha ov_SC03_096_SYMBOLS := config/symbols.ov_SC03_096.txt ov_SC03_096_SIG := .run/sig.ov_SC03_096.jsonl @@ -1297,7 +1297,7 @@ ov_SC03_097_ELF := $(ov_SC03_097_OUT).elf ov_SC03_097_MAPFILE := $(ov_SC03_097_OUT).map ov_SC03_097_LD_SCRIPT := $(ov_SC03_097_OUT).ld ov_SC03_097_SPLAT_YAML := config/splat.ov_SC03_097.yaml -ov_SC03_097_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_097_jr_8012ACE0.o,tail2.data.o,ov_SC03_097_jr_8013FFD8.o,tail3.data.o,ov_SC03_097_jr_8015444C.o,tail4.data.o,ov_SC03_097_jr_8015A3C8.o,tail5.data.o,ov_SC03_097_jr_8015AE2C.o,tail6.data.o,ov_SC03_097_jr_8016AB6C.o,tail7.data.o,ov_SC03_097_jr_801734BC.o,tail8.data.o,ov_SC03_097_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_097_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_097_jr_8012ACE0.o,tail2.data.o,ov_SC03_097_jr_801380E0.o,tail3.data.o,ov_SC03_097_jr_8013FFD8.o,tail4.data.o,ov_SC03_097_jr_8015444C.o,tail5.data.o,ov_SC03_097_jr_8015A3C8.o,tail6.data.o,ov_SC03_097_jr_8015AE2C.o,tail7.data.o,ov_SC03_097_jr_8016AB6C.o,tail8.data.o,ov_SC03_097_jr_801734BC.o,tail9.data.o,ov_SC03_097_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_097_CHECK_SHA := config/check.ov_SC03_097.sha ov_SC03_097_SYMBOLS := config/symbols.ov_SC03_097.txt ov_SC03_097_SIG := .run/sig.ov_SC03_097.jsonl @@ -1319,7 +1319,7 @@ ov_SC03_098_ELF := $(ov_SC03_098_OUT).elf ov_SC03_098_MAPFILE := $(ov_SC03_098_OUT).map ov_SC03_098_LD_SCRIPT := $(ov_SC03_098_OUT).ld ov_SC03_098_SPLAT_YAML := config/splat.ov_SC03_098.yaml -ov_SC03_098_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_098_jr_8012ACE0.o,tail2.data.o,ov_SC03_098_jr_8013FFD8.o,tail3.data.o,ov_SC03_098_jr_8015444C.o,tail4.data.o,ov_SC03_098_jr_8015A3C8.o,tail5.data.o,ov_SC03_098_jr_8015AE2C.o,tail6.data.o,ov_SC03_098_jr_8016AB6C.o,tail7.data.o,ov_SC03_098_jr_801734BC.o,tail8.data.o,ov_SC03_098_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_098_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_098_jr_8012ACE0.o,tail2.data.o,ov_SC03_098_jr_801380E0.o,tail3.data.o,ov_SC03_098_jr_8013FFD8.o,tail4.data.o,ov_SC03_098_jr_8015444C.o,tail5.data.o,ov_SC03_098_jr_8015A3C8.o,tail6.data.o,ov_SC03_098_jr_8015AE2C.o,tail7.data.o,ov_SC03_098_jr_8016AB6C.o,tail8.data.o,ov_SC03_098_jr_801734BC.o,tail9.data.o,ov_SC03_098_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_098_CHECK_SHA := config/check.ov_SC03_098.sha ov_SC03_098_SYMBOLS := config/symbols.ov_SC03_098.txt ov_SC03_098_SIG := .run/sig.ov_SC03_098.jsonl @@ -1341,7 +1341,7 @@ ov_SC03_099_ELF := $(ov_SC03_099_OUT).elf ov_SC03_099_MAPFILE := $(ov_SC03_099_OUT).map ov_SC03_099_LD_SCRIPT := $(ov_SC03_099_OUT).ld ov_SC03_099_SPLAT_YAML := config/splat.ov_SC03_099.yaml -ov_SC03_099_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_099_jr_8012ACE0.o,tail2.data.o,ov_SC03_099_jr_8013FFD8.o,tail3.data.o,ov_SC03_099_jr_8015444C.o,tail4.data.o,ov_SC03_099_jr_8015A3C8.o,tail5.data.o,ov_SC03_099_jr_8015AE2C.o,tail6.data.o,ov_SC03_099_jr_8016AB6C.o,tail7.data.o,ov_SC03_099_jr_801734BC.o,tail8.data.o,ov_SC03_099_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_099_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_099_jr_8012ACE0.o,tail2.data.o,ov_SC03_099_jr_801380E0.o,tail3.data.o,ov_SC03_099_jr_8013FFD8.o,tail4.data.o,ov_SC03_099_jr_8015444C.o,tail5.data.o,ov_SC03_099_jr_8015A3C8.o,tail6.data.o,ov_SC03_099_jr_8015AE2C.o,tail7.data.o,ov_SC03_099_jr_8016AB6C.o,tail8.data.o,ov_SC03_099_jr_801734BC.o,tail9.data.o,ov_SC03_099_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_099_CHECK_SHA := config/check.ov_SC03_099.sha ov_SC03_099_SYMBOLS := config/symbols.ov_SC03_099.txt ov_SC03_099_SIG := .run/sig.ov_SC03_099.jsonl @@ -1363,7 +1363,7 @@ ov_SC03_100_ELF := $(ov_SC03_100_OUT).elf ov_SC03_100_MAPFILE := $(ov_SC03_100_OUT).map ov_SC03_100_LD_SCRIPT := $(ov_SC03_100_OUT).ld ov_SC03_100_SPLAT_YAML := config/splat.ov_SC03_100.yaml -ov_SC03_100_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_100_jr_8012ACE0.o,tail2.data.o,ov_SC03_100_jr_8013FFD8.o,tail3.data.o,ov_SC03_100_jr_8015444C.o,tail4.data.o,ov_SC03_100_jr_8015A3C8.o,tail5.data.o,ov_SC03_100_jr_8015AE2C.o,tail6.data.o,ov_SC03_100_jr_8016AB6C.o,tail7.data.o,ov_SC03_100_jr_801734BC.o,tail8.data.o,ov_SC03_100_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_100_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_100_jr_8012ACE0.o,tail2.data.o,ov_SC03_100_jr_801380E0.o,tail3.data.o,ov_SC03_100_jr_8013FFD8.o,tail4.data.o,ov_SC03_100_jr_8015444C.o,tail5.data.o,ov_SC03_100_jr_8015A3C8.o,tail6.data.o,ov_SC03_100_jr_8015AE2C.o,tail7.data.o,ov_SC03_100_jr_8016AB6C.o,tail8.data.o,ov_SC03_100_jr_801734BC.o,tail9.data.o,ov_SC03_100_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_100_CHECK_SHA := config/check.ov_SC03_100.sha ov_SC03_100_SYMBOLS := config/symbols.ov_SC03_100.txt ov_SC03_100_SIG := .run/sig.ov_SC03_100.jsonl @@ -1385,7 +1385,7 @@ ov_SC03_101_ELF := $(ov_SC03_101_OUT).elf ov_SC03_101_MAPFILE := $(ov_SC03_101_OUT).map ov_SC03_101_LD_SCRIPT := $(ov_SC03_101_OUT).ld ov_SC03_101_SPLAT_YAML := config/splat.ov_SC03_101.yaml -ov_SC03_101_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_101_jr_8012ACE0.o,tail2.data.o,ov_SC03_101_jr_8013FFD8.o,tail3.data.o,ov_SC03_101_jr_8015444C.o,tail4.data.o,ov_SC03_101_jr_8015A3C8.o,tail5.data.o,ov_SC03_101_jr_8015AE2C.o,tail6.data.o,ov_SC03_101_jr_8016AB6C.o,tail7.data.o,ov_SC03_101_jr_801734BC.o,tail8.data.o,ov_SC03_101_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_101_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_101_jr_8012ACE0.o,tail2.data.o,ov_SC03_101_jr_801380E0.o,tail3.data.o,ov_SC03_101_jr_8013FFD8.o,tail4.data.o,ov_SC03_101_jr_8015444C.o,tail5.data.o,ov_SC03_101_jr_8015A3C8.o,tail6.data.o,ov_SC03_101_jr_8015AE2C.o,tail7.data.o,ov_SC03_101_jr_8016AB6C.o,tail8.data.o,ov_SC03_101_jr_801734BC.o,tail9.data.o,ov_SC03_101_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_101_CHECK_SHA := config/check.ov_SC03_101.sha ov_SC03_101_SYMBOLS := config/symbols.ov_SC03_101.txt ov_SC03_101_SIG := .run/sig.ov_SC03_101.jsonl @@ -1407,7 +1407,7 @@ ov_SC03_102_ELF := $(ov_SC03_102_OUT).elf ov_SC03_102_MAPFILE := $(ov_SC03_102_OUT).map ov_SC03_102_LD_SCRIPT := $(ov_SC03_102_OUT).ld ov_SC03_102_SPLAT_YAML := config/splat.ov_SC03_102.yaml -ov_SC03_102_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_102_jr_8012ACE0.o,tail2.data.o,ov_SC03_102_jr_8013FFD8.o,tail3.data.o,ov_SC03_102_jr_8015444C.o,tail4.data.o,ov_SC03_102_jr_8015A3C8.o,tail5.data.o,ov_SC03_102_jr_8015AE2C.o,tail6.data.o,ov_SC03_102_jr_8016AB6C.o,tail7.data.o,ov_SC03_102_jr_801734BC.o,tail8.data.o,ov_SC03_102_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_102_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_102_jr_8012ACE0.o,tail2.data.o,ov_SC03_102_jr_801380E0.o,tail3.data.o,ov_SC03_102_jr_8013FFD8.o,tail4.data.o,ov_SC03_102_jr_8015444C.o,tail5.data.o,ov_SC03_102_jr_8015A3C8.o,tail6.data.o,ov_SC03_102_jr_8015AE2C.o,tail7.data.o,ov_SC03_102_jr_8016AB6C.o,tail8.data.o,ov_SC03_102_jr_801734BC.o,tail9.data.o,ov_SC03_102_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_102_CHECK_SHA := config/check.ov_SC03_102.sha ov_SC03_102_SYMBOLS := config/symbols.ov_SC03_102.txt ov_SC03_102_SIG := .run/sig.ov_SC03_102.jsonl @@ -1429,7 +1429,7 @@ ov_SC03_103_ELF := $(ov_SC03_103_OUT).elf ov_SC03_103_MAPFILE := $(ov_SC03_103_OUT).map ov_SC03_103_LD_SCRIPT := $(ov_SC03_103_OUT).ld ov_SC03_103_SPLAT_YAML := config/splat.ov_SC03_103.yaml -ov_SC03_103_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_103.o,tail2.data.o,ov_SC03_103_jr_8015444C.o,tail3.data.o,ov_SC03_103_jr_8015A3C8.o,tail4.data.o,ov_SC03_103_jr_8015AE2C.o,tail5.data.o,ov_SC03_103_jr_8016AB6C.o,tail6.data.o,ov_SC03_103_jr_801734BC.o,tail7.data.o,ov_SC03_103_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_103_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_103_jr_8012ACE0.o,tail2.data.o,ov_SC03_103_jr_801380E0.o,tail3.data.o,ov_SC03_103_jr_8015444C.o,tail4.data.o,ov_SC03_103_jr_8015A3C8.o,tail5.data.o,ov_SC03_103_jr_8015AE2C.o,tail6.data.o,ov_SC03_103_jr_8016AB6C.o,tail7.data.o,ov_SC03_103_jr_801734BC.o,tail8.data.o,ov_SC03_103_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_103_CHECK_SHA := config/check.ov_SC03_103.sha ov_SC03_103_SYMBOLS := config/symbols.ov_SC03_103.txt ov_SC03_103_SIG := .run/sig.ov_SC03_103.jsonl @@ -1451,7 +1451,7 @@ ov_SC03_104_ELF := $(ov_SC03_104_OUT).elf ov_SC03_104_MAPFILE := $(ov_SC03_104_OUT).map ov_SC03_104_LD_SCRIPT := $(ov_SC03_104_OUT).ld ov_SC03_104_SPLAT_YAML := config/splat.ov_SC03_104.yaml -ov_SC03_104_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_104_jr_8012ACE0.o,tail2.data.o,ov_SC03_104_jr_8013FFD8.o,tail3.data.o,ov_SC03_104_jr_8015444C.o,tail4.data.o,ov_SC03_104_jr_8015A3C8.o,tail5.data.o,ov_SC03_104_jr_8015AE2C.o,tail6.data.o,ov_SC03_104_jr_8016AB6C.o,tail7.data.o,ov_SC03_104_jr_801734BC.o,tail8.data.o,ov_SC03_104_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_104_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_104_jr_8012ACE0.o,tail2.data.o,ov_SC03_104_jr_801380E0.o,tail3.data.o,ov_SC03_104_jr_8013FFD8.o,tail4.data.o,ov_SC03_104_jr_8015444C.o,tail5.data.o,ov_SC03_104_jr_8015A3C8.o,tail6.data.o,ov_SC03_104_jr_8015AE2C.o,tail7.data.o,ov_SC03_104_jr_8016AB6C.o,tail8.data.o,ov_SC03_104_jr_801734BC.o,tail9.data.o,ov_SC03_104_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_104_CHECK_SHA := config/check.ov_SC03_104.sha ov_SC03_104_SYMBOLS := config/symbols.ov_SC03_104.txt ov_SC03_104_SIG := .run/sig.ov_SC03_104.jsonl @@ -1473,7 +1473,7 @@ ov_SC03_105_ELF := $(ov_SC03_105_OUT).elf ov_SC03_105_MAPFILE := $(ov_SC03_105_OUT).map ov_SC03_105_LD_SCRIPT := $(ov_SC03_105_OUT).ld ov_SC03_105_SPLAT_YAML := config/splat.ov_SC03_105.yaml -ov_SC03_105_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_105_jr_8012ACE0.o,tail2.data.o,ov_SC03_105_jr_8013FFD8.o,tail3.data.o,ov_SC03_105_jr_8015444C.o,tail4.data.o,ov_SC03_105_jr_8015A3C8.o,tail5.data.o,ov_SC03_105_jr_8015AE2C.o,tail6.data.o,ov_SC03_105_jr_8016AB6C.o,tail7.data.o,ov_SC03_105_jr_801734BC.o,tail8.data.o,ov_SC03_105_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_105_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_105_jr_8012ACE0.o,tail2.data.o,ov_SC03_105_jr_801380E0.o,tail3.data.o,ov_SC03_105_jr_8013FFD8.o,tail4.data.o,ov_SC03_105_jr_8015444C.o,tail5.data.o,ov_SC03_105_jr_8015A3C8.o,tail6.data.o,ov_SC03_105_jr_8015AE2C.o,tail7.data.o,ov_SC03_105_jr_8016AB6C.o,tail8.data.o,ov_SC03_105_jr_801734BC.o,tail9.data.o,ov_SC03_105_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_105_CHECK_SHA := config/check.ov_SC03_105.sha ov_SC03_105_SYMBOLS := config/symbols.ov_SC03_105.txt ov_SC03_105_SIG := .run/sig.ov_SC03_105.jsonl @@ -1495,7 +1495,7 @@ ov_SC03_108_ELF := $(ov_SC03_108_OUT).elf ov_SC03_108_MAPFILE := $(ov_SC03_108_OUT).map ov_SC03_108_LD_SCRIPT := $(ov_SC03_108_OUT).ld ov_SC03_108_SPLAT_YAML := config/splat.ov_SC03_108.yaml -ov_SC03_108_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_108_jr_8012ACE0.o,tail2.data.o,ov_SC03_108_jr_8013FFD8.o,tail3.data.o,ov_SC03_108_jr_8015444C.o,tail4.data.o,ov_SC03_108_jr_8015A3C8.o,tail5.data.o,ov_SC03_108_jr_8015AE2C.o,tail6.data.o,ov_SC03_108_jr_8016AB6C.o,tail7.data.o,ov_SC03_108_jr_801734BC.o,tail8.data.o,ov_SC03_108_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_108_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_108_jr_8012ACE0.o,tail2.data.o,ov_SC03_108_jr_801380E0.o,tail3.data.o,ov_SC03_108_jr_8013FFD8.o,tail4.data.o,ov_SC03_108_jr_8015444C.o,tail5.data.o,ov_SC03_108_jr_8015A3C8.o,tail6.data.o,ov_SC03_108_jr_8015AE2C.o,tail7.data.o,ov_SC03_108_jr_8016AB6C.o,tail8.data.o,ov_SC03_108_jr_801734BC.o,tail9.data.o,ov_SC03_108_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_108_CHECK_SHA := config/check.ov_SC03_108.sha ov_SC03_108_SYMBOLS := config/symbols.ov_SC03_108.txt ov_SC03_108_SIG := .run/sig.ov_SC03_108.jsonl @@ -1517,7 +1517,7 @@ ov_SC03_109_ELF := $(ov_SC03_109_OUT).elf ov_SC03_109_MAPFILE := $(ov_SC03_109_OUT).map ov_SC03_109_LD_SCRIPT := $(ov_SC03_109_OUT).ld ov_SC03_109_SPLAT_YAML := config/splat.ov_SC03_109.yaml -ov_SC03_109_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_109_jr_8012ACE0.o,tail2.data.o,ov_SC03_109_jr_8013FFD8.o,tail3.data.o,ov_SC03_109_jr_8015444C.o,tail4.data.o,ov_SC03_109_jr_8015A3C8.o,tail5.data.o,ov_SC03_109_jr_8015AE2C.o,tail6.data.o,ov_SC03_109_jr_8016AB6C.o,tail7.data.o,ov_SC03_109_jr_801734BC.o,tail8.data.o,ov_SC03_109_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_109_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_109_jr_8012ACE0.o,tail2.data.o,ov_SC03_109_jr_801380E0.o,tail3.data.o,ov_SC03_109_jr_8013FFD8.o,tail4.data.o,ov_SC03_109_jr_8015444C.o,tail5.data.o,ov_SC03_109_jr_8015A3C8.o,tail6.data.o,ov_SC03_109_jr_8015AE2C.o,tail7.data.o,ov_SC03_109_jr_8016AB6C.o,tail8.data.o,ov_SC03_109_jr_801734BC.o,tail9.data.o,ov_SC03_109_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_109_CHECK_SHA := config/check.ov_SC03_109.sha ov_SC03_109_SYMBOLS := config/symbols.ov_SC03_109.txt ov_SC03_109_SIG := .run/sig.ov_SC03_109.jsonl @@ -1539,7 +1539,7 @@ ov_SC03_110_ELF := $(ov_SC03_110_OUT).elf ov_SC03_110_MAPFILE := $(ov_SC03_110_OUT).map ov_SC03_110_LD_SCRIPT := $(ov_SC03_110_OUT).ld ov_SC03_110_SPLAT_YAML := config/splat.ov_SC03_110.yaml -ov_SC03_110_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_110_jr_8012ACE0.o,tail2.data.o,ov_SC03_110_jr_8013FFD8.o,tail3.data.o,ov_SC03_110_jr_8015444C.o,tail4.data.o,ov_SC03_110_jr_8015A3C8.o,tail5.data.o,ov_SC03_110_jr_8015AE2C.o,tail6.data.o,ov_SC03_110_jr_8016AB6C.o,tail7.data.o,ov_SC03_110_jr_801734BC.o,tail8.data.o,ov_SC03_110_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_110_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_110_jr_8012ACE0.o,tail2.data.o,ov_SC03_110_jr_801380E0.o,tail3.data.o,ov_SC03_110_jr_8013FFD8.o,tail4.data.o,ov_SC03_110_jr_8015444C.o,tail5.data.o,ov_SC03_110_jr_8015A3C8.o,tail6.data.o,ov_SC03_110_jr_8015AE2C.o,tail7.data.o,ov_SC03_110_jr_8016AB6C.o,tail8.data.o,ov_SC03_110_jr_801734BC.o,tail9.data.o,ov_SC03_110_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_110_CHECK_SHA := config/check.ov_SC03_110.sha ov_SC03_110_SYMBOLS := config/symbols.ov_SC03_110.txt ov_SC03_110_SIG := .run/sig.ov_SC03_110.jsonl @@ -1561,7 +1561,7 @@ ov_SC03_111_ELF := $(ov_SC03_111_OUT).elf ov_SC03_111_MAPFILE := $(ov_SC03_111_OUT).map ov_SC03_111_LD_SCRIPT := $(ov_SC03_111_OUT).ld ov_SC03_111_SPLAT_YAML := config/splat.ov_SC03_111.yaml -ov_SC03_111_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_111_jr_8012ACE0.o,tail2.data.o,ov_SC03_111_jr_8013FFD8.o,tail3.data.o,ov_SC03_111_jr_8015444C.o,tail4.data.o,ov_SC03_111_jr_8015A3C8.o,tail5.data.o,ov_SC03_111_jr_8015AE2C.o,tail6.data.o,ov_SC03_111_jr_8016AB6C.o,tail7.data.o,ov_SC03_111_jr_801734BC.o,tail8.data.o,ov_SC03_111_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_111_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_111_jr_8012ACE0.o,tail2.data.o,ov_SC03_111_jr_801380E0.o,tail3.data.o,ov_SC03_111_jr_8013FFD8.o,tail4.data.o,ov_SC03_111_jr_8015444C.o,tail5.data.o,ov_SC03_111_jr_8015A3C8.o,tail6.data.o,ov_SC03_111_jr_8015AE2C.o,tail7.data.o,ov_SC03_111_jr_8016AB6C.o,tail8.data.o,ov_SC03_111_jr_801734BC.o,tail9.data.o,ov_SC03_111_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_111_CHECK_SHA := config/check.ov_SC03_111.sha ov_SC03_111_SYMBOLS := config/symbols.ov_SC03_111.txt ov_SC03_111_SIG := .run/sig.ov_SC03_111.jsonl @@ -1583,7 +1583,7 @@ ov_SC03_112_ELF := $(ov_SC03_112_OUT).elf ov_SC03_112_MAPFILE := $(ov_SC03_112_OUT).map ov_SC03_112_LD_SCRIPT := $(ov_SC03_112_OUT).ld ov_SC03_112_SPLAT_YAML := config/splat.ov_SC03_112.yaml -ov_SC03_112_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_112_jr_8012ACE0.o,tail2.data.o,ov_SC03_112_jr_8013FFD8.o,tail3.data.o,ov_SC03_112_jr_8015444C.o,tail4.data.o,ov_SC03_112_jr_8015A3C8.o,tail5.data.o,ov_SC03_112_jr_8015AE2C.o,tail6.data.o,ov_SC03_112_jr_8016AB6C.o,tail7.data.o,ov_SC03_112_jr_801734BC.o,tail8.data.o,ov_SC03_112_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_112_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_112_jr_8012ACE0.o,tail2.data.o,ov_SC03_112_jr_801380E0.o,tail3.data.o,ov_SC03_112_jr_8013FFD8.o,tail4.data.o,ov_SC03_112_jr_8015444C.o,tail5.data.o,ov_SC03_112_jr_8015A3C8.o,tail6.data.o,ov_SC03_112_jr_8015AE2C.o,tail7.data.o,ov_SC03_112_jr_8016AB6C.o,tail8.data.o,ov_SC03_112_jr_801734BC.o,tail9.data.o,ov_SC03_112_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_112_CHECK_SHA := config/check.ov_SC03_112.sha ov_SC03_112_SYMBOLS := config/symbols.ov_SC03_112.txt ov_SC03_112_SIG := .run/sig.ov_SC03_112.jsonl @@ -1605,7 +1605,7 @@ ov_SC03_113_ELF := $(ov_SC03_113_OUT).elf ov_SC03_113_MAPFILE := $(ov_SC03_113_OUT).map ov_SC03_113_LD_SCRIPT := $(ov_SC03_113_OUT).ld ov_SC03_113_SPLAT_YAML := config/splat.ov_SC03_113.yaml -ov_SC03_113_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_113_jr_8012ACE0.o,tail2.data.o,ov_SC03_113_jr_8013FFD8.o,tail3.data.o,ov_SC03_113_jr_8015444C.o,tail4.data.o,ov_SC03_113_jr_8015A3C8.o,tail5.data.o,ov_SC03_113_jr_8015AE2C.o,tail6.data.o,ov_SC03_113_jr_8016AB6C.o,tail7.data.o,ov_SC03_113_jr_801734BC.o,tail8.data.o,ov_SC03_113_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_113_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_113_jr_8012ACE0.o,tail2.data.o,ov_SC03_113_jr_801380E0.o,tail3.data.o,ov_SC03_113_jr_8013FFD8.o,tail4.data.o,ov_SC03_113_jr_8015444C.o,tail5.data.o,ov_SC03_113_jr_8015A3C8.o,tail6.data.o,ov_SC03_113_jr_8015AE2C.o,tail7.data.o,ov_SC03_113_jr_8016AB6C.o,tail8.data.o,ov_SC03_113_jr_801734BC.o,tail9.data.o,ov_SC03_113_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_113_CHECK_SHA := config/check.ov_SC03_113.sha ov_SC03_113_SYMBOLS := config/symbols.ov_SC03_113.txt ov_SC03_113_SIG := .run/sig.ov_SC03_113.jsonl @@ -1627,7 +1627,7 @@ ov_SC03_114_ELF := $(ov_SC03_114_OUT).elf ov_SC03_114_MAPFILE := $(ov_SC03_114_OUT).map ov_SC03_114_LD_SCRIPT := $(ov_SC03_114_OUT).ld ov_SC03_114_SPLAT_YAML := config/splat.ov_SC03_114.yaml -ov_SC03_114_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_114_jr_8012ACE0.o,tail2.data.o,ov_SC03_114_jr_8013FFD8.o,tail3.data.o,ov_SC03_114_jr_8015444C.o,tail4.data.o,ov_SC03_114_jr_8015A3C8.o,tail5.data.o,ov_SC03_114_jr_8015AE2C.o,tail6.data.o,ov_SC03_114_jr_8016AB6C.o,tail7.data.o,ov_SC03_114_jr_801734BC.o,tail8.data.o,ov_SC03_114_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_114_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_114_jr_8012ACE0.o,tail2.data.o,ov_SC03_114_jr_801380E0.o,tail3.data.o,ov_SC03_114_jr_8013FFD8.o,tail4.data.o,ov_SC03_114_jr_8015444C.o,tail5.data.o,ov_SC03_114_jr_8015A3C8.o,tail6.data.o,ov_SC03_114_jr_8015AE2C.o,tail7.data.o,ov_SC03_114_jr_8016AB6C.o,tail8.data.o,ov_SC03_114_jr_801734BC.o,tail9.data.o,ov_SC03_114_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_114_CHECK_SHA := config/check.ov_SC03_114.sha ov_SC03_114_SYMBOLS := config/symbols.ov_SC03_114.txt ov_SC03_114_SIG := .run/sig.ov_SC03_114.jsonl @@ -1649,7 +1649,7 @@ ov_SC03_115_ELF := $(ov_SC03_115_OUT).elf ov_SC03_115_MAPFILE := $(ov_SC03_115_OUT).map ov_SC03_115_LD_SCRIPT := $(ov_SC03_115_OUT).ld ov_SC03_115_SPLAT_YAML := config/splat.ov_SC03_115.yaml -ov_SC03_115_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_115_jr_8012ACE0.o,tail2.data.o,ov_SC03_115_jr_8013FFD8.o,tail3.data.o,ov_SC03_115_jr_8015444C.o,tail4.data.o,ov_SC03_115_jr_8015A3C8.o,tail5.data.o,ov_SC03_115_jr_8015AE2C.o,tail6.data.o,ov_SC03_115_jr_8016AB6C.o,tail7.data.o,ov_SC03_115_jr_801734BC.o,tail8.data.o,ov_SC03_115_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_115_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_115_jr_8012ACE0.o,tail2.data.o,ov_SC03_115_jr_801380E0.o,tail3.data.o,ov_SC03_115_jr_8013FFD8.o,tail4.data.o,ov_SC03_115_jr_8015444C.o,tail5.data.o,ov_SC03_115_jr_8015A3C8.o,tail6.data.o,ov_SC03_115_jr_8015AE2C.o,tail7.data.o,ov_SC03_115_jr_8016AB6C.o,tail8.data.o,ov_SC03_115_jr_801734BC.o,tail9.data.o,ov_SC03_115_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_115_CHECK_SHA := config/check.ov_SC03_115.sha ov_SC03_115_SYMBOLS := config/symbols.ov_SC03_115.txt ov_SC03_115_SIG := .run/sig.ov_SC03_115.jsonl @@ -1671,7 +1671,7 @@ ov_SC03_116_ELF := $(ov_SC03_116_OUT).elf ov_SC03_116_MAPFILE := $(ov_SC03_116_OUT).map ov_SC03_116_LD_SCRIPT := $(ov_SC03_116_OUT).ld ov_SC03_116_SPLAT_YAML := config/splat.ov_SC03_116.yaml -ov_SC03_116_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_116_jr_8012ACE0.o,tail2.data.o,ov_SC03_116_jr_8013FFD8.o,tail3.data.o,ov_SC03_116_jr_8015444C.o,tail4.data.o,ov_SC03_116_jr_8015A3C8.o,tail5.data.o,ov_SC03_116_jr_8015AE2C.o,tail6.data.o,ov_SC03_116_jr_8016AB6C.o,tail7.data.o,ov_SC03_116_jr_801734BC.o,tail8.data.o,ov_SC03_116_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_116_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_116_jr_8012ACE0.o,tail2.data.o,ov_SC03_116_jr_801380E0.o,tail3.data.o,ov_SC03_116_jr_8013FFD8.o,tail4.data.o,ov_SC03_116_jr_8015444C.o,tail5.data.o,ov_SC03_116_jr_8015A3C8.o,tail6.data.o,ov_SC03_116_jr_8015AE2C.o,tail7.data.o,ov_SC03_116_jr_8016AB6C.o,tail8.data.o,ov_SC03_116_jr_801734BC.o,tail9.data.o,ov_SC03_116_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_116_CHECK_SHA := config/check.ov_SC03_116.sha ov_SC03_116_SYMBOLS := config/symbols.ov_SC03_116.txt ov_SC03_116_SIG := .run/sig.ov_SC03_116.jsonl @@ -1693,7 +1693,7 @@ ov_SC03_117_ELF := $(ov_SC03_117_OUT).elf ov_SC03_117_MAPFILE := $(ov_SC03_117_OUT).map ov_SC03_117_LD_SCRIPT := $(ov_SC03_117_OUT).ld ov_SC03_117_SPLAT_YAML := config/splat.ov_SC03_117.yaml -ov_SC03_117_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_117_jr_8012ACE0.o,tail2.data.o,ov_SC03_117_jr_8013FFD8.o,tail3.data.o,ov_SC03_117_jr_8015444C.o,tail4.data.o,ov_SC03_117_jr_8015A3C8.o,tail5.data.o,ov_SC03_117_jr_8015AE2C.o,tail6.data.o,ov_SC03_117_jr_8016AB6C.o,tail7.data.o,ov_SC03_117_jr_801734BC.o,tail8.data.o,ov_SC03_117_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_117_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_117_jr_8012ACE0.o,tail2.data.o,ov_SC03_117_jr_801380E0.o,tail3.data.o,ov_SC03_117_jr_8013FFD8.o,tail4.data.o,ov_SC03_117_jr_8015444C.o,tail5.data.o,ov_SC03_117_jr_8015A3C8.o,tail6.data.o,ov_SC03_117_jr_8015AE2C.o,tail7.data.o,ov_SC03_117_jr_8016AB6C.o,tail8.data.o,ov_SC03_117_jr_801734BC.o,tail9.data.o,ov_SC03_117_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_117_CHECK_SHA := config/check.ov_SC03_117.sha ov_SC03_117_SYMBOLS := config/symbols.ov_SC03_117.txt ov_SC03_117_SIG := .run/sig.ov_SC03_117.jsonl @@ -1715,7 +1715,7 @@ ov_SC03_118_ELF := $(ov_SC03_118_OUT).elf ov_SC03_118_MAPFILE := $(ov_SC03_118_OUT).map ov_SC03_118_LD_SCRIPT := $(ov_SC03_118_OUT).ld ov_SC03_118_SPLAT_YAML := config/splat.ov_SC03_118.yaml -ov_SC03_118_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_118_jr_8012ACE0.o,tail2.data.o,ov_SC03_118_jr_8013FFD8.o,tail3.data.o,ov_SC03_118_jr_8015444C.o,tail4.data.o,ov_SC03_118_jr_8015A3C8.o,tail5.data.o,ov_SC03_118_jr_8015AE2C.o,tail6.data.o,ov_SC03_118_jr_8016AB6C.o,tail7.data.o,ov_SC03_118_jr_801734BC.o,tail8.data.o,ov_SC03_118_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_118_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_118_jr_8012ACE0.o,tail2.data.o,ov_SC03_118_jr_801380E0.o,tail3.data.o,ov_SC03_118_jr_8013FFD8.o,tail4.data.o,ov_SC03_118_jr_8015444C.o,tail5.data.o,ov_SC03_118_jr_8015A3C8.o,tail6.data.o,ov_SC03_118_jr_8015AE2C.o,tail7.data.o,ov_SC03_118_jr_8016AB6C.o,tail8.data.o,ov_SC03_118_jr_801734BC.o,tail9.data.o,ov_SC03_118_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_118_CHECK_SHA := config/check.ov_SC03_118.sha ov_SC03_118_SYMBOLS := config/symbols.ov_SC03_118.txt ov_SC03_118_SIG := .run/sig.ov_SC03_118.jsonl @@ -1737,7 +1737,7 @@ ov_SC03_119_ELF := $(ov_SC03_119_OUT).elf ov_SC03_119_MAPFILE := $(ov_SC03_119_OUT).map ov_SC03_119_LD_SCRIPT := $(ov_SC03_119_OUT).ld ov_SC03_119_SPLAT_YAML := config/splat.ov_SC03_119.yaml -ov_SC03_119_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_119_jr_8012ACE0.o,tail2.data.o,ov_SC03_119_jr_8013FFD8.o,tail3.data.o,ov_SC03_119_jr_8015444C.o,tail4.data.o,ov_SC03_119_jr_8015A3C8.o,tail5.data.o,ov_SC03_119_jr_8015AE2C.o,tail6.data.o,ov_SC03_119_jr_8016AB6C.o,tail7.data.o,ov_SC03_119_jr_801734BC.o,tail8.data.o,ov_SC03_119_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_119_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_119_jr_8012ACE0.o,tail2.data.o,ov_SC03_119_jr_801380E0.o,tail3.data.o,ov_SC03_119_jr_8013FFD8.o,tail4.data.o,ov_SC03_119_jr_8015444C.o,tail5.data.o,ov_SC03_119_jr_8015A3C8.o,tail6.data.o,ov_SC03_119_jr_8015AE2C.o,tail7.data.o,ov_SC03_119_jr_8016AB6C.o,tail8.data.o,ov_SC03_119_jr_801734BC.o,tail9.data.o,ov_SC03_119_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_119_CHECK_SHA := config/check.ov_SC03_119.sha ov_SC03_119_SYMBOLS := config/symbols.ov_SC03_119.txt ov_SC03_119_SIG := .run/sig.ov_SC03_119.jsonl @@ -1759,7 +1759,7 @@ ov_SC03_121_ELF := $(ov_SC03_121_OUT).elf ov_SC03_121_MAPFILE := $(ov_SC03_121_OUT).map ov_SC03_121_LD_SCRIPT := $(ov_SC03_121_OUT).ld ov_SC03_121_SPLAT_YAML := config/splat.ov_SC03_121.yaml -ov_SC03_121_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_121_jr_8012ACE0.o,tail2.data.o,ov_SC03_121_jr_8013FFD8.o,tail3.data.o,ov_SC03_121_jr_8015444C.o,tail4.data.o,ov_SC03_121_jr_8015A3C8.o,tail5.data.o,ov_SC03_121_jr_8015AE2C.o,tail6.data.o,ov_SC03_121_jr_8016AB6C.o,tail7.data.o,ov_SC03_121_jr_801734BC.o,tail8.data.o,ov_SC03_121_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_121_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_121_jr_8012ACE0.o,tail2.data.o,ov_SC03_121_jr_801380E0.o,tail3.data.o,ov_SC03_121_jr_8013FFD8.o,tail4.data.o,ov_SC03_121_jr_8015444C.o,tail5.data.o,ov_SC03_121_jr_8015A3C8.o,tail6.data.o,ov_SC03_121_jr_8015AE2C.o,tail7.data.o,ov_SC03_121_jr_8016AB6C.o,tail8.data.o,ov_SC03_121_jr_801734BC.o,tail9.data.o,ov_SC03_121_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_121_CHECK_SHA := config/check.ov_SC03_121.sha ov_SC03_121_SYMBOLS := config/symbols.ov_SC03_121.txt ov_SC03_121_SIG := .run/sig.ov_SC03_121.jsonl @@ -1781,7 +1781,7 @@ ov_SC03_124_ELF := $(ov_SC03_124_OUT).elf ov_SC03_124_MAPFILE := $(ov_SC03_124_OUT).map ov_SC03_124_LD_SCRIPT := $(ov_SC03_124_OUT).ld ov_SC03_124_SPLAT_YAML := config/splat.ov_SC03_124.yaml -ov_SC03_124_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_124_jr_8012ACE0.o,tail2.data.o,ov_SC03_124_jr_8013FFD8.o,tail3.data.o,ov_SC03_124_jr_8015444C.o,tail4.data.o,ov_SC03_124_jr_8015A3C8.o,tail5.data.o,ov_SC03_124_jr_8015AE2C.o,tail6.data.o,ov_SC03_124_jr_8016AB6C.o,tail7.data.o,ov_SC03_124_jr_801734BC.o,tail8.data.o,ov_SC03_124_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_124_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_124_jr_8012ACE0.o,tail2.data.o,ov_SC03_124_jr_801380E0.o,tail3.data.o,ov_SC03_124_jr_8013FFD8.o,tail4.data.o,ov_SC03_124_jr_8015444C.o,tail5.data.o,ov_SC03_124_jr_8015A3C8.o,tail6.data.o,ov_SC03_124_jr_8015AE2C.o,tail7.data.o,ov_SC03_124_jr_8016AB6C.o,tail8.data.o,ov_SC03_124_jr_801734BC.o,tail9.data.o,ov_SC03_124_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_124_CHECK_SHA := config/check.ov_SC03_124.sha ov_SC03_124_SYMBOLS := config/symbols.ov_SC03_124.txt ov_SC03_124_SIG := .run/sig.ov_SC03_124.jsonl @@ -1803,7 +1803,7 @@ ov_SC03_125_ELF := $(ov_SC03_125_OUT).elf ov_SC03_125_MAPFILE := $(ov_SC03_125_OUT).map ov_SC03_125_LD_SCRIPT := $(ov_SC03_125_OUT).ld ov_SC03_125_SPLAT_YAML := config/splat.ov_SC03_125.yaml -ov_SC03_125_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_125_jr_8012ACE0.o,tail2.data.o,ov_SC03_125_jr_8013FFD8.o,tail3.data.o,ov_SC03_125_jr_8015444C.o,tail4.data.o,ov_SC03_125_jr_8015A3C8.o,tail5.data.o,ov_SC03_125_jr_8015AE2C.o,tail6.data.o,ov_SC03_125_jr_8016AB6C.o,tail7.data.o,ov_SC03_125_jr_801734BC.o,tail8.data.o,ov_SC03_125_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_125_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_125_jr_8012ACE0.o,tail2.data.o,ov_SC03_125_jr_801380E0.o,tail3.data.o,ov_SC03_125_jr_8013FFD8.o,tail4.data.o,ov_SC03_125_jr_8015444C.o,tail5.data.o,ov_SC03_125_jr_8015A3C8.o,tail6.data.o,ov_SC03_125_jr_8015AE2C.o,tail7.data.o,ov_SC03_125_jr_8016AB6C.o,tail8.data.o,ov_SC03_125_jr_801734BC.o,tail9.data.o,ov_SC03_125_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_125_CHECK_SHA := config/check.ov_SC03_125.sha ov_SC03_125_SYMBOLS := config/symbols.ov_SC03_125.txt ov_SC03_125_SIG := .run/sig.ov_SC03_125.jsonl @@ -1825,7 +1825,7 @@ ov_SC03_126_ELF := $(ov_SC03_126_OUT).elf ov_SC03_126_MAPFILE := $(ov_SC03_126_OUT).map ov_SC03_126_LD_SCRIPT := $(ov_SC03_126_OUT).ld ov_SC03_126_SPLAT_YAML := config/splat.ov_SC03_126.yaml -ov_SC03_126_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_126_jr_8012ACE0.o,tail2.data.o,ov_SC03_126_jr_8013FFD8.o,tail3.data.o,ov_SC03_126_jr_8015444C.o,tail4.data.o,ov_SC03_126_jr_8015A3C8.o,tail5.data.o,ov_SC03_126_jr_8015AE2C.o,tail6.data.o,ov_SC03_126_jr_8016AB6C.o,tail7.data.o,ov_SC03_126_jr_801734BC.o,tail8.data.o,ov_SC03_126_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC03_126_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_126_jr_8012ACE0.o,tail2.data.o,ov_SC03_126_jr_801380E0.o,tail3.data.o,ov_SC03_126_jr_8013FFD8.o,tail4.data.o,ov_SC03_126_jr_8015444C.o,tail5.data.o,ov_SC03_126_jr_8015A3C8.o,tail6.data.o,ov_SC03_126_jr_8015AE2C.o,tail7.data.o,ov_SC03_126_jr_8016AB6C.o,tail8.data.o,ov_SC03_126_jr_801734BC.o,tail9.data.o,ov_SC03_126_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC03_126_CHECK_SHA := config/check.ov_SC03_126.sha ov_SC03_126_SYMBOLS := config/symbols.ov_SC03_126.txt ov_SC03_126_SIG := .run/sig.ov_SC03_126.jsonl @@ -1847,7 +1847,7 @@ ov_SC04_002_ELF := $(ov_SC04_002_OUT).elf ov_SC04_002_MAPFILE := $(ov_SC04_002_OUT).map ov_SC04_002_LD_SCRIPT := $(ov_SC04_002_OUT).ld ov_SC04_002_SPLAT_YAML := config/splat.ov_SC04_002.yaml -ov_SC04_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_002_jr_8012ACE0.o,tail2.data.o,ov_SC04_002_jr_8013FFD8.o,tail3.data.o,ov_SC04_002_jr_8015444C.o,tail4.data.o,ov_SC04_002_jr_8015A3C8.o,tail5.data.o,ov_SC04_002_jr_8015AE2C.o,tail6.data.o,ov_SC04_002_jr_8016AB6C.o,tail7.data.o,ov_SC04_002_jr_801734BC.o,tail8.data.o,ov_SC04_002_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_002_jr_8012ACE0.o,tail2.data.o,ov_SC04_002_jr_801380E0.o,tail3.data.o,ov_SC04_002_jr_8013FFD8.o,tail4.data.o,ov_SC04_002_jr_8015444C.o,tail5.data.o,ov_SC04_002_jr_8015A3C8.o,tail6.data.o,ov_SC04_002_jr_8015AE2C.o,tail7.data.o,ov_SC04_002_jr_8016AB6C.o,tail8.data.o,ov_SC04_002_jr_801734BC.o,tail9.data.o,ov_SC04_002_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_002_CHECK_SHA := config/check.ov_SC04_002.sha ov_SC04_002_SYMBOLS := config/symbols.ov_SC04_002.txt ov_SC04_002_SIG := .run/sig.ov_SC04_002.jsonl @@ -1869,7 +1869,7 @@ ov_SC04_003_ELF := $(ov_SC04_003_OUT).elf ov_SC04_003_MAPFILE := $(ov_SC04_003_OUT).map ov_SC04_003_LD_SCRIPT := $(ov_SC04_003_OUT).ld ov_SC04_003_SPLAT_YAML := config/splat.ov_SC04_003.yaml -ov_SC04_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_003_jr_8012ACE0.o,tail2.data.o,ov_SC04_003_jr_8013FFD8.o,tail3.data.o,ov_SC04_003_jr_8015444C.o,tail4.data.o,ov_SC04_003_jr_8015A3C8.o,tail5.data.o,ov_SC04_003_jr_8015AE2C.o,tail6.data.o,ov_SC04_003_jr_8016AB6C.o,tail7.data.o,ov_SC04_003_jr_801734BC.o,tail8.data.o,ov_SC04_003_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_003_jr_8012ACE0.o,tail2.data.o,ov_SC04_003_jr_801380E0.o,tail3.data.o,ov_SC04_003_jr_8013FFD8.o,tail4.data.o,ov_SC04_003_jr_8015444C.o,tail5.data.o,ov_SC04_003_jr_8015A3C8.o,tail6.data.o,ov_SC04_003_jr_8015AE2C.o,tail7.data.o,ov_SC04_003_jr_8016AB6C.o,tail8.data.o,ov_SC04_003_jr_801734BC.o,tail9.data.o,ov_SC04_003_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_003_CHECK_SHA := config/check.ov_SC04_003.sha ov_SC04_003_SYMBOLS := config/symbols.ov_SC04_003.txt ov_SC04_003_SIG := .run/sig.ov_SC04_003.jsonl @@ -1891,7 +1891,7 @@ ov_SC04_004_ELF := $(ov_SC04_004_OUT).elf ov_SC04_004_MAPFILE := $(ov_SC04_004_OUT).map ov_SC04_004_LD_SCRIPT := $(ov_SC04_004_OUT).ld ov_SC04_004_SPLAT_YAML := config/splat.ov_SC04_004.yaml -ov_SC04_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_004_jr_8012ACE0.o,tail2.data.o,ov_SC04_004_jr_8013FFD8.o,tail3.data.o,ov_SC04_004_jr_8015444C.o,tail4.data.o,ov_SC04_004_jr_8015A3C8.o,tail5.data.o,ov_SC04_004_jr_8015AE2C.o,tail6.data.o,ov_SC04_004_jr_8016AB6C.o,tail7.data.o,ov_SC04_004_jr_801734BC.o,tail8.data.o,ov_SC04_004_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_004_jr_8012ACE0.o,tail2.data.o,ov_SC04_004_jr_801380E0.o,tail3.data.o,ov_SC04_004_jr_8013FFD8.o,tail4.data.o,ov_SC04_004_jr_8015444C.o,tail5.data.o,ov_SC04_004_jr_8015A3C8.o,tail6.data.o,ov_SC04_004_jr_8015AE2C.o,tail7.data.o,ov_SC04_004_jr_8016AB6C.o,tail8.data.o,ov_SC04_004_jr_801734BC.o,tail9.data.o,ov_SC04_004_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_004_CHECK_SHA := config/check.ov_SC04_004.sha ov_SC04_004_SYMBOLS := config/symbols.ov_SC04_004.txt ov_SC04_004_SIG := .run/sig.ov_SC04_004.jsonl @@ -1913,7 +1913,7 @@ ov_SC04_005_ELF := $(ov_SC04_005_OUT).elf ov_SC04_005_MAPFILE := $(ov_SC04_005_OUT).map ov_SC04_005_LD_SCRIPT := $(ov_SC04_005_OUT).ld ov_SC04_005_SPLAT_YAML := config/splat.ov_SC04_005.yaml -ov_SC04_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_005_jr_8012ACE0.o,tail2.data.o,ov_SC04_005_jr_8013FFD8.o,tail3.data.o,ov_SC04_005_jr_8015444C.o,tail4.data.o,ov_SC04_005_jr_8015A3C8.o,tail5.data.o,ov_SC04_005_jr_8015AE2C.o,tail6.data.o,ov_SC04_005_jr_8016AB6C.o,tail7.data.o,ov_SC04_005_jr_801734BC.o,tail8.data.o,ov_SC04_005_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_005_jr_8012ACE0.o,tail2.data.o,ov_SC04_005_jr_801380E0.o,tail3.data.o,ov_SC04_005_jr_8013FFD8.o,tail4.data.o,ov_SC04_005_jr_8015444C.o,tail5.data.o,ov_SC04_005_jr_8015A3C8.o,tail6.data.o,ov_SC04_005_jr_8015AE2C.o,tail7.data.o,ov_SC04_005_jr_8016AB6C.o,tail8.data.o,ov_SC04_005_jr_801734BC.o,tail9.data.o,ov_SC04_005_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_005_CHECK_SHA := config/check.ov_SC04_005.sha ov_SC04_005_SYMBOLS := config/symbols.ov_SC04_005.txt ov_SC04_005_SIG := .run/sig.ov_SC04_005.jsonl @@ -1935,7 +1935,7 @@ ov_SC04_006_ELF := $(ov_SC04_006_OUT).elf ov_SC04_006_MAPFILE := $(ov_SC04_006_OUT).map ov_SC04_006_LD_SCRIPT := $(ov_SC04_006_OUT).ld ov_SC04_006_SPLAT_YAML := config/splat.ov_SC04_006.yaml -ov_SC04_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_006_jr_8012ACE0.o,tail2.data.o,ov_SC04_006_jr_8013FFD8.o,tail3.data.o,ov_SC04_006_jr_8015444C.o,tail4.data.o,ov_SC04_006_jr_8015A3C8.o,tail5.data.o,ov_SC04_006_jr_8015AE2C.o,tail6.data.o,ov_SC04_006_jr_8016AB6C.o,tail7.data.o,ov_SC04_006_jr_801734BC.o,tail8.data.o,ov_SC04_006_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_006_jr_8012ACE0.o,tail2.data.o,ov_SC04_006_jr_801380E0.o,tail3.data.o,ov_SC04_006_jr_8013FFD8.o,tail4.data.o,ov_SC04_006_jr_8015444C.o,tail5.data.o,ov_SC04_006_jr_8015A3C8.o,tail6.data.o,ov_SC04_006_jr_8015AE2C.o,tail7.data.o,ov_SC04_006_jr_8016AB6C.o,tail8.data.o,ov_SC04_006_jr_801734BC.o,tail9.data.o,ov_SC04_006_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_006_CHECK_SHA := config/check.ov_SC04_006.sha ov_SC04_006_SYMBOLS := config/symbols.ov_SC04_006.txt ov_SC04_006_SIG := .run/sig.ov_SC04_006.jsonl @@ -1957,7 +1957,7 @@ ov_SC04_007_ELF := $(ov_SC04_007_OUT).elf ov_SC04_007_MAPFILE := $(ov_SC04_007_OUT).map ov_SC04_007_LD_SCRIPT := $(ov_SC04_007_OUT).ld ov_SC04_007_SPLAT_YAML := config/splat.ov_SC04_007.yaml -ov_SC04_007_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_007_jr_8012ACE0.o,tail2.data.o,ov_SC04_007_jr_8013FFD8.o,tail3.data.o,ov_SC04_007_jr_8015444C.o,tail4.data.o,ov_SC04_007_jr_8015A3C8.o,tail5.data.o,ov_SC04_007_jr_8015AE2C.o,tail6.data.o,ov_SC04_007_jr_8016AB6C.o,tail7.data.o,ov_SC04_007_jr_801734BC.o,tail8.data.o,ov_SC04_007_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_007_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_007_jr_8012ACE0.o,tail2.data.o,ov_SC04_007_jr_801380E0.o,tail3.data.o,ov_SC04_007_jr_8013FFD8.o,tail4.data.o,ov_SC04_007_jr_8015444C.o,tail5.data.o,ov_SC04_007_jr_8015A3C8.o,tail6.data.o,ov_SC04_007_jr_8015AE2C.o,tail7.data.o,ov_SC04_007_jr_8016AB6C.o,tail8.data.o,ov_SC04_007_jr_801734BC.o,tail9.data.o,ov_SC04_007_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_007_CHECK_SHA := config/check.ov_SC04_007.sha ov_SC04_007_SYMBOLS := config/symbols.ov_SC04_007.txt ov_SC04_007_SIG := .run/sig.ov_SC04_007.jsonl @@ -1979,7 +1979,7 @@ ov_SC04_008_ELF := $(ov_SC04_008_OUT).elf ov_SC04_008_MAPFILE := $(ov_SC04_008_OUT).map ov_SC04_008_LD_SCRIPT := $(ov_SC04_008_OUT).ld ov_SC04_008_SPLAT_YAML := config/splat.ov_SC04_008.yaml -ov_SC04_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_008_jr_8012ACE0.o,tail2.data.o,ov_SC04_008_jr_8013FFD8.o,tail3.data.o,ov_SC04_008_after.o,tail4.data.o,ov_SC04_008_jr_8015AE2C.o,tail5.data.o,ov_SC04_008_jr_8016AB6C.o,tail6.data.o,ov_SC04_008_jr_801734BC.o,tail7.data.o,ov_SC04_008_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_008_jr_8012ACE0.o,tail2.data.o,ov_SC04_008_jr_801380E0.o,tail3.data.o,ov_SC04_008_jr_8013FFD8.o,tail4.data.o,ov_SC04_008_after.o,tail5.data.o,ov_SC04_008_jr_8015AE2C.o,tail6.data.o,ov_SC04_008_jr_8016AB6C.o,tail7.data.o,ov_SC04_008_jr_801734BC.o,tail8.data.o,ov_SC04_008_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_008_CHECK_SHA := config/check.ov_SC04_008.sha ov_SC04_008_SYMBOLS := config/symbols.ov_SC04_008.txt ov_SC04_008_SIG := .run/sig.ov_SC04_008.jsonl @@ -2001,7 +2001,7 @@ ov_SC04_009_ELF := $(ov_SC04_009_OUT).elf ov_SC04_009_MAPFILE := $(ov_SC04_009_OUT).map ov_SC04_009_LD_SCRIPT := $(ov_SC04_009_OUT).ld ov_SC04_009_SPLAT_YAML := config/splat.ov_SC04_009.yaml -ov_SC04_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_009_jr_8012ACE0.o,tail2.data.o,ov_SC04_009_jr_8013FFD8.o,tail3.data.o,ov_SC04_009_jr_8015444C.o,tail4.data.o,ov_SC04_009_jr_8015A3C8.o,tail5.data.o,ov_SC04_009_jr_8015AE2C.o,tail6.data.o,ov_SC04_009_jr_8016AB6C.o,tail7.data.o,ov_SC04_009_jr_801734BC.o,tail8.data.o,ov_SC04_009_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_009_jr_8012ACE0.o,tail2.data.o,ov_SC04_009_jr_801380E0.o,tail3.data.o,ov_SC04_009_jr_8013FFD8.o,tail4.data.o,ov_SC04_009_jr_8015444C.o,tail5.data.o,ov_SC04_009_jr_8015A3C8.o,tail6.data.o,ov_SC04_009_jr_8015AE2C.o,tail7.data.o,ov_SC04_009_jr_8016AB6C.o,tail8.data.o,ov_SC04_009_jr_801734BC.o,tail9.data.o,ov_SC04_009_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_009_CHECK_SHA := config/check.ov_SC04_009.sha ov_SC04_009_SYMBOLS := config/symbols.ov_SC04_009.txt ov_SC04_009_SIG := .run/sig.ov_SC04_009.jsonl @@ -2023,7 +2023,7 @@ ov_SC04_010_ELF := $(ov_SC04_010_OUT).elf ov_SC04_010_MAPFILE := $(ov_SC04_010_OUT).map ov_SC04_010_LD_SCRIPT := $(ov_SC04_010_OUT).ld ov_SC04_010_SPLAT_YAML := config/splat.ov_SC04_010.yaml -ov_SC04_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_010_jr_8012ACE0.o,tail2.data.o,ov_SC04_010_jr_8013FFD8.o,tail3.data.o,ov_SC04_010_jr_8015444C.o,tail4.data.o,ov_SC04_010_jr_8015A3C8.o,tail5.data.o,ov_SC04_010_jr_8015AE2C.o,tail6.data.o,ov_SC04_010_jr_8016AB6C.o,tail7.data.o,ov_SC04_010_jr_801734BC.o,tail8.data.o,ov_SC04_010_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_010_jr_8012ACE0.o,tail2.data.o,ov_SC04_010_jr_801380E0.o,tail3.data.o,ov_SC04_010_jr_8013FFD8.o,tail4.data.o,ov_SC04_010_jr_8015444C.o,tail5.data.o,ov_SC04_010_jr_8015A3C8.o,tail6.data.o,ov_SC04_010_jr_8015AE2C.o,tail7.data.o,ov_SC04_010_jr_8016AB6C.o,tail8.data.o,ov_SC04_010_jr_801734BC.o,tail9.data.o,ov_SC04_010_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_010_CHECK_SHA := config/check.ov_SC04_010.sha ov_SC04_010_SYMBOLS := config/symbols.ov_SC04_010.txt ov_SC04_010_SIG := .run/sig.ov_SC04_010.jsonl @@ -2045,7 +2045,7 @@ ov_SC04_011_ELF := $(ov_SC04_011_OUT).elf ov_SC04_011_MAPFILE := $(ov_SC04_011_OUT).map ov_SC04_011_LD_SCRIPT := $(ov_SC04_011_OUT).ld ov_SC04_011_SPLAT_YAML := config/splat.ov_SC04_011.yaml -ov_SC04_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_011_jr_8012ACE0.o,tail2.data.o,ov_SC04_011_jr_8013FFD8.o,tail3.data.o,ov_SC04_011_jr_8015444C.o,tail4.data.o,ov_SC04_011_jr_8015A3C8.o,tail5.data.o,ov_SC04_011_jr_8015AE2C.o,tail6.data.o,ov_SC04_011_jr_8016AB6C.o,tail7.data.o,ov_SC04_011_jr_801734BC.o,tail8.data.o,ov_SC04_011_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_011_jr_8012ACE0.o,tail2.data.o,ov_SC04_011_jr_801380E0.o,tail3.data.o,ov_SC04_011_jr_8013FFD8.o,tail4.data.o,ov_SC04_011_jr_8015444C.o,tail5.data.o,ov_SC04_011_jr_8015A3C8.o,tail6.data.o,ov_SC04_011_jr_8015AE2C.o,tail7.data.o,ov_SC04_011_jr_8016AB6C.o,tail8.data.o,ov_SC04_011_jr_801734BC.o,tail9.data.o,ov_SC04_011_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_011_CHECK_SHA := config/check.ov_SC04_011.sha ov_SC04_011_SYMBOLS := config/symbols.ov_SC04_011.txt ov_SC04_011_SIG := .run/sig.ov_SC04_011.jsonl @@ -2067,7 +2067,7 @@ ov_SC04_012_ELF := $(ov_SC04_012_OUT).elf ov_SC04_012_MAPFILE := $(ov_SC04_012_OUT).map ov_SC04_012_LD_SCRIPT := $(ov_SC04_012_OUT).ld ov_SC04_012_SPLAT_YAML := config/splat.ov_SC04_012.yaml -ov_SC04_012_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_012_jr_8012ACE0.o,tail2.data.o,ov_SC04_012_jr_8013FFD8.o,tail3.data.o,ov_SC04_012_jr_8015444C.o,tail4.data.o,ov_SC04_012_jr_8015A3C8.o,tail5.data.o,ov_SC04_012_jr_8015AE2C.o,tail6.data.o,ov_SC04_012_jr_8016AB6C.o,tail7.data.o,ov_SC04_012_jr_801734BC.o,tail8.data.o,ov_SC04_012_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_012_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_012_jr_8012ACE0.o,tail2.data.o,ov_SC04_012_jr_801380E0.o,tail3.data.o,ov_SC04_012_jr_8013FFD8.o,tail4.data.o,ov_SC04_012_jr_8015444C.o,tail5.data.o,ov_SC04_012_jr_8015A3C8.o,tail6.data.o,ov_SC04_012_jr_8015AE2C.o,tail7.data.o,ov_SC04_012_jr_8016AB6C.o,tail8.data.o,ov_SC04_012_jr_801734BC.o,tail9.data.o,ov_SC04_012_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_012_CHECK_SHA := config/check.ov_SC04_012.sha ov_SC04_012_SYMBOLS := config/symbols.ov_SC04_012.txt ov_SC04_012_SIG := .run/sig.ov_SC04_012.jsonl @@ -2089,7 +2089,7 @@ ov_SC04_015_ELF := $(ov_SC04_015_OUT).elf ov_SC04_015_MAPFILE := $(ov_SC04_015_OUT).map ov_SC04_015_LD_SCRIPT := $(ov_SC04_015_OUT).ld ov_SC04_015_SPLAT_YAML := config/splat.ov_SC04_015.yaml -ov_SC04_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_015_jr_8012ACE0.o,tail2.data.o,ov_SC04_015_jr_8013FFD8.o,tail3.data.o,ov_SC04_015_jr_8015444C.o,tail4.data.o,ov_SC04_015_jr_8015A3C8.o,tail5.data.o,ov_SC04_015_jr_8015AE2C.o,tail6.data.o,ov_SC04_015_jr_8016AB6C.o,tail7.data.o,ov_SC04_015_jr_801734BC.o,tail8.data.o,ov_SC04_015_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_015_jr_8012ACE0.o,tail2.data.o,ov_SC04_015_jr_801380E0.o,tail3.data.o,ov_SC04_015_jr_8013FFD8.o,tail4.data.o,ov_SC04_015_jr_8015444C.o,tail5.data.o,ov_SC04_015_jr_8015A3C8.o,tail6.data.o,ov_SC04_015_jr_8015AE2C.o,tail7.data.o,ov_SC04_015_jr_8016AB6C.o,tail8.data.o,ov_SC04_015_jr_801734BC.o,tail9.data.o,ov_SC04_015_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_015_CHECK_SHA := config/check.ov_SC04_015.sha ov_SC04_015_SYMBOLS := config/symbols.ov_SC04_015.txt ov_SC04_015_SIG := .run/sig.ov_SC04_015.jsonl @@ -2111,7 +2111,7 @@ ov_SC04_016_ELF := $(ov_SC04_016_OUT).elf ov_SC04_016_MAPFILE := $(ov_SC04_016_OUT).map ov_SC04_016_LD_SCRIPT := $(ov_SC04_016_OUT).ld ov_SC04_016_SPLAT_YAML := config/splat.ov_SC04_016.yaml -ov_SC04_016_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_016_jr_8012ACE0.o,tail2.data.o,ov_SC04_016_jr_8013FFD8.o,tail3.data.o,ov_SC04_016_jr_8015444C.o,tail4.data.o,ov_SC04_016_jr_8015A3C8.o,tail5.data.o,ov_SC04_016_jr_8015AE2C.o,tail6.data.o,ov_SC04_016_jr_8016AB6C.o,tail7.data.o,ov_SC04_016_jr_801734BC.o,tail8.data.o,ov_SC04_016_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_016_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_016_jr_8012ACE0.o,tail2.data.o,ov_SC04_016_jr_801380E0.o,tail3.data.o,ov_SC04_016_jr_8013FFD8.o,tail4.data.o,ov_SC04_016_jr_8015444C.o,tail5.data.o,ov_SC04_016_jr_8015A3C8.o,tail6.data.o,ov_SC04_016_jr_8015AE2C.o,tail7.data.o,ov_SC04_016_jr_8016AB6C.o,tail8.data.o,ov_SC04_016_jr_801734BC.o,tail9.data.o,ov_SC04_016_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_016_CHECK_SHA := config/check.ov_SC04_016.sha ov_SC04_016_SYMBOLS := config/symbols.ov_SC04_016.txt ov_SC04_016_SIG := .run/sig.ov_SC04_016.jsonl @@ -2133,7 +2133,7 @@ ov_SC04_020_ELF := $(ov_SC04_020_OUT).elf ov_SC04_020_MAPFILE := $(ov_SC04_020_OUT).map ov_SC04_020_LD_SCRIPT := $(ov_SC04_020_OUT).ld ov_SC04_020_SPLAT_YAML := config/splat.ov_SC04_020.yaml -ov_SC04_020_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_020_jr_8012ACE0.o,tail2.data.o,ov_SC04_020_jr_8013FFD8.o,tail3.data.o,ov_SC04_020_jr_8015444C.o,tail4.data.o,ov_SC04_020_jr_8015A3C8.o,tail5.data.o,ov_SC04_020_jr_8015AE2C.o,tail6.data.o,ov_SC04_020_jr_8016AB6C.o,tail7.data.o,ov_SC04_020_jr_801734BC.o,tail8.data.o,ov_SC04_020_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_020_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_020_jr_8012ACE0.o,tail2.data.o,ov_SC04_020_jr_801380E0.o,tail3.data.o,ov_SC04_020_jr_8013FFD8.o,tail4.data.o,ov_SC04_020_jr_8015444C.o,tail5.data.o,ov_SC04_020_jr_8015A3C8.o,tail6.data.o,ov_SC04_020_jr_8015AE2C.o,tail7.data.o,ov_SC04_020_jr_8016AB6C.o,tail8.data.o,ov_SC04_020_jr_801734BC.o,tail9.data.o,ov_SC04_020_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_020_CHECK_SHA := config/check.ov_SC04_020.sha ov_SC04_020_SYMBOLS := config/symbols.ov_SC04_020.txt ov_SC04_020_SIG := .run/sig.ov_SC04_020.jsonl @@ -2155,7 +2155,7 @@ ov_SC04_021_ELF := $(ov_SC04_021_OUT).elf ov_SC04_021_MAPFILE := $(ov_SC04_021_OUT).map ov_SC04_021_LD_SCRIPT := $(ov_SC04_021_OUT).ld ov_SC04_021_SPLAT_YAML := config/splat.ov_SC04_021.yaml -ov_SC04_021_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_021_jr_8012ACE0.o,tail2.data.o,ov_SC04_021_jr_8013FFD8.o,tail3.data.o,ov_SC04_021_jr_8015444C.o,tail4.data.o,ov_SC04_021_jr_8015A3C8.o,tail5.data.o,ov_SC04_021_jr_8015AE2C.o,tail6.data.o,ov_SC04_021_jr_8016AB6C.o,tail7.data.o,ov_SC04_021_jr_801734BC.o,tail8.data.o,ov_SC04_021_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC04_021_JTBL_INTERLEAVE := --order tail.data.o,ov_SC04_021_jr_8012ACE0.o,tail2.data.o,ov_SC04_021_jr_801380E0.o,tail3.data.o,ov_SC04_021_jr_8013FFD8.o,tail4.data.o,ov_SC04_021_jr_8015444C.o,tail5.data.o,ov_SC04_021_jr_8015A3C8.o,tail6.data.o,ov_SC04_021_jr_8015AE2C.o,tail7.data.o,ov_SC04_021_jr_8016AB6C.o,tail8.data.o,ov_SC04_021_jr_801734BC.o,tail9.data.o,ov_SC04_021_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC04_021_CHECK_SHA := config/check.ov_SC04_021.sha ov_SC04_021_SYMBOLS := config/symbols.ov_SC04_021.txt ov_SC04_021_SIG := .run/sig.ov_SC04_021.jsonl @@ -2177,7 +2177,7 @@ ov_SC05_001_ELF := $(ov_SC05_001_OUT).elf ov_SC05_001_MAPFILE := $(ov_SC05_001_OUT).map ov_SC05_001_LD_SCRIPT := $(ov_SC05_001_OUT).ld ov_SC05_001_SPLAT_YAML := config/splat.ov_SC05_001.yaml -ov_SC05_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_001_jr_8012ACE0.o,tail2.data.o,ov_SC05_001_jr_8013FFD8.o,tail3.data.o,ov_SC05_001_jr_8015444C.o,tail4.data.o,ov_SC05_001_jr_8015A3C8.o,tail5.data.o,ov_SC05_001_jr_8015AE2C.o,tail6.data.o,ov_SC05_001_jr_8016AB6C.o,tail7.data.o,ov_SC05_001_jr_801734BC.o,tail8.data.o,ov_SC05_001_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_001_jr_8012ACE0.o,tail2.data.o,ov_SC05_001_jr_801380E0.o,tail3.data.o,ov_SC05_001_jr_8013FFD8.o,tail4.data.o,ov_SC05_001_jr_8015444C.o,tail5.data.o,ov_SC05_001_jr_8015A3C8.o,tail6.data.o,ov_SC05_001_jr_8015AE2C.o,tail7.data.o,ov_SC05_001_jr_8016AB6C.o,tail8.data.o,ov_SC05_001_jr_801734BC.o,tail9.data.o,ov_SC05_001_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_001_CHECK_SHA := config/check.ov_SC05_001.sha ov_SC05_001_SYMBOLS := config/symbols.ov_SC05_001.txt ov_SC05_001_SIG := .run/sig.ov_SC05_001.jsonl @@ -2199,7 +2199,7 @@ ov_SC05_002_ELF := $(ov_SC05_002_OUT).elf ov_SC05_002_MAPFILE := $(ov_SC05_002_OUT).map ov_SC05_002_LD_SCRIPT := $(ov_SC05_002_OUT).ld ov_SC05_002_SPLAT_YAML := config/splat.ov_SC05_002.yaml -ov_SC05_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_002_jr_8012ACE0.o,tail2.data.o,ov_SC05_002_jr_8013FFD8.o,tail3.data.o,ov_SC05_002_jr_8015444C.o,tail4.data.o,ov_SC05_002_jr_8015A3C8.o,tail5.data.o,ov_SC05_002_jr_8015AE2C.o,tail6.data.o,ov_SC05_002_jr_8016AB6C.o,tail7.data.o,ov_SC05_002_jr_801734BC.o,tail8.data.o,ov_SC05_002_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_002_jr_8012ACE0.o,tail2.data.o,ov_SC05_002_jr_801380E0.o,tail3.data.o,ov_SC05_002_jr_8013FFD8.o,tail4.data.o,ov_SC05_002_jr_8015444C.o,tail5.data.o,ov_SC05_002_jr_8015A3C8.o,tail6.data.o,ov_SC05_002_jr_8015AE2C.o,tail7.data.o,ov_SC05_002_jr_8016AB6C.o,tail8.data.o,ov_SC05_002_jr_801734BC.o,tail9.data.o,ov_SC05_002_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_002_CHECK_SHA := config/check.ov_SC05_002.sha ov_SC05_002_SYMBOLS := config/symbols.ov_SC05_002.txt ov_SC05_002_SIG := .run/sig.ov_SC05_002.jsonl @@ -2221,7 +2221,7 @@ ov_SC05_003_ELF := $(ov_SC05_003_OUT).elf ov_SC05_003_MAPFILE := $(ov_SC05_003_OUT).map ov_SC05_003_LD_SCRIPT := $(ov_SC05_003_OUT).ld ov_SC05_003_SPLAT_YAML := config/splat.ov_SC05_003.yaml -ov_SC05_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_003_jr_8012ACE0.o,tail2.data.o,ov_SC05_003_jr_8013FFD8.o,tail3.data.o,ov_SC05_003_jr_8015444C.o,tail4.data.o,ov_SC05_003_jr_8015A3C8.o,tail5.data.o,ov_SC05_003_jr_8015AE2C.o,tail6.data.o,ov_SC05_003_jr_8016AB6C.o,tail7.data.o,ov_SC05_003_jr_801734BC.o,tail8.data.o,ov_SC05_003_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_003_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_003_jr_8012ACE0.o,tail2.data.o,ov_SC05_003_jr_801380E0.o,tail3.data.o,ov_SC05_003_jr_8013FFD8.o,tail4.data.o,ov_SC05_003_jr_8015444C.o,tail5.data.o,ov_SC05_003_jr_8015A3C8.o,tail6.data.o,ov_SC05_003_jr_8015AE2C.o,tail7.data.o,ov_SC05_003_jr_8016AB6C.o,tail8.data.o,ov_SC05_003_jr_801734BC.o,tail9.data.o,ov_SC05_003_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_003_CHECK_SHA := config/check.ov_SC05_003.sha ov_SC05_003_SYMBOLS := config/symbols.ov_SC05_003.txt ov_SC05_003_SIG := .run/sig.ov_SC05_003.jsonl @@ -2243,7 +2243,7 @@ ov_SC05_004_ELF := $(ov_SC05_004_OUT).elf ov_SC05_004_MAPFILE := $(ov_SC05_004_OUT).map ov_SC05_004_LD_SCRIPT := $(ov_SC05_004_OUT).ld ov_SC05_004_SPLAT_YAML := config/splat.ov_SC05_004.yaml -ov_SC05_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_004.o,tail2.data.o,ov_SC05_004_jr_8015444C.o,tail3.data.o,ov_SC05_004_jr_8015A3C8.o,tail4.data.o,ov_SC05_004_jr_8015AE2C.o,tail5.data.o,ov_SC05_004_jr_8016AB6C.o,tail6.data.o,ov_SC05_004_jr_801734BC.o,tail7.data.o,ov_SC05_004_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_004_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_004_jr_8012ACE0.o,tail2.data.o,ov_SC05_004_jr_801380E0.o,tail3.data.o,ov_SC05_004_jr_8015444C.o,tail4.data.o,ov_SC05_004_jr_8015A3C8.o,tail5.data.o,ov_SC05_004_jr_8015AE2C.o,tail6.data.o,ov_SC05_004_jr_8016AB6C.o,tail7.data.o,ov_SC05_004_jr_801734BC.o,tail8.data.o,ov_SC05_004_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_004_CHECK_SHA := config/check.ov_SC05_004.sha ov_SC05_004_SYMBOLS := config/symbols.ov_SC05_004.txt ov_SC05_004_SIG := .run/sig.ov_SC05_004.jsonl @@ -2265,7 +2265,7 @@ ov_SC05_005_ELF := $(ov_SC05_005_OUT).elf ov_SC05_005_MAPFILE := $(ov_SC05_005_OUT).map ov_SC05_005_LD_SCRIPT := $(ov_SC05_005_OUT).ld ov_SC05_005_SPLAT_YAML := config/splat.ov_SC05_005.yaml -ov_SC05_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_005_jr_8012ACE0.o,tail2.data.o,ov_SC05_005_jr_8013FFD8.o,tail3.data.o,ov_SC05_005_jr_8015444C.o,tail4.data.o,ov_SC05_005_jr_8015A3C8.o,tail5.data.o,ov_SC05_005_jr_8015AE2C.o,tail6.data.o,ov_SC05_005_jr_8016AB6C.o,tail7.data.o,ov_SC05_005_jr_801734BC.o,tail8.data.o,ov_SC05_005_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_005_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_005_jr_8012ACE0.o,tail2.data.o,ov_SC05_005_jr_801380E0.o,tail3.data.o,ov_SC05_005_jr_8013FFD8.o,tail4.data.o,ov_SC05_005_jr_8015444C.o,tail5.data.o,ov_SC05_005_jr_8015A3C8.o,tail6.data.o,ov_SC05_005_jr_8015AE2C.o,tail7.data.o,ov_SC05_005_jr_8016AB6C.o,tail8.data.o,ov_SC05_005_jr_801734BC.o,tail9.data.o,ov_SC05_005_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_005_CHECK_SHA := config/check.ov_SC05_005.sha ov_SC05_005_SYMBOLS := config/symbols.ov_SC05_005.txt ov_SC05_005_SIG := .run/sig.ov_SC05_005.jsonl @@ -2287,7 +2287,7 @@ ov_SC05_006_ELF := $(ov_SC05_006_OUT).elf ov_SC05_006_MAPFILE := $(ov_SC05_006_OUT).map ov_SC05_006_LD_SCRIPT := $(ov_SC05_006_OUT).ld ov_SC05_006_SPLAT_YAML := config/splat.ov_SC05_006.yaml -ov_SC05_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_006_jr_8012ACE0.o,tail2.data.o,ov_SC05_006_jr_8013FFD8.o,tail3.data.o,ov_SC05_006_jr_8015444C.o,tail4.data.o,ov_SC05_006_jr_8015A3C8.o,tail5.data.o,ov_SC05_006_jr_8015AE2C.o,tail6.data.o,ov_SC05_006_jr_8016AB6C.o,tail7.data.o,ov_SC05_006_jr_801734BC.o,tail8.data.o,ov_SC05_006_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_006_jr_8012ACE0.o,tail2.data.o,ov_SC05_006_jr_801380E0.o,tail3.data.o,ov_SC05_006_jr_8013FFD8.o,tail4.data.o,ov_SC05_006_jr_8015444C.o,tail5.data.o,ov_SC05_006_jr_8015A3C8.o,tail6.data.o,ov_SC05_006_jr_8015AE2C.o,tail7.data.o,ov_SC05_006_jr_8016AB6C.o,tail8.data.o,ov_SC05_006_jr_801734BC.o,tail9.data.o,ov_SC05_006_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_006_CHECK_SHA := config/check.ov_SC05_006.sha ov_SC05_006_SYMBOLS := config/symbols.ov_SC05_006.txt ov_SC05_006_SIG := .run/sig.ov_SC05_006.jsonl @@ -2309,7 +2309,7 @@ ov_SC05_007_ELF := $(ov_SC05_007_OUT).elf ov_SC05_007_MAPFILE := $(ov_SC05_007_OUT).map ov_SC05_007_LD_SCRIPT := $(ov_SC05_007_OUT).ld ov_SC05_007_SPLAT_YAML := config/splat.ov_SC05_007.yaml -ov_SC05_007_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_007_jr_8012ACE0.o,tail2.data.o,ov_SC05_007_jr_8013FFD8.o,tail3.data.o,ov_SC05_007_jr_8015444C.o,tail4.data.o,ov_SC05_007_jr_8015A3C8.o,tail5.data.o,ov_SC05_007_jr_8015AE2C.o,tail6.data.o,ov_SC05_007_jr_8016AB6C.o,tail7.data.o,ov_SC05_007_jr_801734BC.o,tail8.data.o,ov_SC05_007_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_007_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_007_jr_8012ACE0.o,tail2.data.o,ov_SC05_007_jr_801380E0.o,tail3.data.o,ov_SC05_007_jr_8013FFD8.o,tail4.data.o,ov_SC05_007_jr_8015444C.o,tail5.data.o,ov_SC05_007_jr_8015A3C8.o,tail6.data.o,ov_SC05_007_jr_8015AE2C.o,tail7.data.o,ov_SC05_007_jr_8016AB6C.o,tail8.data.o,ov_SC05_007_jr_801734BC.o,tail9.data.o,ov_SC05_007_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_007_CHECK_SHA := config/check.ov_SC05_007.sha ov_SC05_007_SYMBOLS := config/symbols.ov_SC05_007.txt ov_SC05_007_SIG := .run/sig.ov_SC05_007.jsonl @@ -2331,7 +2331,7 @@ ov_SC05_008_ELF := $(ov_SC05_008_OUT).elf ov_SC05_008_MAPFILE := $(ov_SC05_008_OUT).map ov_SC05_008_LD_SCRIPT := $(ov_SC05_008_OUT).ld ov_SC05_008_SPLAT_YAML := config/splat.ov_SC05_008.yaml -ov_SC05_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_008_jr_8012ACE0.o,tail2.data.o,ov_SC05_008_jr_8013FFD8.o,tail3.data.o,ov_SC05_008_jr_8015444C.o,tail4.data.o,ov_SC05_008_jr_8015A3C8.o,tail5.data.o,ov_SC05_008_jr_8015AE2C.o,tail6.data.o,ov_SC05_008_jr_8016AB6C.o,tail7.data.o,ov_SC05_008_jr_801734BC.o,tail8.data.o,ov_SC05_008_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_008_jr_8012ACE0.o,tail2.data.o,ov_SC05_008_jr_801380E0.o,tail3.data.o,ov_SC05_008_jr_8013FFD8.o,tail4.data.o,ov_SC05_008_jr_8015444C.o,tail5.data.o,ov_SC05_008_jr_8015A3C8.o,tail6.data.o,ov_SC05_008_jr_8015AE2C.o,tail7.data.o,ov_SC05_008_jr_8016AB6C.o,tail8.data.o,ov_SC05_008_jr_801734BC.o,tail9.data.o,ov_SC05_008_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_008_CHECK_SHA := config/check.ov_SC05_008.sha ov_SC05_008_SYMBOLS := config/symbols.ov_SC05_008.txt ov_SC05_008_SIG := .run/sig.ov_SC05_008.jsonl @@ -2353,7 +2353,7 @@ ov_SC05_009_ELF := $(ov_SC05_009_OUT).elf ov_SC05_009_MAPFILE := $(ov_SC05_009_OUT).map ov_SC05_009_LD_SCRIPT := $(ov_SC05_009_OUT).ld ov_SC05_009_SPLAT_YAML := config/splat.ov_SC05_009.yaml -ov_SC05_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_009_jr_8012ACE0.o,tail2.data.o,ov_SC05_009_jr_8013FFD8.o,tail3.data.o,ov_SC05_009_after.o,tail4.data.o,ov_SC05_009_jr_8015AE2C.o,tail5.data.o,ov_SC05_009_jr_8016AB6C.o,tail6.data.o,ov_SC05_009_jr_801734BC.o,tail7.data.o,ov_SC05_009_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_009_jr_8012ACE0.o,tail2.data.o,ov_SC05_009_jr_801380E0.o,tail3.data.o,ov_SC05_009_jr_8013FFD8.o,tail4.data.o,ov_SC05_009_after.o,tail5.data.o,ov_SC05_009_jr_8015AE2C.o,tail6.data.o,ov_SC05_009_jr_8016AB6C.o,tail7.data.o,ov_SC05_009_jr_801734BC.o,tail8.data.o,ov_SC05_009_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_009_CHECK_SHA := config/check.ov_SC05_009.sha ov_SC05_009_SYMBOLS := config/symbols.ov_SC05_009.txt ov_SC05_009_SIG := .run/sig.ov_SC05_009.jsonl @@ -2375,7 +2375,7 @@ ov_SC05_010_ELF := $(ov_SC05_010_OUT).elf ov_SC05_010_MAPFILE := $(ov_SC05_010_OUT).map ov_SC05_010_LD_SCRIPT := $(ov_SC05_010_OUT).ld ov_SC05_010_SPLAT_YAML := config/splat.ov_SC05_010.yaml -ov_SC05_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_010_jr_8012ACE0.o,tail2.data.o,ov_SC05_010_jr_8013FFD8.o,tail3.data.o,ov_SC05_010_jr_8015444C.o,tail4.data.o,ov_SC05_010_jr_8015A3C8.o,tail5.data.o,ov_SC05_010_jr_8015AE2C.o,tail6.data.o,ov_SC05_010_jr_8016AB6C.o,tail7.data.o,ov_SC05_010_jr_801734BC.o,tail8.data.o,ov_SC05_010_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_010_jr_8012ACE0.o,tail2.data.o,ov_SC05_010_jr_801380E0.o,tail3.data.o,ov_SC05_010_jr_8013FFD8.o,tail4.data.o,ov_SC05_010_jr_8015444C.o,tail5.data.o,ov_SC05_010_jr_8015A3C8.o,tail6.data.o,ov_SC05_010_jr_8015AE2C.o,tail7.data.o,ov_SC05_010_jr_8016AB6C.o,tail8.data.o,ov_SC05_010_jr_801734BC.o,tail9.data.o,ov_SC05_010_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_010_CHECK_SHA := config/check.ov_SC05_010.sha ov_SC05_010_SYMBOLS := config/symbols.ov_SC05_010.txt ov_SC05_010_SIG := .run/sig.ov_SC05_010.jsonl @@ -2397,7 +2397,7 @@ ov_SC05_011_ELF := $(ov_SC05_011_OUT).elf ov_SC05_011_MAPFILE := $(ov_SC05_011_OUT).map ov_SC05_011_LD_SCRIPT := $(ov_SC05_011_OUT).ld ov_SC05_011_SPLAT_YAML := config/splat.ov_SC05_011.yaml -ov_SC05_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_011_jr_8012ACE0.o,tail2.data.o,ov_SC05_011_jr_8013FFD8.o,tail3.data.o,ov_SC05_011_jr_8015444C.o,tail4.data.o,ov_SC05_011_jr_8015A3C8.o,tail5.data.o,ov_SC05_011_jr_8015AE2C.o,tail6.data.o,ov_SC05_011_jr_8016AB6C.o,tail7.data.o,ov_SC05_011_jr_801734BC.o,tail8.data.o,ov_SC05_011_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_011_jr_8012ACE0.o,tail2.data.o,ov_SC05_011_jr_801380E0.o,tail3.data.o,ov_SC05_011_jr_8013FFD8.o,tail4.data.o,ov_SC05_011_jr_8015444C.o,tail5.data.o,ov_SC05_011_jr_8015A3C8.o,tail6.data.o,ov_SC05_011_jr_8015AE2C.o,tail7.data.o,ov_SC05_011_jr_8016AB6C.o,tail8.data.o,ov_SC05_011_jr_801734BC.o,tail9.data.o,ov_SC05_011_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_011_CHECK_SHA := config/check.ov_SC05_011.sha ov_SC05_011_SYMBOLS := config/symbols.ov_SC05_011.txt ov_SC05_011_SIG := .run/sig.ov_SC05_011.jsonl @@ -2419,7 +2419,7 @@ ov_SC05_017_ELF := $(ov_SC05_017_OUT).elf ov_SC05_017_MAPFILE := $(ov_SC05_017_OUT).map ov_SC05_017_LD_SCRIPT := $(ov_SC05_017_OUT).ld ov_SC05_017_SPLAT_YAML := config/splat.ov_SC05_017.yaml -ov_SC05_017_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_017_jr_8012ACE0.o,tail2.data.o,ov_SC05_017_jr_8013FFD8.o,tail3.data.o,ov_SC05_017_jr_8015444C.o,tail4.data.o,ov_SC05_017_jr_8015A3C8.o,tail5.data.o,ov_SC05_017_jr_8015AE2C.o,tail6.data.o,ov_SC05_017_jr_8016AB6C.o,tail7.data.o,ov_SC05_017_jr_801734BC.o,tail8.data.o,ov_SC05_017_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_017_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_017_jr_8012ACE0.o,tail2.data.o,ov_SC05_017_jr_801380E0.o,tail3.data.o,ov_SC05_017_jr_8013FFD8.o,tail4.data.o,ov_SC05_017_jr_8015444C.o,tail5.data.o,ov_SC05_017_jr_8015A3C8.o,tail6.data.o,ov_SC05_017_jr_8015AE2C.o,tail7.data.o,ov_SC05_017_jr_8016AB6C.o,tail8.data.o,ov_SC05_017_jr_801734BC.o,tail9.data.o,ov_SC05_017_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_017_CHECK_SHA := config/check.ov_SC05_017.sha ov_SC05_017_SYMBOLS := config/symbols.ov_SC05_017.txt ov_SC05_017_SIG := .run/sig.ov_SC05_017.jsonl @@ -2441,7 +2441,7 @@ ov_SC05_018_ELF := $(ov_SC05_018_OUT).elf ov_SC05_018_MAPFILE := $(ov_SC05_018_OUT).map ov_SC05_018_LD_SCRIPT := $(ov_SC05_018_OUT).ld ov_SC05_018_SPLAT_YAML := config/splat.ov_SC05_018.yaml -ov_SC05_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_018_jr_8012ACE0.o,tail2.data.o,ov_SC05_018_jr_8013FFD8.o,tail3.data.o,ov_SC05_018_jr_8015444C.o,tail4.data.o,ov_SC05_018_jr_8015A3C8.o,tail5.data.o,ov_SC05_018_jr_8015AE2C.o,tail6.data.o,ov_SC05_018_jr_8016AB6C.o,tail7.data.o,ov_SC05_018_jr_801734BC.o,tail8.data.o,ov_SC05_018_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_018_jr_8012ACE0.o,tail2.data.o,ov_SC05_018_jr_801380E0.o,tail3.data.o,ov_SC05_018_jr_8013FFD8.o,tail4.data.o,ov_SC05_018_jr_8015444C.o,tail5.data.o,ov_SC05_018_jr_8015A3C8.o,tail6.data.o,ov_SC05_018_jr_8015AE2C.o,tail7.data.o,ov_SC05_018_jr_8016AB6C.o,tail8.data.o,ov_SC05_018_jr_801734BC.o,tail9.data.o,ov_SC05_018_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_018_CHECK_SHA := config/check.ov_SC05_018.sha ov_SC05_018_SYMBOLS := config/symbols.ov_SC05_018.txt ov_SC05_018_SIG := .run/sig.ov_SC05_018.jsonl @@ -2463,7 +2463,7 @@ ov_SC05_019_ELF := $(ov_SC05_019_OUT).elf ov_SC05_019_MAPFILE := $(ov_SC05_019_OUT).map ov_SC05_019_LD_SCRIPT := $(ov_SC05_019_OUT).ld ov_SC05_019_SPLAT_YAML := config/splat.ov_SC05_019.yaml -ov_SC05_019_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_019_jr_8012ACE0.o,tail2.data.o,ov_SC05_019_jr_8013FFD8.o,tail3.data.o,ov_SC05_019_jr_8015444C.o,tail4.data.o,ov_SC05_019_jr_8015A3C8.o,tail5.data.o,ov_SC05_019_jr_8015AE2C.o,tail6.data.o,ov_SC05_019_jr_8016AB6C.o,tail7.data.o,ov_SC05_019_jr_801734BC.o,tail8.data.o,ov_SC05_019_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC05_019_JTBL_INTERLEAVE := --order tail.data.o,ov_SC05_019_jr_8012ACE0.o,tail2.data.o,ov_SC05_019_jr_801380E0.o,tail3.data.o,ov_SC05_019_jr_8013FFD8.o,tail4.data.o,ov_SC05_019_jr_8015444C.o,tail5.data.o,ov_SC05_019_jr_8015A3C8.o,tail6.data.o,ov_SC05_019_jr_8015AE2C.o,tail7.data.o,ov_SC05_019_jr_8016AB6C.o,tail8.data.o,ov_SC05_019_jr_801734BC.o,tail9.data.o,ov_SC05_019_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC05_019_CHECK_SHA := config/check.ov_SC05_019.sha ov_SC05_019_SYMBOLS := config/symbols.ov_SC05_019.txt ov_SC05_019_SIG := .run/sig.ov_SC05_019.jsonl @@ -2485,7 +2485,7 @@ ov_SC06_006_ELF := $(ov_SC06_006_OUT).elf ov_SC06_006_MAPFILE := $(ov_SC06_006_OUT).map ov_SC06_006_LD_SCRIPT := $(ov_SC06_006_OUT).ld ov_SC06_006_SPLAT_YAML := config/splat.ov_SC06_006.yaml -ov_SC06_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_006_jr_8012ACE0.o,tail2.data.o,ov_SC06_006_jr_8013FFD8.o,tail3.data.o,ov_SC06_006_jr_8015444C.o,tail4.data.o,ov_SC06_006_jr_8015A3C8.o,tail5.data.o,ov_SC06_006_jr_8015AE2C.o,tail6.data.o,ov_SC06_006_jr_8016AB6C.o,tail7.data.o,ov_SC06_006_jr_801734BC.o,tail8.data.o,ov_SC06_006_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_006_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_006_jr_8012ACE0.o,tail2.data.o,ov_SC06_006_jr_801380E0.o,tail3.data.o,ov_SC06_006_jr_8013FFD8.o,tail4.data.o,ov_SC06_006_jr_8015444C.o,tail5.data.o,ov_SC06_006_jr_8015A3C8.o,tail6.data.o,ov_SC06_006_jr_8015AE2C.o,tail7.data.o,ov_SC06_006_jr_8016AB6C.o,tail8.data.o,ov_SC06_006_jr_801734BC.o,tail9.data.o,ov_SC06_006_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_006_CHECK_SHA := config/check.ov_SC06_006.sha ov_SC06_006_SYMBOLS := config/symbols.ov_SC06_006.txt ov_SC06_006_SIG := .run/sig.ov_SC06_006.jsonl @@ -2507,7 +2507,7 @@ ov_SC06_008_ELF := $(ov_SC06_008_OUT).elf ov_SC06_008_MAPFILE := $(ov_SC06_008_OUT).map ov_SC06_008_LD_SCRIPT := $(ov_SC06_008_OUT).ld ov_SC06_008_SPLAT_YAML := config/splat.ov_SC06_008.yaml -ov_SC06_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_008_jr_8012ACE0.o,tail2.data.o,ov_SC06_008_jr_8013FFD8.o,tail3.data.o,ov_SC06_008_jr_8015444C.o,tail4.data.o,ov_SC06_008_jr_8015A3C8.o,tail5.data.o,ov_SC06_008_jr_8015AE2C.o,tail6.data.o,ov_SC06_008_jr_8016AB6C.o,tail7.data.o,ov_SC06_008_jr_801734BC.o,tail8.data.o,ov_SC06_008_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_008_jr_8012ACE0.o,tail2.data.o,ov_SC06_008_jr_801380E0.o,tail3.data.o,ov_SC06_008_jr_8013FFD8.o,tail4.data.o,ov_SC06_008_jr_8015444C.o,tail5.data.o,ov_SC06_008_jr_8015A3C8.o,tail6.data.o,ov_SC06_008_jr_8015AE2C.o,tail7.data.o,ov_SC06_008_jr_8016AB6C.o,tail8.data.o,ov_SC06_008_jr_801734BC.o,tail9.data.o,ov_SC06_008_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_008_CHECK_SHA := config/check.ov_SC06_008.sha ov_SC06_008_SYMBOLS := config/symbols.ov_SC06_008.txt ov_SC06_008_SIG := .run/sig.ov_SC06_008.jsonl @@ -2529,7 +2529,7 @@ ov_SC06_010_ELF := $(ov_SC06_010_OUT).elf ov_SC06_010_MAPFILE := $(ov_SC06_010_OUT).map ov_SC06_010_LD_SCRIPT := $(ov_SC06_010_OUT).ld ov_SC06_010_SPLAT_YAML := config/splat.ov_SC06_010.yaml -ov_SC06_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_010.o,tail2.data.o,ov_SC06_010_jr_8015444C.o,tail3.data.o,ov_SC06_010_jr_8015A3C8.o,tail4.data.o,ov_SC06_010_jr_8015AE2C.o,tail5.data.o,ov_SC06_010_jr_8016AB6C.o,tail6.data.o,ov_SC06_010_jr_801734BC.o,tail7.data.o,ov_SC06_010_jr_80178D40.o,tail8.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_010_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_010_jr_8012ACE0.o,tail2.data.o,ov_SC06_010_jr_801380E0.o,tail3.data.o,ov_SC06_010_jr_8015444C.o,tail4.data.o,ov_SC06_010_jr_8015A3C8.o,tail5.data.o,ov_SC06_010_jr_8015AE2C.o,tail6.data.o,ov_SC06_010_jr_8016AB6C.o,tail7.data.o,ov_SC06_010_jr_801734BC.o,tail8.data.o,ov_SC06_010_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_010_CHECK_SHA := config/check.ov_SC06_010.sha ov_SC06_010_SYMBOLS := config/symbols.ov_SC06_010.txt ov_SC06_010_SIG := .run/sig.ov_SC06_010.jsonl @@ -2551,7 +2551,7 @@ ov_SC06_011_ELF := $(ov_SC06_011_OUT).elf ov_SC06_011_MAPFILE := $(ov_SC06_011_OUT).map ov_SC06_011_LD_SCRIPT := $(ov_SC06_011_OUT).ld ov_SC06_011_SPLAT_YAML := config/splat.ov_SC06_011.yaml -ov_SC06_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_011_jr_8012ACE0.o,tail2.data.o,ov_SC06_011_jr_8013FFD8.o,tail3.data.o,ov_SC06_011_jr_8015444C.o,tail4.data.o,ov_SC06_011_jr_8015A3C8.o,tail5.data.o,ov_SC06_011_jr_8015AE2C.o,tail6.data.o,ov_SC06_011_jr_8016AB6C.o,tail7.data.o,ov_SC06_011_jr_801734BC.o,tail8.data.o,ov_SC06_011_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_011_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_011_jr_8012ACE0.o,tail2.data.o,ov_SC06_011_jr_801380E0.o,tail3.data.o,ov_SC06_011_jr_8013FFD8.o,tail4.data.o,ov_SC06_011_jr_8015444C.o,tail5.data.o,ov_SC06_011_jr_8015A3C8.o,tail6.data.o,ov_SC06_011_jr_8015AE2C.o,tail7.data.o,ov_SC06_011_jr_8016AB6C.o,tail8.data.o,ov_SC06_011_jr_801734BC.o,tail9.data.o,ov_SC06_011_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_011_CHECK_SHA := config/check.ov_SC06_011.sha ov_SC06_011_SYMBOLS := config/symbols.ov_SC06_011.txt ov_SC06_011_SIG := .run/sig.ov_SC06_011.jsonl @@ -2573,7 +2573,7 @@ ov_SC06_013_ELF := $(ov_SC06_013_OUT).elf ov_SC06_013_MAPFILE := $(ov_SC06_013_OUT).map ov_SC06_013_LD_SCRIPT := $(ov_SC06_013_OUT).ld ov_SC06_013_SPLAT_YAML := config/splat.ov_SC06_013.yaml -ov_SC06_013_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_013_jr_8012ACE0.o,tail2.data.o,ov_SC06_013_jr_8013FFD8.o,tail3.data.o,ov_SC06_013_jr_8015444C.o,tail4.data.o,ov_SC06_013_jr_8015A3C8.o,tail5.data.o,ov_SC06_013_jr_8015AE2C.o,tail6.data.o,ov_SC06_013_jr_8016AB6C.o,tail7.data.o,ov_SC06_013_jr_801734BC.o,tail8.data.o,ov_SC06_013_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_013_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_013_jr_8012ACE0.o,tail2.data.o,ov_SC06_013_jr_801380E0.o,tail3.data.o,ov_SC06_013_jr_8013FFD8.o,tail4.data.o,ov_SC06_013_jr_8015444C.o,tail5.data.o,ov_SC06_013_jr_8015A3C8.o,tail6.data.o,ov_SC06_013_jr_8015AE2C.o,tail7.data.o,ov_SC06_013_jr_8016AB6C.o,tail8.data.o,ov_SC06_013_jr_801734BC.o,tail9.data.o,ov_SC06_013_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_013_CHECK_SHA := config/check.ov_SC06_013.sha ov_SC06_013_SYMBOLS := config/symbols.ov_SC06_013.txt ov_SC06_013_SIG := .run/sig.ov_SC06_013.jsonl @@ -2595,7 +2595,7 @@ ov_SC06_014_ELF := $(ov_SC06_014_OUT).elf ov_SC06_014_MAPFILE := $(ov_SC06_014_OUT).map ov_SC06_014_LD_SCRIPT := $(ov_SC06_014_OUT).ld ov_SC06_014_SPLAT_YAML := config/splat.ov_SC06_014.yaml -ov_SC06_014_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_014_jr_8012ACE0.o,tail2.data.o,ov_SC06_014_jr_8013FFD8.o,tail3.data.o,ov_SC06_014_jr_8015444C.o,tail4.data.o,ov_SC06_014_jr_8015A3C8.o,tail5.data.o,ov_SC06_014_jr_8015AE2C.o,tail6.data.o,ov_SC06_014_jr_8016AB6C.o,tail7.data.o,ov_SC06_014_jr_801734BC.o,tail8.data.o,ov_SC06_014_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_014_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_014_jr_8012ACE0.o,tail2.data.o,ov_SC06_014_jr_801380E0.o,tail3.data.o,ov_SC06_014_jr_8013FFD8.o,tail4.data.o,ov_SC06_014_jr_8015444C.o,tail5.data.o,ov_SC06_014_jr_8015A3C8.o,tail6.data.o,ov_SC06_014_jr_8015AE2C.o,tail7.data.o,ov_SC06_014_jr_8016AB6C.o,tail8.data.o,ov_SC06_014_jr_801734BC.o,tail9.data.o,ov_SC06_014_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_014_CHECK_SHA := config/check.ov_SC06_014.sha ov_SC06_014_SYMBOLS := config/symbols.ov_SC06_014.txt ov_SC06_014_SIG := .run/sig.ov_SC06_014.jsonl @@ -2617,7 +2617,7 @@ ov_SC06_015_ELF := $(ov_SC06_015_OUT).elf ov_SC06_015_MAPFILE := $(ov_SC06_015_OUT).map ov_SC06_015_LD_SCRIPT := $(ov_SC06_015_OUT).ld ov_SC06_015_SPLAT_YAML := config/splat.ov_SC06_015.yaml -ov_SC06_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_015_jr_8012ACE0.o,tail2.data.o,ov_SC06_015_jr_8013FFD8.o,tail3.data.o,ov_SC06_015_jr_8015444C.o,tail4.data.o,ov_SC06_015_jr_8015A3C8.o,tail5.data.o,ov_SC06_015_jr_8015AE2C.o,tail6.data.o,ov_SC06_015_jr_8016AB6C.o,tail7.data.o,ov_SC06_015_jr_801734BC.o,tail8.data.o,ov_SC06_015_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_015_jr_8012ACE0.o,tail2.data.o,ov_SC06_015_jr_801380E0.o,tail3.data.o,ov_SC06_015_jr_8013FFD8.o,tail4.data.o,ov_SC06_015_jr_8015444C.o,tail5.data.o,ov_SC06_015_jr_8015A3C8.o,tail6.data.o,ov_SC06_015_jr_8015AE2C.o,tail7.data.o,ov_SC06_015_jr_8016AB6C.o,tail8.data.o,ov_SC06_015_jr_801734BC.o,tail9.data.o,ov_SC06_015_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_015_CHECK_SHA := config/check.ov_SC06_015.sha ov_SC06_015_SYMBOLS := config/symbols.ov_SC06_015.txt ov_SC06_015_SIG := .run/sig.ov_SC06_015.jsonl @@ -2639,7 +2639,7 @@ ov_SC06_016_ELF := $(ov_SC06_016_OUT).elf ov_SC06_016_MAPFILE := $(ov_SC06_016_OUT).map ov_SC06_016_LD_SCRIPT := $(ov_SC06_016_OUT).ld ov_SC06_016_SPLAT_YAML := config/splat.ov_SC06_016.yaml -ov_SC06_016_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_016_jr_8012ACE0.o,tail2.data.o,ov_SC06_016_jr_8013FFD8.o,tail3.data.o,ov_SC06_016_jr_8015444C.o,tail4.data.o,ov_SC06_016_jr_8015A3C8.o,tail5.data.o,ov_SC06_016_jr_8015AE2C.o,tail6.data.o,ov_SC06_016_jr_8016AB6C.o,tail7.data.o,ov_SC06_016_jr_801734BC.o,tail8.data.o,ov_SC06_016_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_016_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_016_jr_8012ACE0.o,tail2.data.o,ov_SC06_016_jr_801380E0.o,tail3.data.o,ov_SC06_016_jr_8013FFD8.o,tail4.data.o,ov_SC06_016_jr_8015444C.o,tail5.data.o,ov_SC06_016_jr_8015A3C8.o,tail6.data.o,ov_SC06_016_jr_8015AE2C.o,tail7.data.o,ov_SC06_016_jr_8016AB6C.o,tail8.data.o,ov_SC06_016_jr_801734BC.o,tail9.data.o,ov_SC06_016_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_016_CHECK_SHA := config/check.ov_SC06_016.sha ov_SC06_016_SYMBOLS := config/symbols.ov_SC06_016.txt ov_SC06_016_SIG := .run/sig.ov_SC06_016.jsonl @@ -2661,7 +2661,7 @@ ov_SC06_018_ELF := $(ov_SC06_018_OUT).elf ov_SC06_018_MAPFILE := $(ov_SC06_018_OUT).map ov_SC06_018_LD_SCRIPT := $(ov_SC06_018_OUT).ld ov_SC06_018_SPLAT_YAML := config/splat.ov_SC06_018.yaml -ov_SC06_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_018_jr_8012ACE0.o,tail2.data.o,ov_SC06_018_jr_8013FFD8.o,tail3.data.o,ov_SC06_018_jr_8015444C.o,tail4.data.o,ov_SC06_018_jr_8015A3C8.o,tail5.data.o,ov_SC06_018_jr_8015AE2C.o,tail6.data.o,ov_SC06_018_jr_8016AB6C.o,tail7.data.o,ov_SC06_018_jr_801734BC.o,tail8.data.o,ov_SC06_018_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_018_jr_8012ACE0.o,tail2.data.o,ov_SC06_018_jr_801380E0.o,tail3.data.o,ov_SC06_018_jr_8013FFD8.o,tail4.data.o,ov_SC06_018_jr_8015444C.o,tail5.data.o,ov_SC06_018_jr_8015A3C8.o,tail6.data.o,ov_SC06_018_jr_8015AE2C.o,tail7.data.o,ov_SC06_018_jr_8016AB6C.o,tail8.data.o,ov_SC06_018_jr_801734BC.o,tail9.data.o,ov_SC06_018_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_018_CHECK_SHA := config/check.ov_SC06_018.sha ov_SC06_018_SYMBOLS := config/symbols.ov_SC06_018.txt ov_SC06_018_SIG := .run/sig.ov_SC06_018.jsonl @@ -2683,7 +2683,7 @@ ov_SC06_020_ELF := $(ov_SC06_020_OUT).elf ov_SC06_020_MAPFILE := $(ov_SC06_020_OUT).map ov_SC06_020_LD_SCRIPT := $(ov_SC06_020_OUT).ld ov_SC06_020_SPLAT_YAML := config/splat.ov_SC06_020.yaml -ov_SC06_020_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_020_jr_8012ACE0.o,tail2.data.o,ov_SC06_020_jr_8013FFD8.o,tail3.data.o,ov_SC06_020_jr_8015444C.o,tail4.data.o,ov_SC06_020_jr_8015A3C8.o,tail5.data.o,ov_SC06_020_jr_8015AE2C.o,tail6.data.o,ov_SC06_020_jr_8016AB6C.o,tail7.data.o,ov_SC06_020_jr_801734BC.o,tail8.data.o,ov_SC06_020_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_020_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_020_jr_8012ACE0.o,tail2.data.o,ov_SC06_020_jr_801380E0.o,tail3.data.o,ov_SC06_020_jr_8013FFD8.o,tail4.data.o,ov_SC06_020_jr_8015444C.o,tail5.data.o,ov_SC06_020_jr_8015A3C8.o,tail6.data.o,ov_SC06_020_jr_8015AE2C.o,tail7.data.o,ov_SC06_020_jr_8016AB6C.o,tail8.data.o,ov_SC06_020_jr_801734BC.o,tail9.data.o,ov_SC06_020_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_020_CHECK_SHA := config/check.ov_SC06_020.sha ov_SC06_020_SYMBOLS := config/symbols.ov_SC06_020.txt ov_SC06_020_SIG := .run/sig.ov_SC06_020.jsonl @@ -2705,7 +2705,7 @@ ov_SC06_022_ELF := $(ov_SC06_022_OUT).elf ov_SC06_022_MAPFILE := $(ov_SC06_022_OUT).map ov_SC06_022_LD_SCRIPT := $(ov_SC06_022_OUT).ld ov_SC06_022_SPLAT_YAML := config/splat.ov_SC06_022.yaml -ov_SC06_022_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_022_jr_8012ACE0.o,tail2.data.o,ov_SC06_022_jr_8013FFD8.o,tail3.data.o,ov_SC06_022_jr_8015444C.o,tail4.data.o,ov_SC06_022_jr_8015A3C8.o,tail5.data.o,ov_SC06_022_jr_8015AE2C.o,tail6.data.o,ov_SC06_022_jr_8016AB6C.o,tail7.data.o,ov_SC06_022_jr_801734BC.o,tail8.data.o,ov_SC06_022_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_022_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_022_jr_8012ACE0.o,tail2.data.o,ov_SC06_022_jr_801380E0.o,tail3.data.o,ov_SC06_022_jr_8013FFD8.o,tail4.data.o,ov_SC06_022_jr_8015444C.o,tail5.data.o,ov_SC06_022_jr_8015A3C8.o,tail6.data.o,ov_SC06_022_jr_8015AE2C.o,tail7.data.o,ov_SC06_022_jr_8016AB6C.o,tail8.data.o,ov_SC06_022_jr_801734BC.o,tail9.data.o,ov_SC06_022_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_022_CHECK_SHA := config/check.ov_SC06_022.sha ov_SC06_022_SYMBOLS := config/symbols.ov_SC06_022.txt ov_SC06_022_SIG := .run/sig.ov_SC06_022.jsonl @@ -2727,7 +2727,7 @@ ov_SC06_024_ELF := $(ov_SC06_024_OUT).elf ov_SC06_024_MAPFILE := $(ov_SC06_024_OUT).map ov_SC06_024_LD_SCRIPT := $(ov_SC06_024_OUT).ld ov_SC06_024_SPLAT_YAML := config/splat.ov_SC06_024.yaml -ov_SC06_024_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_024_jr_8012ACE0.o,tail2.data.o,ov_SC06_024_jr_8013FFD8.o,tail3.data.o,ov_SC06_024_jr_8015444C.o,tail4.data.o,ov_SC06_024_jr_8015A3C8.o,tail5.data.o,ov_SC06_024_jr_8015AE2C.o,tail6.data.o,ov_SC06_024_jr_8016AB6C.o,tail7.data.o,ov_SC06_024_jr_801734BC.o,tail8.data.o,ov_SC06_024_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_024_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_024_jr_8012ACE0.o,tail2.data.o,ov_SC06_024_jr_801380E0.o,tail3.data.o,ov_SC06_024_jr_8013FFD8.o,tail4.data.o,ov_SC06_024_jr_8015444C.o,tail5.data.o,ov_SC06_024_jr_8015A3C8.o,tail6.data.o,ov_SC06_024_jr_8015AE2C.o,tail7.data.o,ov_SC06_024_jr_8016AB6C.o,tail8.data.o,ov_SC06_024_jr_801734BC.o,tail9.data.o,ov_SC06_024_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_024_CHECK_SHA := config/check.ov_SC06_024.sha ov_SC06_024_SYMBOLS := config/symbols.ov_SC06_024.txt ov_SC06_024_SIG := .run/sig.ov_SC06_024.jsonl @@ -2749,7 +2749,7 @@ ov_SC06_025_ELF := $(ov_SC06_025_OUT).elf ov_SC06_025_MAPFILE := $(ov_SC06_025_OUT).map ov_SC06_025_LD_SCRIPT := $(ov_SC06_025_OUT).ld ov_SC06_025_SPLAT_YAML := config/splat.ov_SC06_025.yaml -ov_SC06_025_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_025_jr_8012ACE0.o,tail2.data.o,ov_SC06_025_jr_8013FFD8.o,tail3.data.o,ov_SC06_025_jr_8015444C.o,tail4.data.o,ov_SC06_025_jr_8015A3C8.o,tail5.data.o,ov_SC06_025_jr_8015AE2C.o,tail6.data.o,ov_SC06_025_jr_8016AB6C.o,tail7.data.o,ov_SC06_025_jr_801734BC.o,tail8.data.o,ov_SC06_025_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_025_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_025_jr_8012ACE0.o,tail2.data.o,ov_SC06_025_jr_801380E0.o,tail3.data.o,ov_SC06_025_jr_8013FFD8.o,tail4.data.o,ov_SC06_025_jr_8015444C.o,tail5.data.o,ov_SC06_025_jr_8015A3C8.o,tail6.data.o,ov_SC06_025_jr_8015AE2C.o,tail7.data.o,ov_SC06_025_jr_8016AB6C.o,tail8.data.o,ov_SC06_025_jr_801734BC.o,tail9.data.o,ov_SC06_025_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_025_CHECK_SHA := config/check.ov_SC06_025.sha ov_SC06_025_SYMBOLS := config/symbols.ov_SC06_025.txt ov_SC06_025_SIG := .run/sig.ov_SC06_025.jsonl @@ -2771,7 +2771,7 @@ ov_SC06_027_ELF := $(ov_SC06_027_OUT).elf ov_SC06_027_MAPFILE := $(ov_SC06_027_OUT).map ov_SC06_027_LD_SCRIPT := $(ov_SC06_027_OUT).ld ov_SC06_027_SPLAT_YAML := config/splat.ov_SC06_027.yaml -ov_SC06_027_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_027_jr_8012ACE0.o,tail2.data.o,ov_SC06_027_jr_8013FFD8.o,tail3.data.o,ov_SC06_027_jr_8015444C.o,tail4.data.o,ov_SC06_027_jr_8015A3C8.o,tail5.data.o,ov_SC06_027_jr_8015AE2C.o,tail6.data.o,ov_SC06_027_jr_8016AB6C.o,tail7.data.o,ov_SC06_027_jr_801734BC.o,tail8.data.o,ov_SC06_027_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_027_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_027_jr_8012ACE0.o,tail2.data.o,ov_SC06_027_jr_801380E0.o,tail3.data.o,ov_SC06_027_jr_8013FFD8.o,tail4.data.o,ov_SC06_027_jr_8015444C.o,tail5.data.o,ov_SC06_027_jr_8015A3C8.o,tail6.data.o,ov_SC06_027_jr_8015AE2C.o,tail7.data.o,ov_SC06_027_jr_8016AB6C.o,tail8.data.o,ov_SC06_027_jr_801734BC.o,tail9.data.o,ov_SC06_027_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_027_CHECK_SHA := config/check.ov_SC06_027.sha ov_SC06_027_SYMBOLS := config/symbols.ov_SC06_027.txt ov_SC06_027_SIG := .run/sig.ov_SC06_027.jsonl @@ -2793,7 +2793,7 @@ ov_SC06_029_ELF := $(ov_SC06_029_OUT).elf ov_SC06_029_MAPFILE := $(ov_SC06_029_OUT).map ov_SC06_029_LD_SCRIPT := $(ov_SC06_029_OUT).ld ov_SC06_029_SPLAT_YAML := config/splat.ov_SC06_029.yaml -ov_SC06_029_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_029_jr_8012ACE0.o,tail2.data.o,ov_SC06_029_jr_8013FFD8.o,tail3.data.o,ov_SC06_029_jr_8015444C.o,tail4.data.o,ov_SC06_029_jr_8015A3C8.o,tail5.data.o,ov_SC06_029_jr_8015AE2C.o,tail6.data.o,ov_SC06_029_jr_8016AB6C.o,tail7.data.o,ov_SC06_029_jr_801734BC.o,tail8.data.o,ov_SC06_029_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_029_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_029_jr_8012ACE0.o,tail2.data.o,ov_SC06_029_jr_801380E0.o,tail3.data.o,ov_SC06_029_jr_8013FFD8.o,tail4.data.o,ov_SC06_029_jr_8015444C.o,tail5.data.o,ov_SC06_029_jr_8015A3C8.o,tail6.data.o,ov_SC06_029_jr_8015AE2C.o,tail7.data.o,ov_SC06_029_jr_8016AB6C.o,tail8.data.o,ov_SC06_029_jr_801734BC.o,tail9.data.o,ov_SC06_029_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_029_CHECK_SHA := config/check.ov_SC06_029.sha ov_SC06_029_SYMBOLS := config/symbols.ov_SC06_029.txt ov_SC06_029_SIG := .run/sig.ov_SC06_029.jsonl @@ -2815,7 +2815,7 @@ ov_SC06_030_ELF := $(ov_SC06_030_OUT).elf ov_SC06_030_MAPFILE := $(ov_SC06_030_OUT).map ov_SC06_030_LD_SCRIPT := $(ov_SC06_030_OUT).ld ov_SC06_030_SPLAT_YAML := config/splat.ov_SC06_030.yaml -ov_SC06_030_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_030_jr_8012ACE0.o,tail2.data.o,ov_SC06_030_jr_8013FFD8.o,tail3.data.o,ov_SC06_030_jr_8015444C.o,tail4.data.o,ov_SC06_030_jr_8015A3C8.o,tail5.data.o,ov_SC06_030_jr_8015AE2C.o,tail6.data.o,ov_SC06_030_jr_8016AB6C.o,tail7.data.o,ov_SC06_030_jr_801734BC.o,tail8.data.o,ov_SC06_030_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_030_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_030_jr_8012ACE0.o,tail2.data.o,ov_SC06_030_jr_801380E0.o,tail3.data.o,ov_SC06_030_jr_8013FFD8.o,tail4.data.o,ov_SC06_030_jr_8015444C.o,tail5.data.o,ov_SC06_030_jr_8015A3C8.o,tail6.data.o,ov_SC06_030_jr_8015AE2C.o,tail7.data.o,ov_SC06_030_jr_8016AB6C.o,tail8.data.o,ov_SC06_030_jr_801734BC.o,tail9.data.o,ov_SC06_030_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_030_CHECK_SHA := config/check.ov_SC06_030.sha ov_SC06_030_SYMBOLS := config/symbols.ov_SC06_030.txt ov_SC06_030_SIG := .run/sig.ov_SC06_030.jsonl @@ -2837,7 +2837,7 @@ ov_SC06_032_ELF := $(ov_SC06_032_OUT).elf ov_SC06_032_MAPFILE := $(ov_SC06_032_OUT).map ov_SC06_032_LD_SCRIPT := $(ov_SC06_032_OUT).ld ov_SC06_032_SPLAT_YAML := config/splat.ov_SC06_032.yaml -ov_SC06_032_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_032_jr_8012ACE0.o,tail2.data.o,ov_SC06_032_jr_8013FFD8.o,tail3.data.o,ov_SC06_032_jr_8015444C.o,tail4.data.o,ov_SC06_032_jr_8015A3C8.o,tail5.data.o,ov_SC06_032_jr_8015AE2C.o,tail6.data.o,ov_SC06_032_jr_8016AB6C.o,tail7.data.o,ov_SC06_032_jr_801734BC.o,tail8.data.o,ov_SC06_032_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_032_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_032_jr_8012ACE0.o,tail2.data.o,ov_SC06_032_jr_801380E0.o,tail3.data.o,ov_SC06_032_jr_8013FFD8.o,tail4.data.o,ov_SC06_032_jr_8015444C.o,tail5.data.o,ov_SC06_032_jr_8015A3C8.o,tail6.data.o,ov_SC06_032_jr_8015AE2C.o,tail7.data.o,ov_SC06_032_jr_8016AB6C.o,tail8.data.o,ov_SC06_032_jr_801734BC.o,tail9.data.o,ov_SC06_032_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_032_CHECK_SHA := config/check.ov_SC06_032.sha ov_SC06_032_SYMBOLS := config/symbols.ov_SC06_032.txt ov_SC06_032_SIG := .run/sig.ov_SC06_032.jsonl @@ -2859,7 +2859,7 @@ ov_SC06_033_ELF := $(ov_SC06_033_OUT).elf ov_SC06_033_MAPFILE := $(ov_SC06_033_OUT).map ov_SC06_033_LD_SCRIPT := $(ov_SC06_033_OUT).ld ov_SC06_033_SPLAT_YAML := config/splat.ov_SC06_033.yaml -ov_SC06_033_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_033_jr_8012ACE0.o,tail2.data.o,ov_SC06_033_jr_8013FFD8.o,tail3.data.o,ov_SC06_033_jr_8015444C.o,tail4.data.o,ov_SC06_033_jr_8015A3C8.o,tail5.data.o,ov_SC06_033_jr_8015AE2C.o,tail6.data.o,ov_SC06_033_jr_8016AB6C.o,tail7.data.o,ov_SC06_033_jr_801734BC.o,tail8.data.o,ov_SC06_033_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_033_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_033_jr_8012ACE0.o,tail2.data.o,ov_SC06_033_jr_801380E0.o,tail3.data.o,ov_SC06_033_jr_8013FFD8.o,tail4.data.o,ov_SC06_033_jr_8015444C.o,tail5.data.o,ov_SC06_033_jr_8015A3C8.o,tail6.data.o,ov_SC06_033_jr_8015AE2C.o,tail7.data.o,ov_SC06_033_jr_8016AB6C.o,tail8.data.o,ov_SC06_033_jr_801734BC.o,tail9.data.o,ov_SC06_033_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC06_033_CHECK_SHA := config/check.ov_SC06_033.sha ov_SC06_033_SYMBOLS := config/symbols.ov_SC06_033.txt ov_SC06_033_SIG := .run/sig.ov_SC06_033.jsonl @@ -2881,7 +2881,7 @@ ov_SC07_001_ELF := $(ov_SC07_001_OUT).elf ov_SC07_001_MAPFILE := $(ov_SC07_001_OUT).map ov_SC07_001_LD_SCRIPT := $(ov_SC07_001_OUT).ld ov_SC07_001_SPLAT_YAML := config/splat.ov_SC07_001.yaml -ov_SC07_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_001_jr_8012ACE0.o,tail2.data.o,ov_SC07_001_jr_8013FFD8.o,tail3.data.o,ov_SC07_001_jr_8015444C.o,tail4.data.o,ov_SC07_001_jr_8015A3C8.o,tail5.data.o,ov_SC07_001_jr_8015AE2C.o,tail6.data.o,ov_SC07_001_jr_8016AB6C.o,tail7.data.o,ov_SC07_001_jr_801734BC.o,tail8.data.o,ov_SC07_001_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC07_001_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_001_jr_8012ACE0.o,tail2.data.o,ov_SC07_001_jr_801380E0.o,tail3.data.o,ov_SC07_001_jr_8013FFD8.o,tail4.data.o,ov_SC07_001_jr_8015444C.o,tail5.data.o,ov_SC07_001_jr_8015A3C8.o,tail6.data.o,ov_SC07_001_jr_8015AE2C.o,tail7.data.o,ov_SC07_001_jr_8016AB6C.o,tail8.data.o,ov_SC07_001_jr_801734BC.o,tail9.data.o,ov_SC07_001_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC07_001_CHECK_SHA := config/check.ov_SC07_001.sha ov_SC07_001_SYMBOLS := config/symbols.ov_SC07_001.txt ov_SC07_001_SIG := .run/sig.ov_SC07_001.jsonl @@ -2903,7 +2903,7 @@ ov_SC07_002_ELF := $(ov_SC07_002_OUT).elf ov_SC07_002_MAPFILE := $(ov_SC07_002_OUT).map ov_SC07_002_LD_SCRIPT := $(ov_SC07_002_OUT).ld ov_SC07_002_SPLAT_YAML := config/splat.ov_SC07_002.yaml -ov_SC07_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_002_jr_8012ACE0.o,tail2.data.o,ov_SC07_002_jr_8013FFD8.o,tail3.data.o,ov_SC07_002_jr_8015444C.o,tail4.data.o,ov_SC07_002_jr_8015A3C8.o,tail5.data.o,ov_SC07_002_jr_8015AE2C.o,tail6.data.o,ov_SC07_002_jr_8016AB6C.o,tail7.data.o,ov_SC07_002_jr_801734BC.o,tail8.data.o,ov_SC07_002_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC07_002_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_002_jr_8012ACE0.o,tail2.data.o,ov_SC07_002_jr_801380E0.o,tail3.data.o,ov_SC07_002_jr_8013FFD8.o,tail4.data.o,ov_SC07_002_jr_8015444C.o,tail5.data.o,ov_SC07_002_jr_8015A3C8.o,tail6.data.o,ov_SC07_002_jr_8015AE2C.o,tail7.data.o,ov_SC07_002_jr_8016AB6C.o,tail8.data.o,ov_SC07_002_jr_801734BC.o,tail9.data.o,ov_SC07_002_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC07_002_CHECK_SHA := config/check.ov_SC07_002.sha ov_SC07_002_SYMBOLS := config/symbols.ov_SC07_002.txt ov_SC07_002_SIG := .run/sig.ov_SC07_002.jsonl @@ -2925,7 +2925,7 @@ ov_SC07_008_ELF := $(ov_SC07_008_OUT).elf ov_SC07_008_MAPFILE := $(ov_SC07_008_OUT).map ov_SC07_008_LD_SCRIPT := $(ov_SC07_008_OUT).ld ov_SC07_008_SPLAT_YAML := config/splat.ov_SC07_008.yaml -ov_SC07_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_008_jr_8012ACE0.o,tail2.data.o,ov_SC07_008_jr_8013FFD8.o,tail3.data.o,ov_SC07_008_jr_8015444C.o,tail4.data.o,ov_SC07_008_jr_8015A3C8.o,tail5.data.o,ov_SC07_008_jr_8015AE2C.o,tail6.data.o,ov_SC07_008_jr_8016AB6C.o,tail7.data.o,ov_SC07_008_jr_801734BC.o,tail8.data.o,ov_SC07_008_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC07_008_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_008_jr_8012ACE0.o,tail2.data.o,ov_SC07_008_jr_801380E0.o,tail3.data.o,ov_SC07_008_jr_8013FFD8.o,tail4.data.o,ov_SC07_008_jr_8015444C.o,tail5.data.o,ov_SC07_008_jr_8015A3C8.o,tail6.data.o,ov_SC07_008_jr_8015AE2C.o,tail7.data.o,ov_SC07_008_jr_8016AB6C.o,tail8.data.o,ov_SC07_008_jr_801734BC.o,tail9.data.o,ov_SC07_008_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC07_008_CHECK_SHA := config/check.ov_SC07_008.sha ov_SC07_008_SYMBOLS := config/symbols.ov_SC07_008.txt ov_SC07_008_SIG := .run/sig.ov_SC07_008.jsonl @@ -2947,7 +2947,7 @@ ov_SC07_009_ELF := $(ov_SC07_009_OUT).elf ov_SC07_009_MAPFILE := $(ov_SC07_009_OUT).map ov_SC07_009_LD_SCRIPT := $(ov_SC07_009_OUT).ld ov_SC07_009_SPLAT_YAML := config/splat.ov_SC07_009.yaml -ov_SC07_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_009_jr_8012ACE0.o,tail2.data.o,ov_SC07_009_jr_8013FFD8.o,tail3.data.o,ov_SC07_009_jr_8015444C.o,tail4.data.o,ov_SC07_009_jr_8015A3C8.o,tail5.data.o,ov_SC07_009_jr_8015AE2C.o,tail6.data.o,ov_SC07_009_jr_8016AB6C.o,tail7.data.o,ov_SC07_009_jr_801734BC.o,tail8.data.o,ov_SC07_009_jr_80178D40.o,tail9.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC07_009_JTBL_INTERLEAVE := --order tail.data.o,ov_SC07_009_jr_8012ACE0.o,tail2.data.o,ov_SC07_009_jr_801380E0.o,tail3.data.o,ov_SC07_009_jr_8013FFD8.o,tail4.data.o,ov_SC07_009_jr_8015444C.o,tail5.data.o,ov_SC07_009_jr_8015A3C8.o,tail6.data.o,ov_SC07_009_jr_8015AE2C.o,tail7.data.o,ov_SC07_009_jr_8016AB6C.o,tail8.data.o,ov_SC07_009_jr_801734BC.o,tail9.data.o,ov_SC07_009_jr_80178D40.o,tail10.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve ov_SC07_009_CHECK_SHA := config/check.ov_SC07_009.sha ov_SC07_009_SYMBOLS := config/symbols.ov_SC07_009.txt ov_SC07_009_SIG := .run/sig.ov_SC07_009.jsonl diff --git a/config/splat.ov_SC01_000.yaml b/config/splat.ov_SC01_000.yaml index 33b5751b0..8e3d7046a 100644 --- a/config/splat.ov_SC01_000.yaml +++ b/config/splat.ov_SC01_000.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_000] - [0x2b88, c, ov_SC01_000_jr_8012ACE0] + - [0xff88, c, ov_SC01_000_jr_801380E0] - [0x17e80, c, ov_SC01_000_jr_8013FFD8] - [0x1CA44, c, ov_SC01_000_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_000_after] @@ -108,22 +109,24 @@ segments: - [0x56a64, data, tail] - [0x7b1c4, .rodata, ov_SC01_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7b290, data, tail2] + - [0x7b33c, .rodata, ov_SC01_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7b3a0, data, tail3] - [0x7b9e4, .rodata, ov_SC01_000_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7ba18, data, tail3] + - [0x7ba18, data, tail4] - [0x7ba80, .rodata, ov_SC01_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7baec, data, tail4] + - [0x7baec, data, tail5] - [0x7bc80, .rodata, ov_SC01_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bc9c, data, tail5] + - [0x7bc9c, data, tail6] - [0x7bca0, .rodata, ov_SC01_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bcbc, data, tail6] + - [0x7bcbc, data, tail7] - [0x7bd14, .rodata, ov_SC01_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bd34, data, tail7] + - [0x7bd34, data, tail8] - [0x7bdb4, .rodata, ov_SC01_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bdc8, data, tail8] + - [0x7bdc8, data, tail9] - [0x7bf70, .rodata, ov_SC01_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7c0e8, data, tail9] + - [0x7c0e8, data, tail10] - [0x7c21c, .rodata, ov_SC01_000_jr_8017BEBC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7c23c, data, tail10] + - [0x7c23c, data, tail11] - [0x7D78C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7D78F] # 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_SC01_001.yaml b/config/splat.ov_SC01_001.yaml index bdb687a4f..4e1b41105 100644 --- a/config/splat.ov_SC01_001.yaml +++ b/config/splat.ov_SC01_001.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_001] - [0x2b88, c, ov_SC01_001_jr_8012ACE0] + - [0xff88, c, ov_SC01_001_jr_801380E0] - [0x17e80, c, ov_SC01_001_jr_8013FFD8] - [0x1CA44, c, ov_SC01_001_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_001_after] @@ -107,20 +108,22 @@ segments: - [0x5b6b4, data, tail] - [0xc329c, .rodata, ov_SC01_001_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc3368, data, tail2] + - [0xc3414, .rodata, ov_SC01_001_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc3478, data, tail3] - [0xc3abc, .rodata, ov_SC01_001_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3af0, data, tail3] + - [0xc3af0, data, tail4] - [0xc3b58, .rodata, ov_SC01_001_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3bc4, data, tail4] + - [0xc3bc4, data, tail5] - [0xc3d58, .rodata, ov_SC01_001_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3d74, data, tail5] + - [0xc3d74, data, tail6] - [0xc3d78, .rodata, ov_SC01_001_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3d94, data, tail6] + - [0xc3d94, data, tail7] - [0xc3dec, .rodata, ov_SC01_001_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3e0c, data, tail7] + - [0xc3e0c, data, tail8] - [0xc3e8c, .rodata, ov_SC01_001_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3ea0, data, tail8] + - [0xc3ea0, data, tail9] - [0xc4048, .rodata, ov_SC01_001_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc41c0, data, tail9] + - [0xc41c0, data, tail10] - [0xCB06C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xCB06F] # 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_SC01_004.yaml b/config/splat.ov_SC01_004.yaml index b852c4440..a737600c5 100644 --- a/config/splat.ov_SC01_004.yaml +++ b/config/splat.ov_SC01_004.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_004] - [0x2b88, c, ov_SC01_004_jr_8012ACE0] + - [0xff88, c, ov_SC01_004_jr_801380E0] - [0x17e80, c, ov_SC01_004_jr_8013FFD8] - [0x1CA44, c, ov_SC01_004_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_004_after] @@ -107,20 +108,22 @@ segments: - [0x57078, data, tail] - [0x6567c, .rodata, ov_SC01_004_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x65748, data, tail2] + - [0x657f4, .rodata, ov_SC01_004_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65858, data, tail3] - [0x65e9c, .rodata, ov_SC01_004_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65ed0, data, tail3] + - [0x65ed0, data, tail4] - [0x65f38, .rodata, ov_SC01_004_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65fa4, data, tail4] + - [0x65fa4, data, tail5] - [0x66138, .rodata, ov_SC01_004_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66154, data, tail5] + - [0x66154, data, tail6] - [0x66158, .rodata, ov_SC01_004_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66174, data, tail6] + - [0x66174, data, tail7] - [0x661cc, .rodata, ov_SC01_004_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x661ec, data, tail7] + - [0x661ec, data, tail8] - [0x6626c, .rodata, ov_SC01_004_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66280, data, tail8] + - [0x66280, data, tail9] - [0x66428, .rodata, ov_SC01_004_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x665a0, data, tail9] + - [0x665a0, data, tail10] - [0x68274, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x68277] # 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_SC01_005.yaml b/config/splat.ov_SC01_005.yaml index b83fbc688..02afd8df2 100644 --- a/config/splat.ov_SC01_005.yaml +++ b/config/splat.ov_SC01_005.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_005] - [0x2b88, c, ov_SC01_005_jr_8012ACE0] + - [0xff88, c, ov_SC01_005_jr_801380E0] - [0x17e80, c, ov_SC01_005_jr_8013FFD8] - [0x1CA44, c, ov_SC01_005_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_005_after] @@ -107,20 +108,22 @@ segments: - [0x5a20c, data, tail] - [0xa2ddc, .rodata, ov_SC01_005_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa2ea8, data, tail2] + - [0xa2f54, .rodata, ov_SC01_005_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa2fb8, data, tail3] - [0xa35fc, .rodata, ov_SC01_005_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa3630, data, tail3] + - [0xa3630, data, tail4] - [0xa3698, .rodata, ov_SC01_005_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa3704, data, tail4] + - [0xa3704, data, tail5] - [0xa3898, .rodata, ov_SC01_005_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa38b4, data, tail5] + - [0xa38b4, data, tail6] - [0xa38b8, .rodata, ov_SC01_005_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa38d4, data, tail6] + - [0xa38d4, data, tail7] - [0xa392c, .rodata, ov_SC01_005_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa394c, data, tail7] + - [0xa394c, data, tail8] - [0xa39cc, .rodata, ov_SC01_005_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa39e0, data, tail8] + - [0xa39e0, data, tail9] - [0xa3b88, .rodata, ov_SC01_005_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa3d00, data, tail9] + - [0xa3d00, data, tail10] - [0xA5F08, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA5F09] # 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_SC01_006.yaml b/config/splat.ov_SC01_006.yaml index 234794222..6a18f4a62 100644 --- a/config/splat.ov_SC01_006.yaml +++ b/config/splat.ov_SC01_006.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_006] - [0x2b88, c, ov_SC01_006_jr_8012ACE0] + - [0xff88, c, ov_SC01_006_jr_801380E0] - [0x17e80, c, ov_SC01_006_jr_8013FFD8] - [0x1CA44, c, ov_SC01_006_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_006_after] @@ -107,20 +108,22 @@ segments: - [0x5a20c, data, tail] - [0xa2ddc, .rodata, ov_SC01_006_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa2ea8, data, tail2] + - [0xa2f54, .rodata, ov_SC01_006_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa2fb8, data, tail3] - [0xa35fc, .rodata, ov_SC01_006_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa3630, data, tail3] + - [0xa3630, data, tail4] - [0xa3698, .rodata, ov_SC01_006_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa3704, data, tail4] + - [0xa3704, data, tail5] - [0xa3898, .rodata, ov_SC01_006_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa38b4, data, tail5] + - [0xa38b4, data, tail6] - [0xa38b8, .rodata, ov_SC01_006_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa38d4, data, tail6] + - [0xa38d4, data, tail7] - [0xa392c, .rodata, ov_SC01_006_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa394c, data, tail7] + - [0xa394c, data, tail8] - [0xa39cc, .rodata, ov_SC01_006_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa39e0, data, tail8] + - [0xa39e0, data, tail9] - [0xa3b88, .rodata, ov_SC01_006_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa3d00, data, tail9] + - [0xa3d00, data, tail10] - [0xA5F08, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA5F09] # 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_SC01_008.yaml b/config/splat.ov_SC01_008.yaml index 522ff7ef8..3026ac9b1 100644 --- a/config/splat.ov_SC01_008.yaml +++ b/config/splat.ov_SC01_008.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_008] - [0x2b88, c, ov_SC01_008_jr_8012ACE0] + - [0xff88, c, ov_SC01_008_jr_801380E0] - [0x17e80, c, ov_SC01_008_jr_8013FFD8] - [0x1CA44, c, ov_SC01_008_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_008_after] @@ -107,20 +108,22 @@ segments: - [0x575ec, data, tail] - [0x7888c, .rodata, ov_SC01_008_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x78958, data, tail2] + - [0x78a04, .rodata, ov_SC01_008_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x78a68, data, tail3] - [0x790ac, .rodata, ov_SC01_008_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x790e0, data, tail3] + - [0x790e0, data, tail4] - [0x79148, .rodata, ov_SC01_008_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x791b4, data, tail4] + - [0x791b4, data, tail5] - [0x79348, .rodata, ov_SC01_008_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x79364, data, tail5] + - [0x79364, data, tail6] - [0x79368, .rodata, ov_SC01_008_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x79384, data, tail6] + - [0x79384, data, tail7] - [0x793dc, .rodata, ov_SC01_008_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x793fc, data, tail7] + - [0x793fc, data, tail8] - [0x7947c, .rodata, ov_SC01_008_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x79490, data, tail8] + - [0x79490, data, tail9] - [0x79638, .rodata, ov_SC01_008_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x797b0, data, tail9] + - [0x797b0, data, tail10] - [0x7B484, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7B487] # 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_SC01_009.yaml b/config/splat.ov_SC01_009.yaml index 11280eabc..d216dc850 100644 --- a/config/splat.ov_SC01_009.yaml +++ b/config/splat.ov_SC01_009.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_009] - [0x2b88, c, ov_SC01_009_jr_8012ACE0] + - [0xff88, c, ov_SC01_009_jr_801380E0] - [0x17e80, c, ov_SC01_009_jr_8013FFD8] - [0x1CA44, c, ov_SC01_009_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_009_after] @@ -107,20 +108,22 @@ segments: - [0x5a7d4, data, tail] - [0xc8650, .rodata, ov_SC01_009_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc871c, data, tail2] + - [0xc87c8, .rodata, ov_SC01_009_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc882c, data, tail3] - [0xc8e70, .rodata, ov_SC01_009_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc8ea4, data, tail3] + - [0xc8ea4, data, tail4] - [0xc8f0c, .rodata, ov_SC01_009_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc8f78, data, tail4] + - [0xc8f78, data, tail5] - [0xc910c, .rodata, ov_SC01_009_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc9128, data, tail5] + - [0xc9128, data, tail6] - [0xc912c, .rodata, ov_SC01_009_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc9148, data, tail6] + - [0xc9148, data, tail7] - [0xc91a0, .rodata, ov_SC01_009_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc91c0, data, tail7] + - [0xc91c0, data, tail8] - [0xc9240, .rodata, ov_SC01_009_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc9254, data, tail8] + - [0xc9254, data, tail9] - [0xc93fc, .rodata, ov_SC01_009_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc9574, data, tail9] + - [0xc9574, data, tail10] - [0xCB304, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xCB307] # 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_SC01_074.yaml b/config/splat.ov_SC01_074.yaml index 5e4aa48c9..ad00f16de 100644 --- a/config/splat.ov_SC01_074.yaml +++ b/config/splat.ov_SC01_074.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_074] - [0x2b88, c, ov_SC01_074_jr_8012ACE0] + - [0xff88, c, ov_SC01_074_jr_801380E0] - [0x17e80, c, ov_SC01_074_jr_8013FFD8] - [0x1CA44, c, ov_SC01_074_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_074_after] @@ -107,20 +108,22 @@ segments: - [0x56454, data, tail] - [0x716e0, .rodata, ov_SC01_074_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x717ac, data, tail2] + - [0x71858, .rodata, ov_SC01_074_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x718bc, data, tail3] - [0x71f00, .rodata, ov_SC01_074_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71f34, data, tail3] + - [0x71f34, data, tail4] - [0x71f9c, .rodata, ov_SC01_074_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72008, data, tail4] + - [0x72008, data, tail5] - [0x7219c, .rodata, ov_SC01_074_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x721b8, data, tail5] + - [0x721b8, data, tail6] - [0x721bc, .rodata, ov_SC01_074_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x721d8, data, tail6] + - [0x721d8, data, tail7] - [0x72230, .rodata, ov_SC01_074_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72250, data, tail7] + - [0x72250, data, tail8] - [0x722d0, .rodata, ov_SC01_074_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x722e4, data, tail8] + - [0x722e4, data, tail9] - [0x7248c, .rodata, ov_SC01_074_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72604, data, tail9] + - [0x72604, data, tail10] - [0x73C14, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x73C17] # 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_SC01_080.yaml b/config/splat.ov_SC01_080.yaml index 9a390c5b8..0ad9bc981 100644 --- a/config/splat.ov_SC01_080.yaml +++ b/config/splat.ov_SC01_080.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_080] - [0x2b88, c, ov_SC01_080_jr_8012ACE0] + - [0xff88, c, ov_SC01_080_jr_801380E0] - [0x17e80, c, ov_SC01_080_jr_8013FFD8] - [0x1CA44, c, ov_SC01_080_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_080_after] @@ -107,20 +108,22 @@ segments: - [0x5b3b4, data, tail] - [0x9b500, .rodata, ov_SC01_080_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9b5cc, data, tail2] + - [0x9b678, .rodata, ov_SC01_080_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9b6dc, data, tail3] - [0x9bd20, .rodata, ov_SC01_080_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9bd54, data, tail3] + - [0x9bd54, data, tail4] - [0x9bdbc, .rodata, ov_SC01_080_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9be28, data, tail4] + - [0x9be28, data, tail5] - [0x9bfbc, .rodata, ov_SC01_080_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9bfd8, data, tail5] + - [0x9bfd8, data, tail6] - [0x9bfdc, .rodata, ov_SC01_080_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9bff8, data, tail6] + - [0x9bff8, data, tail7] - [0x9c050, .rodata, ov_SC01_080_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c070, data, tail7] + - [0x9c070, data, tail8] - [0x9c0f0, .rodata, ov_SC01_080_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c104, data, tail8] + - [0x9c104, data, tail9] - [0x9c2ac, .rodata, ov_SC01_080_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c424, data, tail9] + - [0x9c424, data, tail10] - [0x9FDF4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9FDF7] # 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_SC01_084.yaml b/config/splat.ov_SC01_084.yaml index 882d728cb..49ce680a0 100644 --- a/config/splat.ov_SC01_084.yaml +++ b/config/splat.ov_SC01_084.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC01_084] - [0x2b88, c, ov_SC01_084_jr_8012ACE0] + - [0xff88, c, ov_SC01_084_jr_801380E0] - [0x17e80, c, ov_SC01_084_jr_8013FFD8] - [0x1CA44, c, ov_SC01_084_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC01_084_after] @@ -107,20 +108,22 @@ segments: - [0x5e6a8, data, tail] - [0x9ced0, .rodata, ov_SC01_084_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9cf9c, data, tail2] + - [0x9d048, .rodata, ov_SC01_084_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9d0ac, data, tail3] - [0x9d6f0, .rodata, ov_SC01_084_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d724, data, tail3] + - [0x9d724, data, tail4] - [0x9d78c, .rodata, ov_SC01_084_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d7f8, data, tail4] + - [0x9d7f8, data, tail5] - [0x9d98c, .rodata, ov_SC01_084_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d9a8, data, tail5] + - [0x9d9a8, data, tail6] - [0x9d9ac, .rodata, ov_SC01_084_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d9c8, data, tail6] + - [0x9d9c8, data, tail7] - [0x9da20, .rodata, ov_SC01_084_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9da40, data, tail7] + - [0x9da40, data, tail8] - [0x9dac0, .rodata, ov_SC01_084_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9dad4, data, tail8] + - [0x9dad4, data, tail9] - [0x9dc7c, .rodata, ov_SC01_084_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ddf4, data, tail9] + - [0x9ddf4, data, tail10] - [0x9FA9C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9FA9F] # 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_SC02_000.yaml b/config/splat.ov_SC02_000.yaml index a09c3b75c..17a2d9748 100644 --- a/config/splat.ov_SC02_000.yaml +++ b/config/splat.ov_SC02_000.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_000] - [0x2b88, c, ov_SC02_000_jr_8012ACE0] + - [0xff88, c, ov_SC02_000_jr_801380E0] - [0x17e80, c, ov_SC02_000_jr_8013FFD8] - [0x1CA44, c, ov_SC02_000_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_000_after] @@ -108,22 +109,24 @@ segments: - [0x62a58, data, tail] - [0xbd724, .rodata, ov_SC02_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbd7f0, data, tail2] + - [0xbd89c, .rodata, ov_SC02_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xbd900, data, tail3] - [0xbdf44, .rodata, ov_SC02_000_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbdf78, data, tail3] + - [0xbdf78, data, tail4] - [0xbdfe0, .rodata, ov_SC02_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe04c, data, tail4] + - [0xbe04c, data, tail5] - [0xbe1e0, .rodata, ov_SC02_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe1fc, data, tail5] + - [0xbe1fc, data, tail6] - [0xbe200, .rodata, ov_SC02_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe21c, data, tail6] + - [0xbe21c, data, tail7] - [0xbe274, .rodata, ov_SC02_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe294, data, tail7] + - [0xbe294, data, tail8] - [0xbe314, .rodata, ov_SC02_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe328, data, tail8] + - [0xbe328, data, tail9] - [0xbe4d0, .rodata, ov_SC02_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe648, data, tail9] + - [0xbe648, data, tail10] - [0xbe944, .rodata, ov_SC02_000_jr_8017FCB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe964, data, tail10] + - [0xbe964, data, tail11] - [0xC070C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC070F] # 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_SC02_003.yaml b/config/splat.ov_SC02_003.yaml index 9d456d1d9..ec161e930 100644 --- a/config/splat.ov_SC02_003.yaml +++ b/config/splat.ov_SC02_003.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_003] - [0x2b88, c, ov_SC02_003_jr_8012ACE0] + - [0xff88, c, ov_SC02_003_jr_801380E0] - [0x17e80, c, ov_SC02_003_jr_8013FFD8] - [0x1CA44, c, ov_SC02_003_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_003_after] @@ -108,22 +109,24 @@ segments: - [0x62a58, data, tail] - [0xbd724, .rodata, ov_SC02_003_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbd7f0, data, tail2] + - [0xbd89c, .rodata, ov_SC02_003_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xbd900, data, tail3] - [0xbdf44, .rodata, ov_SC02_003_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbdf78, data, tail3] + - [0xbdf78, data, tail4] - [0xbdfe0, .rodata, ov_SC02_003_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe04c, data, tail4] + - [0xbe04c, data, tail5] - [0xbe1e0, .rodata, ov_SC02_003_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe1fc, data, tail5] + - [0xbe1fc, data, tail6] - [0xbe200, .rodata, ov_SC02_003_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe21c, data, tail6] + - [0xbe21c, data, tail7] - [0xbe274, .rodata, ov_SC02_003_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe294, data, tail7] + - [0xbe294, data, tail8] - [0xbe314, .rodata, ov_SC02_003_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe328, data, tail8] + - [0xbe328, data, tail9] - [0xbe4d0, .rodata, ov_SC02_003_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe648, data, tail9] + - [0xbe648, data, tail10] - [0xbe944, .rodata, ov_SC02_003_jr_8017FCB0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbe964, data, tail10] + - [0xbe964, data, tail11] - [0xC070C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC070F] # 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_SC02_004.yaml b/config/splat.ov_SC02_004.yaml index e07ef255e..785dd02cb 100644 --- a/config/splat.ov_SC02_004.yaml +++ b/config/splat.ov_SC02_004.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_004] - [0x2b88, c, ov_SC02_004_jr_8012ACE0] + - [0xff88, c, ov_SC02_004_jr_801380E0] - [0x17e80, c, ov_SC02_004_jr_8013FFD8] - [0x1CA44, c, ov_SC02_004_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_004_after] @@ -107,20 +108,22 @@ segments: - [0x55b38, data, tail] - [0x6bd34, .rodata, ov_SC02_004_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6be00, data, tail2] + - [0x6beac, .rodata, ov_SC02_004_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6bf10, data, tail3] - [0x6c554, .rodata, ov_SC02_004_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c588, data, tail3] + - [0x6c588, data, tail4] - [0x6c5f0, .rodata, ov_SC02_004_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c65c, data, tail4] + - [0x6c65c, data, tail5] - [0x6c7f0, .rodata, ov_SC02_004_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c80c, data, tail5] + - [0x6c80c, data, tail6] - [0x6c810, .rodata, ov_SC02_004_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c82c, data, tail6] + - [0x6c82c, data, tail7] - [0x6c884, .rodata, ov_SC02_004_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c8a4, data, tail7] + - [0x6c8a4, data, tail8] - [0x6c924, .rodata, ov_SC02_004_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c938, data, tail8] + - [0x6c938, data, tail9] - [0x6cae0, .rodata, ov_SC02_004_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cc58, data, tail9] + - [0x6cc58, data, tail10] - [0x6E26C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6E26F] # 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_SC02_005.yaml b/config/splat.ov_SC02_005.yaml index 69d7cac2e..d69ee175a 100644 --- a/config/splat.ov_SC02_005.yaml +++ b/config/splat.ov_SC02_005.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_005] - [0x2b88, c, ov_SC02_005_jr_8012ACE0] + - [0xff88, c, ov_SC02_005_jr_801380E0] - [0x17e80, c, ov_SC02_005_jr_8013FFD8] - [0x1CA44, c, ov_SC02_005_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_005_after] @@ -107,20 +108,22 @@ segments: - [0x6873c, data, tail] - [0xb9a68, .rodata, ov_SC02_005_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb9b34, data, tail2] + - [0xb9be0, .rodata, ov_SC02_005_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb9c44, data, tail3] - [0xba288, .rodata, ov_SC02_005_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba2bc, data, tail3] + - [0xba2bc, data, tail4] - [0xba324, .rodata, ov_SC02_005_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba390, data, tail4] + - [0xba390, data, tail5] - [0xba524, .rodata, ov_SC02_005_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba540, data, tail5] + - [0xba540, data, tail6] - [0xba544, .rodata, ov_SC02_005_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba560, data, tail6] + - [0xba560, data, tail7] - [0xba5b8, .rodata, ov_SC02_005_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba5d8, data, tail7] + - [0xba5d8, data, tail8] - [0xba658, .rodata, ov_SC02_005_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba66c, data, tail8] + - [0xba66c, data, tail9] - [0xba814, .rodata, ov_SC02_005_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xba98c, data, tail9] + - [0xba98c, data, tail10] - [0xBCB00, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBCB01] # 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_SC02_011.yaml b/config/splat.ov_SC02_011.yaml index d626cf380..8381cec5a 100644 --- a/config/splat.ov_SC02_011.yaml +++ b/config/splat.ov_SC02_011.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_011] - [0x2b88, c, ov_SC02_011_jr_8012ACE0] + - [0xff88, c, ov_SC02_011_jr_801380E0] - [0x17e80, c, ov_SC02_011_jr_8013FFD8] - [0x1CA44, c, ov_SC02_011_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_011_after] @@ -107,20 +108,22 @@ segments: - [0x68b8c, data, tail] - [0xc0bc4, .rodata, ov_SC02_011_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc0c90, data, tail2] + - [0xc0d3c, .rodata, ov_SC02_011_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc0da0, data, tail3] - [0xc13e4, .rodata, ov_SC02_011_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1418, data, tail3] + - [0xc1418, data, tail4] - [0xc1480, .rodata, ov_SC02_011_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc14ec, data, tail4] + - [0xc14ec, data, tail5] - [0xc1680, .rodata, ov_SC02_011_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc169c, data, tail5] + - [0xc169c, data, tail6] - [0xc16a0, .rodata, ov_SC02_011_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc16bc, data, tail6] + - [0xc16bc, data, tail7] - [0xc1714, .rodata, ov_SC02_011_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1734, data, tail7] + - [0xc1734, data, tail8] - [0xc17b4, .rodata, ov_SC02_011_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc17c8, data, tail8] + - [0xc17c8, data, tail9] - [0xc1970, .rodata, ov_SC02_011_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1ae8, data, tail9] + - [0xc1ae8, data, tail10] - [0xC3924, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC3927] # 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_SC02_015.yaml b/config/splat.ov_SC02_015.yaml index 0e285e6de..8ae48832e 100644 --- a/config/splat.ov_SC02_015.yaml +++ b/config/splat.ov_SC02_015.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_015] - [0x2b88, c, ov_SC02_015_jr_8012ACE0] + - [0xff88, c, ov_SC02_015_jr_801380E0] - [0x17e80, c, ov_SC02_015_jr_8013FFD8] - [0x1CA44, c, ov_SC02_015_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_015_after] @@ -107,20 +108,22 @@ segments: - [0x560a0, data, tail] - [0x65e1c, .rodata, ov_SC02_015_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x65ee8, data, tail2] + - [0x65f94, .rodata, ov_SC02_015_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65ff8, data, tail3] - [0x6663c, .rodata, ov_SC02_015_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66670, data, tail3] + - [0x66670, data, tail4] - [0x666d8, .rodata, ov_SC02_015_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66744, data, tail4] + - [0x66744, data, tail5] - [0x668d8, .rodata, ov_SC02_015_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x668f4, data, tail5] + - [0x668f4, data, tail6] - [0x668f8, .rodata, ov_SC02_015_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66914, data, tail6] + - [0x66914, data, tail7] - [0x6696c, .rodata, ov_SC02_015_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6698c, data, tail7] + - [0x6698c, data, tail8] - [0x66a0c, .rodata, ov_SC02_015_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66a20, data, tail8] + - [0x66a20, data, tail9] - [0x66bc8, .rodata, ov_SC02_015_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66d40, data, tail9] + - [0x66d40, data, tail10] - [0x68544, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x68547] # 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_SC02_016.yaml b/config/splat.ov_SC02_016.yaml index bb9609c3e..5491eb55a 100644 --- a/config/splat.ov_SC02_016.yaml +++ b/config/splat.ov_SC02_016.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_016] - [0x2b88, c, ov_SC02_016_jr_8012ACE0] + - [0xff88, c, ov_SC02_016_jr_801380E0] - [0x17e80, c, ov_SC02_016_jr_8013FFD8] - [0x1CA44, c, ov_SC02_016_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_016_after] @@ -107,20 +108,22 @@ segments: - [0x5c2d8, data, tail] - [0x899fc, .rodata, ov_SC02_016_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x89ac8, data, tail2] + - [0x89b74, .rodata, ov_SC02_016_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x89bd8, data, tail3] - [0x8a21c, .rodata, ov_SC02_016_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a250, data, tail3] + - [0x8a250, data, tail4] - [0x8a2b8, .rodata, ov_SC02_016_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a324, data, tail4] + - [0x8a324, data, tail5] - [0x8a4b8, .rodata, ov_SC02_016_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a4d4, data, tail5] + - [0x8a4d4, data, tail6] - [0x8a4d8, .rodata, ov_SC02_016_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a4f4, data, tail6] + - [0x8a4f4, data, tail7] - [0x8a54c, .rodata, ov_SC02_016_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a56c, data, tail7] + - [0x8a56c, data, tail8] - [0x8a5ec, .rodata, ov_SC02_016_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a600, data, tail8] + - [0x8a600, data, tail9] - [0x8a7a8, .rodata, ov_SC02_016_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a920, data, tail9] + - [0x8a920, data, tail10] - [0x8C97C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8C97F] # 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_SC02_017.yaml b/config/splat.ov_SC02_017.yaml index 5bb469534..f07e264c3 100644 --- a/config/splat.ov_SC02_017.yaml +++ b/config/splat.ov_SC02_017.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_017] - [0x2b88, c, ov_SC02_017_jr_8012ACE0] + - [0xff88, c, ov_SC02_017_jr_801380E0] - [0x17e80, c, ov_SC02_017_jr_8013FFD8] - [0x1CA44, c, ov_SC02_017_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_017_after] @@ -107,20 +108,22 @@ segments: - [0x62330, data, tail] - [0xc521c, .rodata, ov_SC02_017_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc52e8, data, tail2] + - [0xc5394, .rodata, ov_SC02_017_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc53f8, data, tail3] - [0xc5a3c, .rodata, ov_SC02_017_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5a70, data, tail3] + - [0xc5a70, data, tail4] - [0xc5ad8, .rodata, ov_SC02_017_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5b44, data, tail4] + - [0xc5b44, data, tail5] - [0xc5cd8, .rodata, ov_SC02_017_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5cf4, data, tail5] + - [0xc5cf4, data, tail6] - [0xc5cf8, .rodata, ov_SC02_017_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5d14, data, tail6] + - [0xc5d14, data, tail7] - [0xc5d6c, .rodata, ov_SC02_017_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5d8c, data, tail7] + - [0xc5d8c, data, tail8] - [0xc5e0c, .rodata, ov_SC02_017_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5e20, data, tail8] + - [0xc5e20, data, tail9] - [0xc5fc8, .rodata, ov_SC02_017_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc6140, data, tail9] + - [0xc6140, data, tail10] - [0xC7BDC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC7BDF] # 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_SC02_021.yaml b/config/splat.ov_SC02_021.yaml index 23d433c12..0204dd8a1 100644 --- a/config/splat.ov_SC02_021.yaml +++ b/config/splat.ov_SC02_021.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_021] - [0x2b88, c, ov_SC02_021_jr_8012ACE0] + - [0xff88, c, ov_SC02_021_jr_801380E0] - [0x17e80, c, ov_SC02_021_jr_8013FFD8] - [0x1CA44, c, ov_SC02_021_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_021_after] @@ -107,20 +108,22 @@ segments: - [0x57924, data, tail] - [0x68798, .rodata, ov_SC02_021_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x68864, data, tail2] + - [0x68910, .rodata, ov_SC02_021_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x68974, data, tail3] - [0x68fb8, .rodata, ov_SC02_021_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68fec, data, tail3] + - [0x68fec, data, tail4] - [0x69054, .rodata, ov_SC02_021_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x690c0, data, tail4] + - [0x690c0, data, tail5] - [0x69254, .rodata, ov_SC02_021_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x69270, data, tail5] + - [0x69270, data, tail6] - [0x69274, .rodata, ov_SC02_021_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x69290, data, tail6] + - [0x69290, data, tail7] - [0x692e8, .rodata, ov_SC02_021_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x69308, data, tail7] + - [0x69308, data, tail8] - [0x69388, .rodata, ov_SC02_021_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6939c, data, tail8] + - [0x6939c, data, tail9] - [0x69544, .rodata, ov_SC02_021_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x696bc, data, tail9] + - [0x696bc, data, tail10] - [0x6B744, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6B747] # 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_SC02_026.yaml b/config/splat.ov_SC02_026.yaml index 21d4566b2..b8a156068 100644 --- a/config/splat.ov_SC02_026.yaml +++ b/config/splat.ov_SC02_026.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_026] - [0x2b88, c, ov_SC02_026_jr_8012ACE0] + - [0xff88, c, ov_SC02_026_jr_801380E0] - [0x17e80, c, ov_SC02_026_jr_8013FFD8] - [0x1CA44, c, ov_SC02_026_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_026_after] @@ -107,20 +108,22 @@ segments: - [0x5df78, data, tail] - [0xa5bcc, .rodata, ov_SC02_026_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa5c98, data, tail2] + - [0xa5d44, .rodata, ov_SC02_026_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa5da8, data, tail3] - [0xa63ec, .rodata, ov_SC02_026_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6420, data, tail3] + - [0xa6420, data, tail4] - [0xa6488, .rodata, ov_SC02_026_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa64f4, data, tail4] + - [0xa64f4, data, tail5] - [0xa6688, .rodata, ov_SC02_026_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa66a4, data, tail5] + - [0xa66a4, data, tail6] - [0xa66a8, .rodata, ov_SC02_026_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa66c4, data, tail6] + - [0xa66c4, data, tail7] - [0xa671c, .rodata, ov_SC02_026_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa673c, data, tail7] + - [0xa673c, data, tail8] - [0xa67bc, .rodata, ov_SC02_026_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa67d0, data, tail8] + - [0xa67d0, data, tail9] - [0xa6978, .rodata, ov_SC02_026_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6af0, data, tail9] + - [0xa6af0, data, tail10] - [0xA8164, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA8167] # 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_SC02_027.yaml b/config/splat.ov_SC02_027.yaml index cb17f4e40..f34105db1 100644 --- a/config/splat.ov_SC02_027.yaml +++ b/config/splat.ov_SC02_027.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_027] - [0x2b88, c, ov_SC02_027_jr_8012ACE0] + - [0xff88, c, ov_SC02_027_jr_801380E0] - [0x17e80, c, ov_SC02_027_jr_8013FFD8] - [0x1CA44, c, ov_SC02_027_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_027_after] @@ -107,20 +108,22 @@ segments: - [0x6309c, data, tail] - [0xaf938, .rodata, ov_SC02_027_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xafa04, data, tail2] + - [0xafab0, .rodata, ov_SC02_027_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xafb14, data, tail3] - [0xb0158, .rodata, ov_SC02_027_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb018c, data, tail3] + - [0xb018c, data, tail4] - [0xb01f4, .rodata, ov_SC02_027_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0260, data, tail4] + - [0xb0260, data, tail5] - [0xb03f4, .rodata, ov_SC02_027_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0410, data, tail5] + - [0xb0410, data, tail6] - [0xb0414, .rodata, ov_SC02_027_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb0430, data, tail6] + - [0xb0430, data, tail7] - [0xb0488, .rodata, ov_SC02_027_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb04a8, data, tail7] + - [0xb04a8, data, tail8] - [0xb0528, .rodata, ov_SC02_027_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb053c, data, tail8] + - [0xb053c, data, tail9] - [0xb06e4, .rodata, ov_SC02_027_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb085c, data, tail9] + - [0xb085c, data, tail10] - [0xB28E4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xB28E7] # 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_SC02_028.yaml b/config/splat.ov_SC02_028.yaml index c4bed3508..74c50e03c 100644 --- a/config/splat.ov_SC02_028.yaml +++ b/config/splat.ov_SC02_028.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_028] - [0x2b88, c, ov_SC02_028_jr_8012ACE0] + - [0xff88, c, ov_SC02_028_jr_801380E0] - [0x17e80, c, ov_SC02_028_jr_8013FFD8] - [0x1CA44, c, ov_SC02_028_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_028_after] @@ -107,20 +108,22 @@ segments: - [0x632a0, data, tail] - [0xa88bc, .rodata, ov_SC02_028_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa8988, data, tail2] + - [0xa8a34, .rodata, ov_SC02_028_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa8a98, data, tail3] - [0xa90dc, .rodata, ov_SC02_028_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa9110, data, tail3] + - [0xa9110, data, tail4] - [0xa9178, .rodata, ov_SC02_028_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa91e4, data, tail4] + - [0xa91e4, data, tail5] - [0xa9378, .rodata, ov_SC02_028_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa9394, data, tail5] + - [0xa9394, data, tail6] - [0xa9398, .rodata, ov_SC02_028_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa93b4, data, tail6] + - [0xa93b4, data, tail7] - [0xa940c, .rodata, ov_SC02_028_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa942c, data, tail7] + - [0xa942c, data, tail8] - [0xa94ac, .rodata, ov_SC02_028_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa94c0, data, tail8] + - [0xa94c0, data, tail9] - [0xa9668, .rodata, ov_SC02_028_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa97e0, data, tail9] + - [0xa97e0, data, tail10] - [0xAB4E4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xAB4E7] # 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_SC02_031.yaml b/config/splat.ov_SC02_031.yaml index 0c6482013..95308fcff 100644 --- a/config/splat.ov_SC02_031.yaml +++ b/config/splat.ov_SC02_031.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_031] - [0x2b88, c, ov_SC02_031_jr_8012ACE0] + - [0xff88, c, ov_SC02_031_jr_801380E0] - [0x17e80, c, ov_SC02_031_jr_8013FFD8] - [0x1CA44, c, ov_SC02_031_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_031_after] @@ -107,20 +108,22 @@ segments: - [0x5cacc, data, tail] - [0x8d0b8, .rodata, ov_SC02_031_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8d184, data, tail2] + - [0x8d230, .rodata, ov_SC02_031_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8d294, data, tail3] - [0x8d8d8, .rodata, ov_SC02_031_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8d90c, data, tail3] + - [0x8d90c, data, tail4] - [0x8d974, .rodata, ov_SC02_031_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8d9e0, data, tail4] + - [0x8d9e0, data, tail5] - [0x8db74, .rodata, ov_SC02_031_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8db90, data, tail5] + - [0x8db90, data, tail6] - [0x8db94, .rodata, ov_SC02_031_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8dbb0, data, tail6] + - [0x8dbb0, data, tail7] - [0x8dc08, .rodata, ov_SC02_031_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8dc28, data, tail7] + - [0x8dc28, data, tail8] - [0x8dca8, .rodata, ov_SC02_031_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8dcbc, data, tail8] + - [0x8dcbc, data, tail9] - [0x8de64, .rodata, ov_SC02_031_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8dfdc, data, tail9] + - [0x8dfdc, data, tail10] - [0x8F9B4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8F9B7] # 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_SC02_035.yaml b/config/splat.ov_SC02_035.yaml index 695d5f761..92672fe19 100644 --- a/config/splat.ov_SC02_035.yaml +++ b/config/splat.ov_SC02_035.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_035] - [0x2b88, c, ov_SC02_035_jr_8012ACE0] + - [0xff88, c, ov_SC02_035_jr_801380E0] - [0x17e80, c, ov_SC02_035_jr_8013FFD8] - [0x1CA44, c, ov_SC02_035_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_035_after] @@ -107,20 +108,22 @@ segments: - [0x5c32c, data, tail] - [0x94380, .rodata, ov_SC02_035_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9444c, data, tail2] + - [0x944f8, .rodata, ov_SC02_035_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9455c, data, tail3] - [0x94ba0, .rodata, ov_SC02_035_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x94bd4, data, tail3] + - [0x94bd4, data, tail4] - [0x94c3c, .rodata, ov_SC02_035_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x94ca8, data, tail4] + - [0x94ca8, data, tail5] - [0x94e3c, .rodata, ov_SC02_035_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x94e58, data, tail5] + - [0x94e58, data, tail6] - [0x94e5c, .rodata, ov_SC02_035_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x94e78, data, tail6] + - [0x94e78, data, tail7] - [0x94ed0, .rodata, ov_SC02_035_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x94ef0, data, tail7] + - [0x94ef0, data, tail8] - [0x94f70, .rodata, ov_SC02_035_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x94f84, data, tail8] + - [0x94f84, data, tail9] - [0x9512c, .rodata, ov_SC02_035_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x952a4, data, tail9] + - [0x952a4, data, tail10] - [0x968EC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x968EF] # 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_SC02_039.yaml b/config/splat.ov_SC02_039.yaml index e792ecf68..ec0a46c96 100644 --- a/config/splat.ov_SC02_039.yaml +++ b/config/splat.ov_SC02_039.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_039] - [0x2b88, c, ov_SC02_039_jr_8012ACE0] + - [0xff88, c, ov_SC02_039_jr_801380E0] - [0x17e80, c, ov_SC02_039_jr_8013FFD8] - [0x1CA44, c, ov_SC02_039_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_039_after] @@ -107,20 +108,22 @@ segments: - [0x56f58, data, tail] - [0x7676c, .rodata, ov_SC02_039_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x76838, data, tail2] + - [0x768e4, .rodata, ov_SC02_039_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x76948, data, tail3] - [0x76f8c, .rodata, ov_SC02_039_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76fc0, data, tail3] + - [0x76fc0, data, tail4] - [0x77028, .rodata, ov_SC02_039_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77094, data, tail4] + - [0x77094, data, tail5] - [0x77228, .rodata, ov_SC02_039_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77244, data, tail5] + - [0x77244, data, tail6] - [0x77248, .rodata, ov_SC02_039_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77264, data, tail6] + - [0x77264, data, tail7] - [0x772bc, .rodata, ov_SC02_039_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x772dc, data, tail7] + - [0x772dc, data, tail8] - [0x7735c, .rodata, ov_SC02_039_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77370, data, tail8] + - [0x77370, data, tail9] - [0x77518, .rodata, ov_SC02_039_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77690, data, tail9] + - [0x77690, data, tail10] - [0x78CA4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x78CA7] # 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_SC02_041.yaml b/config/splat.ov_SC02_041.yaml index 45aeeec0e..9e664daf5 100644 --- a/config/splat.ov_SC02_041.yaml +++ b/config/splat.ov_SC02_041.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC02_041] - [0x2b88, c, ov_SC02_041_jr_8012ACE0] + - [0xff88, c, ov_SC02_041_jr_801380E0] - [0x17e80, c, ov_SC02_041_jr_8013FFD8] - [0x1CA44, c, ov_SC02_041_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC02_041_after] @@ -107,20 +108,22 @@ segments: - [0x5cc28, data, tail] - [0x8ead8, .rodata, ov_SC02_041_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8eba4, data, tail2] + - [0x8ec50, .rodata, ov_SC02_041_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8ecb4, data, tail3] - [0x8f2f8, .rodata, ov_SC02_041_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f32c, data, tail3] + - [0x8f32c, data, tail4] - [0x8f394, .rodata, ov_SC02_041_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f400, data, tail4] + - [0x8f400, data, tail5] - [0x8f594, .rodata, ov_SC02_041_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f5b0, data, tail5] + - [0x8f5b0, data, tail6] - [0x8f5b4, .rodata, ov_SC02_041_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f5d0, data, tail6] + - [0x8f5d0, data, tail7] - [0x8f628, .rodata, ov_SC02_041_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f648, data, tail7] + - [0x8f648, data, tail8] - [0x8f6c8, .rodata, ov_SC02_041_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f6dc, data, tail8] + - [0x8f6dc, data, tail9] - [0x8f884, .rodata, ov_SC02_041_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f9fc, data, tail9] + - [0x8f9fc, data, tail10] - [0x9157C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9157F] # 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_001.yaml b/config/splat.ov_SC03_001.yaml index ee9eed121..6293d3091 100644 --- a/config/splat.ov_SC03_001.yaml +++ b/config/splat.ov_SC03_001.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_001] - [0x2b88, c, ov_SC03_001_jr_8012ACE0] + - [0xff88, c, ov_SC03_001_jr_801380E0] - [0x17e80, c, ov_SC03_001_jr_8013FFD8] - [0x1CA44, c, ov_SC03_001_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_001_after] @@ -107,20 +108,22 @@ segments: - [0x650c8, data, tail] - [0xc3bf8, .rodata, ov_SC03_001_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc3cc4, data, tail2] + - [0xc3d70, .rodata, ov_SC03_001_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc3dd4, data, tail3] - [0xc4418, .rodata, ov_SC03_001_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc444c, data, tail3] + - [0xc444c, data, tail4] - [0xc44b4, .rodata, ov_SC03_001_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc4520, data, tail4] + - [0xc4520, data, tail5] - [0xc46b4, .rodata, ov_SC03_001_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc46d0, data, tail5] + - [0xc46d0, data, tail6] - [0xc46d4, .rodata, ov_SC03_001_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc46f0, data, tail6] + - [0xc46f0, data, tail7] - [0xc4748, .rodata, ov_SC03_001_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc4768, data, tail7] + - [0xc4768, data, tail8] - [0xc47e8, .rodata, ov_SC03_001_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc47fc, data, tail8] + - [0xc47fc, data, tail9] - [0xc49a4, .rodata, ov_SC03_001_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc4b1c, data, tail9] + - [0xc4b1c, data, tail10] - [0xC730C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC730F] # 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_002.yaml b/config/splat.ov_SC03_002.yaml index c53d73afe..72562af0c 100644 --- a/config/splat.ov_SC03_002.yaml +++ b/config/splat.ov_SC03_002.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_002] - [0x2b88, c, ov_SC03_002_jr_8012ACE0] + - [0xff88, c, ov_SC03_002_jr_801380E0] - [0x17e80, c, ov_SC03_002_jr_8013FFD8] - [0x1CA44, c, ov_SC03_002_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_002_after] @@ -107,20 +108,22 @@ segments: - [0x5d358, data, tail] - [0xa1154, .rodata, ov_SC03_002_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa1220, data, tail2] + - [0xa12cc, .rodata, ov_SC03_002_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa1330, data, tail3] - [0xa1974, .rodata, ov_SC03_002_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa19a8, data, tail3] + - [0xa19a8, data, tail4] - [0xa1a10, .rodata, ov_SC03_002_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1a7c, data, tail4] + - [0xa1a7c, data, tail5] - [0xa1c10, .rodata, ov_SC03_002_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1c2c, data, tail5] + - [0xa1c2c, data, tail6] - [0xa1c30, .rodata, ov_SC03_002_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1c4c, data, tail6] + - [0xa1c4c, data, tail7] - [0xa1ca4, .rodata, ov_SC03_002_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1cc4, data, tail7] + - [0xa1cc4, data, tail8] - [0xa1d44, .rodata, ov_SC03_002_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1d58, data, tail8] + - [0xa1d58, data, tail9] - [0xa1f00, .rodata, ov_SC03_002_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2078, data, tail9] + - [0xa2078, data, tail10] - [0xA39F4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA39F7] # 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_003.yaml b/config/splat.ov_SC03_003.yaml index 66d1f109d..881c4b401 100644 --- a/config/splat.ov_SC03_003.yaml +++ b/config/splat.ov_SC03_003.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_003] - [0x2b88, c, ov_SC03_003_jr_8012ACE0] + - [0xff88, c, ov_SC03_003_jr_801380E0] - [0x17e80, c, ov_SC03_003_jr_8013FFD8] - [0x1CA44, c, ov_SC03_003_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_003_after] @@ -107,20 +108,22 @@ segments: - [0x57120, data, tail] - [0x654d4, .rodata, ov_SC03_003_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x655a0, data, tail2] + - [0x6564c, .rodata, ov_SC03_003_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x656b0, data, tail3] - [0x65cf4, .rodata, ov_SC03_003_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65d28, data, tail3] + - [0x65d28, data, tail4] - [0x65d90, .rodata, ov_SC03_003_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65dfc, data, tail4] + - [0x65dfc, data, tail5] - [0x65f90, .rodata, ov_SC03_003_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65fac, data, tail5] + - [0x65fac, data, tail6] - [0x65fb0, .rodata, ov_SC03_003_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65fcc, data, tail6] + - [0x65fcc, data, tail7] - [0x66024, .rodata, ov_SC03_003_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66044, data, tail7] + - [0x66044, data, tail8] - [0x660c4, .rodata, ov_SC03_003_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x660d8, data, tail8] + - [0x660d8, data, tail9] - [0x66280, .rodata, ov_SC03_003_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x663f8, data, tail9] + - [0x663f8, data, tail10] - [0x67A24, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x67A25] # 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_006.yaml b/config/splat.ov_SC03_006.yaml index 2f83a6fe0..f02ace31f 100644 --- a/config/splat.ov_SC03_006.yaml +++ b/config/splat.ov_SC03_006.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_006] - [0x2b88, c, ov_SC03_006_jr_8012ACE0] + - [0xff88, c, ov_SC03_006_jr_801380E0] - [0x17e80, c, ov_SC03_006_jr_8013FFD8] - [0x1CA44, c, ov_SC03_006_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_006_after] @@ -107,20 +108,22 @@ segments: - [0x6443c, data, tail] - [0xccd90, .rodata, ov_SC03_006_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xcce5c, data, tail2] + - [0xccf08, .rodata, ov_SC03_006_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xccf6c, data, tail3] - [0xcd5b0, .rodata, ov_SC03_006_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcd5e4, data, tail3] + - [0xcd5e4, data, tail4] - [0xcd64c, .rodata, ov_SC03_006_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcd6b8, data, tail4] + - [0xcd6b8, data, tail5] - [0xcd84c, .rodata, ov_SC03_006_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcd868, data, tail5] + - [0xcd868, data, tail6] - [0xcd86c, .rodata, ov_SC03_006_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcd888, data, tail6] + - [0xcd888, data, tail7] - [0xcd8e0, .rodata, ov_SC03_006_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcd900, data, tail7] + - [0xcd900, data, tail8] - [0xcd980, .rodata, ov_SC03_006_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcd994, data, tail8] + - [0xcd994, data, tail9] - [0xcdb3c, .rodata, ov_SC03_006_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xcdcb4, data, tail9] + - [0xcdcb4, data, tail10] - [0xCF75C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xCF75F] # 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_007.yaml b/config/splat.ov_SC03_007.yaml index 67e5a1937..e6e75964e 100644 --- a/config/splat.ov_SC03_007.yaml +++ b/config/splat.ov_SC03_007.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_007] - [0x2b88, c, ov_SC03_007_jr_8012ACE0] + - [0xff88, c, ov_SC03_007_jr_801380E0] - [0x17e80, c, ov_SC03_007_jr_8013FFD8] - [0x1CA44, c, ov_SC03_007_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_007_after] @@ -107,20 +108,22 @@ segments: - [0x5f234, data, tail] - [0xbf718, .rodata, ov_SC03_007_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbf7e4, data, tail2] + - [0xbf890, .rodata, ov_SC03_007_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xbf8f4, data, tail3] - [0xbff38, .rodata, ov_SC03_007_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbff6c, data, tail3] + - [0xbff6c, data, tail4] - [0xbffd4, .rodata, ov_SC03_007_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0040, data, tail4] + - [0xc0040, data, tail5] - [0xc01d4, .rodata, ov_SC03_007_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc01f0, data, tail5] + - [0xc01f0, data, tail6] - [0xc01f4, .rodata, ov_SC03_007_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0210, data, tail6] + - [0xc0210, data, tail7] - [0xc0268, .rodata, ov_SC03_007_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0288, data, tail7] + - [0xc0288, data, tail8] - [0xc0308, .rodata, ov_SC03_007_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc031c, data, tail8] + - [0xc031c, data, tail9] - [0xc04c4, .rodata, ov_SC03_007_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc063c, data, tail9] + - [0xc063c, data, tail10] - [0xC316C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC316F] # 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_010.yaml b/config/splat.ov_SC03_010.yaml index 27196aa28..61f8af7fd 100644 --- a/config/splat.ov_SC03_010.yaml +++ b/config/splat.ov_SC03_010.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_010] - [0x2b88, c, ov_SC03_010_jr_8012ACE0] + - [0xff88, c, ov_SC03_010_jr_801380E0] - [0x17e80, c, ov_SC03_010_jr_8013FFD8] - [0x1CA44, c, ov_SC03_010_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_010_after] @@ -107,20 +108,22 @@ segments: - [0x57d54, data, tail] - [0x759f4, .rodata, ov_SC03_010_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x75ac0, data, tail2] + - [0x75b6c, .rodata, ov_SC03_010_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x75bd0, data, tail3] - [0x76214, .rodata, ov_SC03_010_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76248, data, tail3] + - [0x76248, data, tail4] - [0x762b0, .rodata, ov_SC03_010_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7631c, data, tail4] + - [0x7631c, data, tail5] - [0x764b0, .rodata, ov_SC03_010_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x764cc, data, tail5] + - [0x764cc, data, tail6] - [0x764d0, .rodata, ov_SC03_010_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x764ec, data, tail6] + - [0x764ec, data, tail7] - [0x76544, .rodata, ov_SC03_010_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76564, data, tail7] + - [0x76564, data, tail8] - [0x765e4, .rodata, ov_SC03_010_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x765f8, data, tail8] + - [0x765f8, data, tail9] - [0x767a0, .rodata, ov_SC03_010_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76918, data, tail9] + - [0x76918, data, tail10] - [0x78074, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x78077] # 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_011.yaml b/config/splat.ov_SC03_011.yaml index ced3dcb90..f3de95a4a 100644 --- a/config/splat.ov_SC03_011.yaml +++ b/config/splat.ov_SC03_011.yaml @@ -93,7 +93,9 @@ segments: # shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at # 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave). # - [0x0, rodata, head] - - [0x0, c, ov_SC03_011] # -O2 before whale (file 0x0..0x1CA44) + - [0x0, c, ov_SC03_011] + - [0x2b88, c, ov_SC03_011_jr_8012ACE0] + - [0xff88, c, ov_SC03_011_jr_801380E0] - [0x1CA44, c, ov_SC03_011_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_011_after] - [0x2c2f4, c, ov_SC03_011_jr_8015444C] @@ -103,20 +105,22 @@ segments: - [0x4b364, c, ov_SC03_011_jr_801734BC] - [0x50be8, c, ov_SC03_011_jr_80178D40] - [0x590c4, data, tail] - - [0x77c64, .rodata, ov_SC03_011] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x77c64, .rodata, ov_SC03_011_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x77d30, data, tail2] + - [0x77ddc, .rodata, ov_SC03_011_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x77e40, data, tail3] - [0x78520, .rodata, ov_SC03_011_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7858c, data, tail3] + - [0x7858c, data, tail4] - [0x78720, .rodata, ov_SC03_011_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7873c, data, tail4] + - [0x7873c, data, tail5] - [0x78740, .rodata, ov_SC03_011_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7875c, data, tail5] + - [0x7875c, data, tail6] - [0x787b4, .rodata, ov_SC03_011_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x787d4, data, tail6] + - [0x787d4, data, tail7] - [0x78854, .rodata, ov_SC03_011_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x78868, data, tail7] + - [0x78868, data, tail8] - [0x78a10, .rodata, ov_SC03_011_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x78b88, data, tail8] + - [0x78b88, data, tail9] - [0x7A2A8, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7A2AB] # 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_012.yaml b/config/splat.ov_SC03_012.yaml index 554bc962a..fbb4f2cc6 100644 --- a/config/splat.ov_SC03_012.yaml +++ b/config/splat.ov_SC03_012.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_012] - [0x2b88, c, ov_SC03_012_jr_8012ACE0] + - [0xff88, c, ov_SC03_012_jr_801380E0] - [0x17e80, c, ov_SC03_012_jr_8013FFD8] - [0x1CA44, c, ov_SC03_012_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_012_after] @@ -107,20 +108,22 @@ segments: - [0x55fa4, data, tail] - [0x6aac0, .rodata, ov_SC03_012_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6ab8c, data, tail2] + - [0x6ac38, .rodata, ov_SC03_012_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6ac9c, data, tail3] - [0x6b2e0, .rodata, ov_SC03_012_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b314, data, tail3] + - [0x6b314, data, tail4] - [0x6b37c, .rodata, ov_SC03_012_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b3e8, data, tail4] + - [0x6b3e8, data, tail5] - [0x6b57c, .rodata, ov_SC03_012_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b598, data, tail5] + - [0x6b598, data, tail6] - [0x6b59c, .rodata, ov_SC03_012_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b5b8, data, tail6] + - [0x6b5b8, data, tail7] - [0x6b610, .rodata, ov_SC03_012_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b630, data, tail7] + - [0x6b630, data, tail8] - [0x6b6b0, .rodata, ov_SC03_012_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b6c4, data, tail8] + - [0x6b6c4, data, tail9] - [0x6b86c, .rodata, ov_SC03_012_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b9e4, data, tail9] + - [0x6b9e4, data, tail10] - [0x6D004, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6D007] # 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_013.yaml b/config/splat.ov_SC03_013.yaml index 55bb92919..ef65f4109 100644 --- a/config/splat.ov_SC03_013.yaml +++ b/config/splat.ov_SC03_013.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_013] - [0x2b88, c, ov_SC03_013_jr_8012ACE0] + - [0xff88, c, ov_SC03_013_jr_801380E0] - [0x17e80, c, ov_SC03_013_jr_8013FFD8] - [0x1CA44, c, ov_SC03_013_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_013_after] @@ -107,20 +108,22 @@ segments: - [0x58d8c, data, tail] - [0x82d58, .rodata, ov_SC03_013_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x82e24, data, tail2] + - [0x82ed0, .rodata, ov_SC03_013_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x82f34, data, tail3] - [0x83578, .rodata, ov_SC03_013_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x835ac, data, tail3] + - [0x835ac, data, tail4] - [0x83614, .rodata, ov_SC03_013_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83680, data, tail4] + - [0x83680, data, tail5] - [0x83814, .rodata, ov_SC03_013_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83830, data, tail5] + - [0x83830, data, tail6] - [0x83834, .rodata, ov_SC03_013_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83850, data, tail6] + - [0x83850, data, tail7] - [0x838a8, .rodata, ov_SC03_013_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x838c8, data, tail7] + - [0x838c8, data, tail8] - [0x83948, .rodata, ov_SC03_013_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8395c, data, tail8] + - [0x8395c, data, tail9] - [0x83b04, .rodata, ov_SC03_013_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83c7c, data, tail9] + - [0x83c7c, data, tail10] - [0x853FC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x853FF] # 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_014.yaml b/config/splat.ov_SC03_014.yaml index 6eed6d4ea..3c9d11ff4 100644 --- a/config/splat.ov_SC03_014.yaml +++ b/config/splat.ov_SC03_014.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_014] - [0x2b88, c, ov_SC03_014_jr_8012ACE0] + - [0xff88, c, ov_SC03_014_jr_801380E0] - [0x17e80, c, ov_SC03_014_jr_8013FFD8] - [0x1CA44, c, ov_SC03_014_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_014_after] @@ -107,20 +108,22 @@ segments: - [0x633c8, data, tail] - [0xc012c, .rodata, ov_SC03_014_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc01f8, data, tail2] + - [0xc02a4, .rodata, ov_SC03_014_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc0308, data, tail3] - [0xc094c, .rodata, ov_SC03_014_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0980, data, tail3] + - [0xc0980, data, tail4] - [0xc09e8, .rodata, ov_SC03_014_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0a54, data, tail4] + - [0xc0a54, data, tail5] - [0xc0be8, .rodata, ov_SC03_014_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0c04, data, tail5] + - [0xc0c04, data, tail6] - [0xc0c08, .rodata, ov_SC03_014_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0c24, data, tail6] + - [0xc0c24, data, tail7] - [0xc0c7c, .rodata, ov_SC03_014_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0c9c, data, tail7] + - [0xc0c9c, data, tail8] - [0xc0d1c, .rodata, ov_SC03_014_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0d30, data, tail8] + - [0xc0d30, data, tail9] - [0xc0ed8, .rodata, ov_SC03_014_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1050, data, tail9] + - [0xc1050, data, tail10] - [0xC2EE4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC2EE7] # 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_015.yaml b/config/splat.ov_SC03_015.yaml index 90b39f9bb..206678d06 100644 --- a/config/splat.ov_SC03_015.yaml +++ b/config/splat.ov_SC03_015.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_015] - [0x2b88, c, ov_SC03_015_jr_8012ACE0] + - [0xff88, c, ov_SC03_015_jr_801380E0] - [0x17e80, c, ov_SC03_015_jr_8013FFD8] - [0x1CA44, c, ov_SC03_015_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_015_after] @@ -107,20 +108,22 @@ segments: - [0x633c8, data, tail] - [0xc012c, .rodata, ov_SC03_015_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc01f8, data, tail2] + - [0xc02a4, .rodata, ov_SC03_015_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc0308, data, tail3] - [0xc094c, .rodata, ov_SC03_015_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0980, data, tail3] + - [0xc0980, data, tail4] - [0xc09e8, .rodata, ov_SC03_015_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0a54, data, tail4] + - [0xc0a54, data, tail5] - [0xc0be8, .rodata, ov_SC03_015_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0c04, data, tail5] + - [0xc0c04, data, tail6] - [0xc0c08, .rodata, ov_SC03_015_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0c24, data, tail6] + - [0xc0c24, data, tail7] - [0xc0c7c, .rodata, ov_SC03_015_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0c9c, data, tail7] + - [0xc0c9c, data, tail8] - [0xc0d1c, .rodata, ov_SC03_015_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc0d30, data, tail8] + - [0xc0d30, data, tail9] - [0xc0ed8, .rodata, ov_SC03_015_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1050, data, tail9] + - [0xc1050, data, tail10] - [0xC2EE4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC2EE7] # 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_023.yaml b/config/splat.ov_SC03_023.yaml index 49685c9bd..2cd6fca9d 100644 --- a/config/splat.ov_SC03_023.yaml +++ b/config/splat.ov_SC03_023.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_023] - [0x2b88, c, ov_SC03_023_jr_8012ACE0] + - [0xff88, c, ov_SC03_023_jr_801380E0] - [0x17e80, c, ov_SC03_023_jr_8013FFD8] - [0x1CA44, c, ov_SC03_023_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_023_after] @@ -107,20 +108,22 @@ segments: - [0x56d44, data, tail] - [0x6e704, .rodata, ov_SC03_023_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6e7d0, data, tail2] + - [0x6e87c, .rodata, ov_SC03_023_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6e8e0, data, tail3] - [0x6ef24, .rodata, ov_SC03_023_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6ef58, data, tail3] + - [0x6ef58, data, tail4] - [0x6efc0, .rodata, ov_SC03_023_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6f02c, data, tail4] + - [0x6f02c, data, tail5] - [0x6f1c0, .rodata, ov_SC03_023_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6f1dc, data, tail5] + - [0x6f1dc, data, tail6] - [0x6f1e0, .rodata, ov_SC03_023_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6f1fc, data, tail6] + - [0x6f1fc, data, tail7] - [0x6f254, .rodata, ov_SC03_023_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6f274, data, tail7] + - [0x6f274, data, tail8] - [0x6f2f4, .rodata, ov_SC03_023_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6f308, data, tail8] + - [0x6f308, data, tail9] - [0x6f4b0, .rodata, ov_SC03_023_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6f628, data, tail9] + - [0x6f628, data, tail10] - [0x70C2C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x70C2F] # 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_024.yaml b/config/splat.ov_SC03_024.yaml index 0bd8fbb22..15f180dbc 100644 --- a/config/splat.ov_SC03_024.yaml +++ b/config/splat.ov_SC03_024.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_024] - [0x2b88, c, ov_SC03_024_jr_8012ACE0] + - [0xff88, c, ov_SC03_024_jr_801380E0] - [0x17e80, c, ov_SC03_024_jr_8013FFD8] - [0x1CA44, c, ov_SC03_024_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_024_after] @@ -107,20 +108,22 @@ segments: - [0x5ed68, data, tail] - [0x96b8c, .rodata, ov_SC03_024_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x96c58, data, tail2] + - [0x96d04, .rodata, ov_SC03_024_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x96d68, data, tail3] - [0x973ac, .rodata, ov_SC03_024_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x973e0, data, tail3] + - [0x973e0, data, tail4] - [0x97448, .rodata, ov_SC03_024_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x974b4, data, tail4] + - [0x974b4, data, tail5] - [0x97648, .rodata, ov_SC03_024_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97664, data, tail5] + - [0x97664, data, tail6] - [0x97668, .rodata, ov_SC03_024_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97684, data, tail6] + - [0x97684, data, tail7] - [0x976dc, .rodata, ov_SC03_024_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x976fc, data, tail7] + - [0x976fc, data, tail8] - [0x9777c, .rodata, ov_SC03_024_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97790, data, tail8] + - [0x97790, data, tail9] - [0x97938, .rodata, ov_SC03_024_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97ab0, data, tail9] + - [0x97ab0, data, tail10] - [0x996F4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x996F7] # 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_028.yaml b/config/splat.ov_SC03_028.yaml index a37fefc86..1f6f95c08 100644 --- a/config/splat.ov_SC03_028.yaml +++ b/config/splat.ov_SC03_028.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_028] - [0x2b88, c, ov_SC03_028_jr_8012ACE0] + - [0xff88, c, ov_SC03_028_jr_801380E0] - [0x17e80, c, ov_SC03_028_jr_8013FFD8] - [0x1CA44, c, ov_SC03_028_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_028_after] @@ -107,20 +108,22 @@ segments: - [0x63834, data, tail] - [0xc0d14, .rodata, ov_SC03_028_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc0de0, data, tail2] + - [0xc0e8c, .rodata, ov_SC03_028_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc0ef0, data, tail3] - [0xc1534, .rodata, ov_SC03_028_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1568, data, tail3] + - [0xc1568, data, tail4] - [0xc15d0, .rodata, ov_SC03_028_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc163c, data, tail4] + - [0xc163c, data, tail5] - [0xc17d0, .rodata, ov_SC03_028_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc17ec, data, tail5] + - [0xc17ec, data, tail6] - [0xc17f0, .rodata, ov_SC03_028_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc180c, data, tail6] + - [0xc180c, data, tail7] - [0xc1864, .rodata, ov_SC03_028_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1884, data, tail7] + - [0xc1884, data, tail8] - [0xc1904, .rodata, ov_SC03_028_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1918, data, tail8] + - [0xc1918, data, tail9] - [0xc1ac0, .rodata, ov_SC03_028_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc1c38, data, tail9] + - [0xc1c38, data, tail10] - [0xC44AC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC44AF] # 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_029.yaml b/config/splat.ov_SC03_029.yaml index e5c31a39b..aaf178ce0 100644 --- a/config/splat.ov_SC03_029.yaml +++ b/config/splat.ov_SC03_029.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_029] - [0x2b88, c, ov_SC03_029_jr_8012ACE0] + - [0xff88, c, ov_SC03_029_jr_801380E0] - [0x17e80, c, ov_SC03_029_jr_8013FFD8] - [0x1CA44, c, ov_SC03_029_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_029_after] @@ -107,20 +108,22 @@ segments: - [0x5f66c, data, tail] - [0xaee48, .rodata, ov_SC03_029_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xaef14, data, tail2] + - [0xaefc0, .rodata, ov_SC03_029_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xaf024, data, tail3] - [0xaf668, .rodata, ov_SC03_029_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaf69c, data, tail3] + - [0xaf69c, data, tail4] - [0xaf704, .rodata, ov_SC03_029_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaf770, data, tail4] + - [0xaf770, data, tail5] - [0xaf904, .rodata, ov_SC03_029_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaf920, data, tail5] + - [0xaf920, data, tail6] - [0xaf924, .rodata, ov_SC03_029_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaf940, data, tail6] + - [0xaf940, data, tail7] - [0xaf998, .rodata, ov_SC03_029_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaf9b8, data, tail7] + - [0xaf9b8, data, tail8] - [0xafa38, .rodata, ov_SC03_029_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xafa4c, data, tail8] + - [0xafa4c, data, tail9] - [0xafbf4, .rodata, ov_SC03_029_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xafd6c, data, tail9] + - [0xafd6c, data, tail10] - [0xB18EC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xB18EF] # 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_030.yaml b/config/splat.ov_SC03_030.yaml index da9807168..5952c35f3 100644 --- a/config/splat.ov_SC03_030.yaml +++ b/config/splat.ov_SC03_030.yaml @@ -93,7 +93,9 @@ segments: # shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at # 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave). # - [0x0, rodata, head] - - [0x0, c, ov_SC03_030] # -O2 before whale (file 0x0..0x1CA44) + - [0x0, c, ov_SC03_030] + - [0x2b88, c, ov_SC03_030_jr_8012ACE0] + - [0xff88, c, ov_SC03_030_jr_801380E0] - [0x1CA44, c, ov_SC03_030_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_030_after] - [0x2c2f4, c, ov_SC03_030_jr_8015444C] @@ -103,20 +105,22 @@ segments: - [0x4b364, c, ov_SC03_030_jr_801734BC] - [0x50be8, c, ov_SC03_030_jr_80178D40] - [0x59ca8, data, tail] - - [0xb74ec, .rodata, ov_SC03_030] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb74ec, .rodata, ov_SC03_030_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb75b8, data, tail2] + - [0xb7664, .rodata, ov_SC03_030_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb76c8, data, tail3] - [0xb7da8, .rodata, ov_SC03_030_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7e14, data, tail3] + - [0xb7e14, data, tail4] - [0xb7fa8, .rodata, ov_SC03_030_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7fc4, data, tail4] + - [0xb7fc4, data, tail5] - [0xb7fc8, .rodata, ov_SC03_030_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7fe4, data, tail5] + - [0xb7fe4, data, tail6] - [0xb803c, .rodata, ov_SC03_030_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb805c, data, tail6] + - [0xb805c, data, tail7] - [0xb80dc, .rodata, ov_SC03_030_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb80f0, data, tail7] + - [0xb80f0, data, tail8] - [0xb8298, .rodata, ov_SC03_030_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb8410, data, tail8] + - [0xb8410, data, tail9] - [0xB9AF0] # 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 # ` - [0x, bin, trailing]` (the final 1-3 bytes spimdisasm's data path drops); diff --git a/config/splat.ov_SC03_031.yaml b/config/splat.ov_SC03_031.yaml index 4478fad19..8166dbcea 100644 --- a/config/splat.ov_SC03_031.yaml +++ b/config/splat.ov_SC03_031.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_031] - [0x2b88, c, ov_SC03_031_jr_8012ACE0] + - [0xff88, c, ov_SC03_031_jr_801380E0] - [0x17e80, c, ov_SC03_031_jr_8013FFD8] - [0x1CA44, c, ov_SC03_031_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_031_after] @@ -107,20 +108,22 @@ segments: - [0x5a1c4, data, tail] - [0x9b990, .rodata, ov_SC03_031_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9ba5c, data, tail2] + - [0x9bb08, .rodata, ov_SC03_031_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9bb6c, data, tail3] - [0x9c1b0, .rodata, ov_SC03_031_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c1e4, data, tail3] + - [0x9c1e4, data, tail4] - [0x9c24c, .rodata, ov_SC03_031_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c2b8, data, tail4] + - [0x9c2b8, data, tail5] - [0x9c44c, .rodata, ov_SC03_031_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c468, data, tail5] + - [0x9c468, data, tail6] - [0x9c46c, .rodata, ov_SC03_031_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c488, data, tail6] + - [0x9c488, data, tail7] - [0x9c4e0, .rodata, ov_SC03_031_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c500, data, tail7] + - [0x9c500, data, tail8] - [0x9c580, .rodata, ov_SC03_031_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c594, data, tail8] + - [0x9c594, data, tail9] - [0x9c73c, .rodata, ov_SC03_031_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9c8b4, data, tail9] + - [0x9c8b4, data, tail10] - [0x9E14C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9E14F] # 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_089.yaml b/config/splat.ov_SC03_089.yaml index 630dc52c6..0f0d19fec 100644 --- a/config/splat.ov_SC03_089.yaml +++ b/config/splat.ov_SC03_089.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_089] - [0x2b88, c, ov_SC03_089_jr_8012ACE0] + - [0xff88, c, ov_SC03_089_jr_801380E0] - [0x17e80, c, ov_SC03_089_jr_8013FFD8] - [0x1CA44, c, ov_SC03_089_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_089_after] @@ -107,20 +108,22 @@ segments: - [0x614c0, data, tail] - [0x9c1fc, .rodata, ov_SC03_089_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9c2c8, data, tail2] + - [0x9c374, .rodata, ov_SC03_089_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9c3d8, data, tail3] - [0x9ca1c, .rodata, ov_SC03_089_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ca50, data, tail3] + - [0x9ca50, data, tail4] - [0x9cab8, .rodata, ov_SC03_089_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9cb24, data, tail4] + - [0x9cb24, data, tail5] - [0x9ccb8, .rodata, ov_SC03_089_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ccd4, data, tail5] + - [0x9ccd4, data, tail6] - [0x9ccd8, .rodata, ov_SC03_089_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ccf4, data, tail6] + - [0x9ccf4, data, tail7] - [0x9cd4c, .rodata, ov_SC03_089_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9cd6c, data, tail7] + - [0x9cd6c, data, tail8] - [0x9cdec, .rodata, ov_SC03_089_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ce00, data, tail8] + - [0x9ce00, data, tail9] - [0x9cfa8, .rodata, ov_SC03_089_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d120, data, tail9] + - [0x9d120, data, tail10] - [0x9E7C4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9E7C7] # 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_090.yaml b/config/splat.ov_SC03_090.yaml index e5e707f2a..7e3d9e438 100644 --- a/config/splat.ov_SC03_090.yaml +++ b/config/splat.ov_SC03_090.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_090] - [0x2b88, c, ov_SC03_090_jr_8012ACE0] + - [0xff88, c, ov_SC03_090_jr_801380E0] - [0x17e80, c, ov_SC03_090_jr_8013FFD8] - [0x1CA44, c, ov_SC03_090_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_090_after] @@ -107,20 +108,22 @@ segments: - [0x638e4, data, tail] - [0xa1668, .rodata, ov_SC03_090_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa1734, data, tail2] + - [0xa17e0, .rodata, ov_SC03_090_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa1844, data, tail3] - [0xa1e88, .rodata, ov_SC03_090_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1ebc, data, tail3] + - [0xa1ebc, data, tail4] - [0xa1f24, .rodata, ov_SC03_090_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa1f90, data, tail4] + - [0xa1f90, data, tail5] - [0xa2124, .rodata, ov_SC03_090_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2140, data, tail5] + - [0xa2140, data, tail6] - [0xa2144, .rodata, ov_SC03_090_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2160, data, tail6] + - [0xa2160, data, tail7] - [0xa21b8, .rodata, ov_SC03_090_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa21d8, data, tail7] + - [0xa21d8, data, tail8] - [0xa2258, .rodata, ov_SC03_090_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa226c, data, tail8] + - [0xa226c, data, tail9] - [0xa2414, .rodata, ov_SC03_090_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa258c, data, tail9] + - [0xa258c, data, tail10] - [0xA3C34, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA3C37] # 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_091.yaml b/config/splat.ov_SC03_091.yaml index 78681f9bf..bada006af 100644 --- a/config/splat.ov_SC03_091.yaml +++ b/config/splat.ov_SC03_091.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_091] - [0x2b88, c, ov_SC03_091_jr_8012ACE0] + - [0xff88, c, ov_SC03_091_jr_801380E0] - [0x17e80, c, ov_SC03_091_jr_8013FFD8] - [0x1CA44, c, ov_SC03_091_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_091_after] @@ -108,20 +109,22 @@ segments: - [0x6478c, data, tail] - [0xa7d34, .rodata, ov_SC03_091_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa7e00, data, tail2] + - [0xa7eac, .rodata, ov_SC03_091_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa7f10, data, tail3] - [0xa8554, .rodata, ov_SC03_091_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa8588, data, tail3] + - [0xa8588, data, tail4] - [0xa85f0, .rodata, ov_SC03_091_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa865c, data, tail4] + - [0xa865c, data, tail5] - [0xa87f0, .rodata, ov_SC03_091_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa880c, data, tail5] + - [0xa880c, data, tail6] - [0xa8810, .rodata, ov_SC03_091_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa882c, data, tail6] + - [0xa882c, data, tail7] - [0xa8884, .rodata, ov_SC03_091_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa88a4, data, tail7] + - [0xa88a4, data, tail8] - [0xa8924, .rodata, ov_SC03_091_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa8938, data, tail8] + - [0xa8938, data, tail9] - [0xa8ae0, .rodata, ov_SC03_091_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa8c58, data, tail9] + - [0xa8c58, data, tail10] - [0xAA584, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xAA587] # 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_092.yaml b/config/splat.ov_SC03_092.yaml index b339d13df..0f1256084 100644 --- a/config/splat.ov_SC03_092.yaml +++ b/config/splat.ov_SC03_092.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_092] - [0x2b88, c, ov_SC03_092_jr_8012ACE0] + - [0xff88, c, ov_SC03_092_jr_801380E0] - [0x17e80, c, ov_SC03_092_jr_8013FFD8] - [0x1CA44, c, ov_SC03_092_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_092_after] @@ -107,20 +108,22 @@ segments: - [0x5cb5c, data, tail] - [0x8890c, .rodata, ov_SC03_092_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x889d8, data, tail2] + - [0x88a84, .rodata, ov_SC03_092_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x88ae8, data, tail3] - [0x8912c, .rodata, ov_SC03_092_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89160, data, tail3] + - [0x89160, data, tail4] - [0x891c8, .rodata, ov_SC03_092_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89234, data, tail4] + - [0x89234, data, tail5] - [0x893c8, .rodata, ov_SC03_092_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x893e4, data, tail5] + - [0x893e4, data, tail6] - [0x893e8, .rodata, ov_SC03_092_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89404, data, tail6] + - [0x89404, data, tail7] - [0x8945c, .rodata, ov_SC03_092_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8947c, data, tail7] + - [0x8947c, data, tail8] - [0x894fc, .rodata, ov_SC03_092_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89510, data, tail8] + - [0x89510, data, tail9] - [0x896b8, .rodata, ov_SC03_092_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89830, data, tail9] + - [0x89830, data, tail10] - [0x8AF2C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8AF2F] # 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_093.yaml b/config/splat.ov_SC03_093.yaml index fe5ae370a..20b43fddf 100644 --- a/config/splat.ov_SC03_093.yaml +++ b/config/splat.ov_SC03_093.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_093] - [0x2b88, c, ov_SC03_093_jr_8012ACE0] + - [0xff88, c, ov_SC03_093_jr_801380E0] - [0x17e80, c, ov_SC03_093_jr_8013FFD8] - [0x1CA44, c, ov_SC03_093_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_093_after] @@ -107,20 +108,22 @@ segments: - [0x5dd34, data, tail] - [0xa1d60, .rodata, ov_SC03_093_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa1e2c, data, tail2] + - [0xa1ed8, .rodata, ov_SC03_093_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa1f3c, data, tail3] - [0xa2580, .rodata, ov_SC03_093_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa25b4, data, tail3] + - [0xa25b4, data, tail4] - [0xa261c, .rodata, ov_SC03_093_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2688, data, tail4] + - [0xa2688, data, tail5] - [0xa281c, .rodata, ov_SC03_093_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2838, data, tail5] + - [0xa2838, data, tail6] - [0xa283c, .rodata, ov_SC03_093_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2858, data, tail6] + - [0xa2858, data, tail7] - [0xa28b0, .rodata, ov_SC03_093_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa28d0, data, tail7] + - [0xa28d0, data, tail8] - [0xa2950, .rodata, ov_SC03_093_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2964, data, tail8] + - [0xa2964, data, tail9] - [0xa2b0c, .rodata, ov_SC03_093_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa2c84, data, tail9] + - [0xa2c84, data, tail10] - [0xA4584, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA4587] # 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_094.yaml b/config/splat.ov_SC03_094.yaml index 165eb0a15..045a3b16b 100644 --- a/config/splat.ov_SC03_094.yaml +++ b/config/splat.ov_SC03_094.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_094] - [0x2b88, c, ov_SC03_094_jr_8012ACE0] + - [0xff88, c, ov_SC03_094_jr_801380E0] - [0x17e80, c, ov_SC03_094_jr_8013FFD8] - [0x1CA44, c, ov_SC03_094_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_094_after] @@ -107,20 +108,22 @@ segments: - [0x5f730, data, tail] - [0xa8b9c, .rodata, ov_SC03_094_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa8c68, data, tail2] + - [0xa8d14, .rodata, ov_SC03_094_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa8d78, data, tail3] - [0xa93bc, .rodata, ov_SC03_094_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa93f0, data, tail3] + - [0xa93f0, data, tail4] - [0xa9458, .rodata, ov_SC03_094_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa94c4, data, tail4] + - [0xa94c4, data, tail5] - [0xa9658, .rodata, ov_SC03_094_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa9674, data, tail5] + - [0xa9674, data, tail6] - [0xa9678, .rodata, ov_SC03_094_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa9694, data, tail6] + - [0xa9694, data, tail7] - [0xa96ec, .rodata, ov_SC03_094_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa970c, data, tail7] + - [0xa970c, data, tail8] - [0xa978c, .rodata, ov_SC03_094_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa97a0, data, tail8] + - [0xa97a0, data, tail9] - [0xa9948, .rodata, ov_SC03_094_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa9ac0, data, tail9] + - [0xa9ac0, data, tail10] - [0xAB13C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xAB13F] # 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_095.yaml b/config/splat.ov_SC03_095.yaml index d0207abde..b43c09ca0 100644 --- a/config/splat.ov_SC03_095.yaml +++ b/config/splat.ov_SC03_095.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_095] - [0x2b88, c, ov_SC03_095_jr_8012ACE0] + - [0xff88, c, ov_SC03_095_jr_801380E0] - [0x17e80, c, ov_SC03_095_jr_8013FFD8] - [0x1CA44, c, ov_SC03_095_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_095_after] @@ -107,20 +108,22 @@ segments: - [0x58d90, data, tail] - [0x717c8, .rodata, ov_SC03_095_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x71894, data, tail2] + - [0x71940, .rodata, ov_SC03_095_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x719a4, data, tail3] - [0x71fe8, .rodata, ov_SC03_095_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7201c, data, tail3] + - [0x7201c, data, tail4] - [0x72084, .rodata, ov_SC03_095_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x720f0, data, tail4] + - [0x720f0, data, tail5] - [0x72284, .rodata, ov_SC03_095_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x722a0, data, tail5] + - [0x722a0, data, tail6] - [0x722a4, .rodata, ov_SC03_095_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x722c0, data, tail6] + - [0x722c0, data, tail7] - [0x72318, .rodata, ov_SC03_095_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72338, data, tail7] + - [0x72338, data, tail8] - [0x723b8, .rodata, ov_SC03_095_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x723cc, data, tail8] + - [0x723cc, data, tail9] - [0x72574, .rodata, ov_SC03_095_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x726ec, data, tail9] + - [0x726ec, data, tail10] - [0x73D3C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x73D3F] # 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_096.yaml b/config/splat.ov_SC03_096.yaml index 022fac46a..bded03856 100644 --- a/config/splat.ov_SC03_096.yaml +++ b/config/splat.ov_SC03_096.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_096] - [0x2b88, c, ov_SC03_096_jr_8012ACE0] + - [0xff88, c, ov_SC03_096_jr_801380E0] - [0x17e80, c, ov_SC03_096_jr_8013FFD8] - [0x1CA44, c, ov_SC03_096_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_096_after] @@ -107,20 +108,22 @@ segments: - [0x58910, data, tail] - [0x7027c, .rodata, ov_SC03_096_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x70348, data, tail2] + - [0x703f4, .rodata, ov_SC03_096_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x70458, data, tail3] - [0x70a9c, .rodata, ov_SC03_096_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70ad0, data, tail3] + - [0x70ad0, data, tail4] - [0x70b38, .rodata, ov_SC03_096_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70ba4, data, tail4] + - [0x70ba4, data, tail5] - [0x70d38, .rodata, ov_SC03_096_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70d54, data, tail5] + - [0x70d54, data, tail6] - [0x70d58, .rodata, ov_SC03_096_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70d74, data, tail6] + - [0x70d74, data, tail7] - [0x70dcc, .rodata, ov_SC03_096_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70dec, data, tail7] + - [0x70dec, data, tail8] - [0x70e6c, .rodata, ov_SC03_096_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70e80, data, tail8] + - [0x70e80, data, tail9] - [0x71028, .rodata, ov_SC03_096_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x711a0, data, tail9] + - [0x711a0, data, tail10] - [0x727F4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x727F7] # 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_097.yaml b/config/splat.ov_SC03_097.yaml index 5de473a25..2ec300b5e 100644 --- a/config/splat.ov_SC03_097.yaml +++ b/config/splat.ov_SC03_097.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_097] - [0x2b88, c, ov_SC03_097_jr_8012ACE0] + - [0xff88, c, ov_SC03_097_jr_801380E0] - [0x17e80, c, ov_SC03_097_jr_8013FFD8] - [0x1CA44, c, ov_SC03_097_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_097_after] @@ -107,20 +108,22 @@ segments: - [0x5dcf0, data, tail] - [0x802ec, .rodata, ov_SC03_097_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x803b8, data, tail2] + - [0x80464, .rodata, ov_SC03_097_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x804c8, data, tail3] - [0x80b0c, .rodata, ov_SC03_097_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80b40, data, tail3] + - [0x80b40, data, tail4] - [0x80ba8, .rodata, ov_SC03_097_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80c14, data, tail4] + - [0x80c14, data, tail5] - [0x80da8, .rodata, ov_SC03_097_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80dc4, data, tail5] + - [0x80dc4, data, tail6] - [0x80dc8, .rodata, ov_SC03_097_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80de4, data, tail6] + - [0x80de4, data, tail7] - [0x80e3c, .rodata, ov_SC03_097_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80e5c, data, tail7] + - [0x80e5c, data, tail8] - [0x80edc, .rodata, ov_SC03_097_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80ef0, data, tail8] + - [0x80ef0, data, tail9] - [0x81098, .rodata, ov_SC03_097_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81210, data, tail9] + - [0x81210, data, tail10] - [0x82D74, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x82D77] # 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_098.yaml b/config/splat.ov_SC03_098.yaml index e17017d57..dd2157644 100644 --- a/config/splat.ov_SC03_098.yaml +++ b/config/splat.ov_SC03_098.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_098] - [0x2b88, c, ov_SC03_098_jr_8012ACE0] + - [0xff88, c, ov_SC03_098_jr_801380E0] - [0x17e80, c, ov_SC03_098_jr_8013FFD8] - [0x1CA44, c, ov_SC03_098_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_098_after] @@ -107,20 +108,22 @@ segments: - [0x5d17c, data, tail] - [0x9af70, .rodata, ov_SC03_098_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9b03c, data, tail2] + - [0x9b0e8, .rodata, ov_SC03_098_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9b14c, data, tail3] - [0x9b790, .rodata, ov_SC03_098_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b7c4, data, tail3] + - [0x9b7c4, data, tail4] - [0x9b82c, .rodata, ov_SC03_098_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b898, data, tail4] + - [0x9b898, data, tail5] - [0x9ba2c, .rodata, ov_SC03_098_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ba48, data, tail5] + - [0x9ba48, data, tail6] - [0x9ba4c, .rodata, ov_SC03_098_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ba68, data, tail6] + - [0x9ba68, data, tail7] - [0x9bac0, .rodata, ov_SC03_098_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9bae0, data, tail7] + - [0x9bae0, data, tail8] - [0x9bb60, .rodata, ov_SC03_098_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9bb74, data, tail8] + - [0x9bb74, data, tail9] - [0x9bd1c, .rodata, ov_SC03_098_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9be94, data, tail9] + - [0x9be94, data, tail10] - [0x9D75C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9D75F] # 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_099.yaml b/config/splat.ov_SC03_099.yaml index 377b4eb71..1901435be 100644 --- a/config/splat.ov_SC03_099.yaml +++ b/config/splat.ov_SC03_099.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_099] - [0x2b88, c, ov_SC03_099_jr_8012ACE0] + - [0xff88, c, ov_SC03_099_jr_801380E0] - [0x17e80, c, ov_SC03_099_jr_8013FFD8] - [0x1CA44, c, ov_SC03_099_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_099_after] @@ -107,20 +108,22 @@ segments: - [0x5b27c, data, tail] - [0x94c44, .rodata, ov_SC03_099_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x94d10, data, tail2] + - [0x94dbc, .rodata, ov_SC03_099_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x94e20, data, tail3] - [0x95464, .rodata, ov_SC03_099_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x95498, data, tail3] + - [0x95498, data, tail4] - [0x95500, .rodata, ov_SC03_099_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9556c, data, tail4] + - [0x9556c, data, tail5] - [0x95700, .rodata, ov_SC03_099_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9571c, data, tail5] + - [0x9571c, data, tail6] - [0x95720, .rodata, ov_SC03_099_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9573c, data, tail6] + - [0x9573c, data, tail7] - [0x95794, .rodata, ov_SC03_099_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x957b4, data, tail7] + - [0x957b4, data, tail8] - [0x95834, .rodata, ov_SC03_099_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x95848, data, tail8] + - [0x95848, data, tail9] - [0x959f0, .rodata, ov_SC03_099_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x95b68, data, tail9] + - [0x95b68, data, tail10] - [0x97304, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x97307] # 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_100.yaml b/config/splat.ov_SC03_100.yaml index 2654ec79d..d0a7e267b 100644 --- a/config/splat.ov_SC03_100.yaml +++ b/config/splat.ov_SC03_100.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_100] - [0x2b88, c, ov_SC03_100_jr_8012ACE0] + - [0xff88, c, ov_SC03_100_jr_801380E0] - [0x17e80, c, ov_SC03_100_jr_8013FFD8] - [0x1CA44, c, ov_SC03_100_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_100_after] @@ -107,20 +108,22 @@ segments: - [0x5c748, data, tail] - [0x9dec8, .rodata, ov_SC03_100_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9df94, data, tail2] + - [0x9e040, .rodata, ov_SC03_100_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9e0a4, data, tail3] - [0x9e6e8, .rodata, ov_SC03_100_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9e71c, data, tail3] + - [0x9e71c, data, tail4] - [0x9e784, .rodata, ov_SC03_100_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9e7f0, data, tail4] + - [0x9e7f0, data, tail5] - [0x9e984, .rodata, ov_SC03_100_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9e9a0, data, tail5] + - [0x9e9a0, data, tail6] - [0x9e9a4, .rodata, ov_SC03_100_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9e9c0, data, tail6] + - [0x9e9c0, data, tail7] - [0x9ea18, .rodata, ov_SC03_100_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ea38, data, tail7] + - [0x9ea38, data, tail8] - [0x9eab8, .rodata, ov_SC03_100_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9eacc, data, tail8] + - [0x9eacc, data, tail9] - [0x9ec74, .rodata, ov_SC03_100_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9edec, data, tail9] + - [0x9edec, data, tail10] - [0xA080C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA080F] # 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_101.yaml b/config/splat.ov_SC03_101.yaml index 02c3feadf..38ad62164 100644 --- a/config/splat.ov_SC03_101.yaml +++ b/config/splat.ov_SC03_101.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_101] - [0x2b88, c, ov_SC03_101_jr_8012ACE0] + - [0xff88, c, ov_SC03_101_jr_801380E0] - [0x17e80, c, ov_SC03_101_jr_8013FFD8] - [0x1CA44, c, ov_SC03_101_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_101_after] @@ -107,20 +108,22 @@ segments: - [0x5b724, data, tail] - [0x73790, .rodata, ov_SC03_101_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7385c, data, tail2] + - [0x73908, .rodata, ov_SC03_101_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7396c, data, tail3] - [0x73fb0, .rodata, ov_SC03_101_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73fe4, data, tail3] + - [0x73fe4, data, tail4] - [0x7404c, .rodata, ov_SC03_101_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x740b8, data, tail4] + - [0x740b8, data, tail5] - [0x7424c, .rodata, ov_SC03_101_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74268, data, tail5] + - [0x74268, data, tail6] - [0x7426c, .rodata, ov_SC03_101_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74288, data, tail6] + - [0x74288, data, tail7] - [0x742e0, .rodata, ov_SC03_101_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74300, data, tail7] + - [0x74300, data, tail8] - [0x74380, .rodata, ov_SC03_101_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74394, data, tail8] + - [0x74394, data, tail9] - [0x7453c, .rodata, ov_SC03_101_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x746b4, data, tail9] + - [0x746b4, data, tail10] - [0x760CC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x760CF] # 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_102.yaml b/config/splat.ov_SC03_102.yaml index f4def8282..c83cc8cb0 100644 --- a/config/splat.ov_SC03_102.yaml +++ b/config/splat.ov_SC03_102.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_102] - [0x2b88, c, ov_SC03_102_jr_8012ACE0] + - [0xff88, c, ov_SC03_102_jr_801380E0] - [0x17e80, c, ov_SC03_102_jr_8013FFD8] - [0x1CA44, c, ov_SC03_102_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_102_after] @@ -107,20 +108,22 @@ segments: - [0x5dfdc, data, tail] - [0x8f40c, .rodata, ov_SC03_102_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8f4d8, data, tail2] + - [0x8f584, .rodata, ov_SC03_102_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8f5e8, data, tail3] - [0x8fc2c, .rodata, ov_SC03_102_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fc60, data, tail3] + - [0x8fc60, data, tail4] - [0x8fcc8, .rodata, ov_SC03_102_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fd34, data, tail4] + - [0x8fd34, data, tail5] - [0x8fec8, .rodata, ov_SC03_102_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fee4, data, tail5] + - [0x8fee4, data, tail6] - [0x8fee8, .rodata, ov_SC03_102_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8ff04, data, tail6] + - [0x8ff04, data, tail7] - [0x8ff5c, .rodata, ov_SC03_102_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8ff7c, data, tail7] + - [0x8ff7c, data, tail8] - [0x8fffc, .rodata, ov_SC03_102_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90010, data, tail8] + - [0x90010, data, tail9] - [0x901b8, .rodata, ov_SC03_102_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90330, data, tail9] + - [0x90330, data, tail10] - [0x91ACC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x91ACF] # 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_103.yaml b/config/splat.ov_SC03_103.yaml index 30cc3d73a..67177519b 100644 --- a/config/splat.ov_SC03_103.yaml +++ b/config/splat.ov_SC03_103.yaml @@ -93,7 +93,9 @@ segments: # shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at # 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave). # - [0x0, rodata, head] - - [0x0, c, ov_SC03_103] # -O2 before whale (file 0x0..0x1CA44) + - [0x0, c, ov_SC03_103] + - [0x2b88, c, ov_SC03_103_jr_8012ACE0] + - [0xff88, c, ov_SC03_103_jr_801380E0] - [0x1CA44, c, ov_SC03_103_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_103_after] - [0x2c2f4, c, ov_SC03_103_jr_8015444C] @@ -103,20 +105,22 @@ segments: - [0x4b364, c, ov_SC03_103_jr_801734BC] - [0x50be8, c, ov_SC03_103_jr_80178D40] - [0x5bf8c, data, tail] - - [0x9a5c0, .rodata, ov_SC03_103] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9a5c0, .rodata, ov_SC03_103_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9a68c, data, tail2] + - [0x9a738, .rodata, ov_SC03_103_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9a79c, data, tail3] - [0x9ae7c, .rodata, ov_SC03_103_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9aee8, data, tail3] + - [0x9aee8, data, tail4] - [0x9b07c, .rodata, ov_SC03_103_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b098, data, tail4] + - [0x9b098, data, tail5] - [0x9b09c, .rodata, ov_SC03_103_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b0b8, data, tail5] + - [0x9b0b8, data, tail6] - [0x9b110, .rodata, ov_SC03_103_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b130, data, tail6] + - [0x9b130, data, tail7] - [0x9b1b0, .rodata, ov_SC03_103_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b1c4, data, tail7] + - [0x9b1c4, data, tail8] - [0x9b36c, .rodata, ov_SC03_103_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9b4e4, data, tail8] + - [0x9b4e4, data, tail9] - [0x9CC7C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9CC7F] # 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_104.yaml b/config/splat.ov_SC03_104.yaml index fcb0c6ef2..25aa6bf78 100644 --- a/config/splat.ov_SC03_104.yaml +++ b/config/splat.ov_SC03_104.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_104] - [0x2b88, c, ov_SC03_104_jr_8012ACE0] + - [0xff88, c, ov_SC03_104_jr_801380E0] - [0x17e80, c, ov_SC03_104_jr_8013FFD8] - [0x1CA44, c, ov_SC03_104_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_104_after] @@ -107,20 +108,22 @@ segments: - [0x62b1c, data, tail] - [0x95b20, .rodata, ov_SC03_104_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x95bec, data, tail2] + - [0x95c98, .rodata, ov_SC03_104_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x95cfc, data, tail3] - [0x96340, .rodata, ov_SC03_104_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x96374, data, tail3] + - [0x96374, data, tail4] - [0x963dc, .rodata, ov_SC03_104_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x96448, data, tail4] + - [0x96448, data, tail5] - [0x965dc, .rodata, ov_SC03_104_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x965f8, data, tail5] + - [0x965f8, data, tail6] - [0x965fc, .rodata, ov_SC03_104_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x96618, data, tail6] + - [0x96618, data, tail7] - [0x96670, .rodata, ov_SC03_104_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x96690, data, tail7] + - [0x96690, data, tail8] - [0x96710, .rodata, ov_SC03_104_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x96724, data, tail8] + - [0x96724, data, tail9] - [0x968cc, .rodata, ov_SC03_104_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x96a44, data, tail9] + - [0x96a44, data, tail10] - [0x9833C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9833F] # 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_105.yaml b/config/splat.ov_SC03_105.yaml index e127b468c..a65220ec2 100644 --- a/config/splat.ov_SC03_105.yaml +++ b/config/splat.ov_SC03_105.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_105] - [0x2b88, c, ov_SC03_105_jr_8012ACE0] + - [0xff88, c, ov_SC03_105_jr_801380E0] - [0x17e80, c, ov_SC03_105_jr_8013FFD8] - [0x1CA44, c, ov_SC03_105_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_105_after] @@ -107,20 +108,22 @@ segments: - [0x621a4, data, tail] - [0x8ee18, .rodata, ov_SC03_105_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8eee4, data, tail2] + - [0x8ef90, .rodata, ov_SC03_105_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8eff4, data, tail3] - [0x8f638, .rodata, ov_SC03_105_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f66c, data, tail3] + - [0x8f66c, data, tail4] - [0x8f6d4, .rodata, ov_SC03_105_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f740, data, tail4] + - [0x8f740, data, tail5] - [0x8f8d4, .rodata, ov_SC03_105_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f8f0, data, tail5] + - [0x8f8f0, data, tail6] - [0x8f8f4, .rodata, ov_SC03_105_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f910, data, tail6] + - [0x8f910, data, tail7] - [0x8f968, .rodata, ov_SC03_105_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f988, data, tail7] + - [0x8f988, data, tail8] - [0x8fa08, .rodata, ov_SC03_105_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fa1c, data, tail8] + - [0x8fa1c, data, tail9] - [0x8fbc4, .rodata, ov_SC03_105_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fd3c, data, tail9] + - [0x8fd3c, data, tail10] - [0x94BC4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x94BC7] # 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_108.yaml b/config/splat.ov_SC03_108.yaml index 00d2e4b7d..b40021cd0 100644 --- a/config/splat.ov_SC03_108.yaml +++ b/config/splat.ov_SC03_108.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_108] - [0x2b88, c, ov_SC03_108_jr_8012ACE0] + - [0xff88, c, ov_SC03_108_jr_801380E0] - [0x17e80, c, ov_SC03_108_jr_8013FFD8] - [0x1CA44, c, ov_SC03_108_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_108_after] @@ -107,20 +108,22 @@ segments: - [0x58afc, data, tail] - [0x77320, .rodata, ov_SC03_108_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x773ec, data, tail2] + - [0x77498, .rodata, ov_SC03_108_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x774fc, data, tail3] - [0x77b40, .rodata, ov_SC03_108_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77b74, data, tail3] + - [0x77b74, data, tail4] - [0x77bdc, .rodata, ov_SC03_108_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77c48, data, tail4] + - [0x77c48, data, tail5] - [0x77ddc, .rodata, ov_SC03_108_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77df8, data, tail5] + - [0x77df8, data, tail6] - [0x77dfc, .rodata, ov_SC03_108_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77e18, data, tail6] + - [0x77e18, data, tail7] - [0x77e70, .rodata, ov_SC03_108_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77e90, data, tail7] + - [0x77e90, data, tail8] - [0x77f10, .rodata, ov_SC03_108_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77f24, data, tail8] + - [0x77f24, data, tail9] - [0x780cc, .rodata, ov_SC03_108_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x78244, data, tail9] + - [0x78244, data, tail10] - [0x7994C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7994F] # 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_109.yaml b/config/splat.ov_SC03_109.yaml index 1306300b4..12ab502f1 100644 --- a/config/splat.ov_SC03_109.yaml +++ b/config/splat.ov_SC03_109.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_109] - [0x2b88, c, ov_SC03_109_jr_8012ACE0] + - [0xff88, c, ov_SC03_109_jr_801380E0] - [0x17e80, c, ov_SC03_109_jr_8013FFD8] - [0x1CA44, c, ov_SC03_109_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_109_after] @@ -107,20 +108,22 @@ segments: - [0x561a8, data, tail] - [0x6fe30, .rodata, ov_SC03_109_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6fefc, data, tail2] + - [0x6ffa8, .rodata, ov_SC03_109_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7000c, data, tail3] - [0x70650, .rodata, ov_SC03_109_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70684, data, tail3] + - [0x70684, data, tail4] - [0x706ec, .rodata, ov_SC03_109_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70758, data, tail4] + - [0x70758, data, tail5] - [0x708ec, .rodata, ov_SC03_109_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70908, data, tail5] + - [0x70908, data, tail6] - [0x7090c, .rodata, ov_SC03_109_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70928, data, tail6] + - [0x70928, data, tail7] - [0x70980, .rodata, ov_SC03_109_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x709a0, data, tail7] + - [0x709a0, data, tail8] - [0x70a20, .rodata, ov_SC03_109_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70a34, data, tail8] + - [0x70a34, data, tail9] - [0x70bdc, .rodata, ov_SC03_109_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70d54, data, tail9] + - [0x70d54, data, tail10] - [0x72354, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x72357] # 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_110.yaml b/config/splat.ov_SC03_110.yaml index 798b30308..6e2d9dde9 100644 --- a/config/splat.ov_SC03_110.yaml +++ b/config/splat.ov_SC03_110.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_110] - [0x2b88, c, ov_SC03_110_jr_8012ACE0] + - [0xff88, c, ov_SC03_110_jr_801380E0] - [0x17e80, c, ov_SC03_110_jr_8013FFD8] - [0x1CA44, c, ov_SC03_110_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_110_after] @@ -107,20 +108,22 @@ segments: - [0x59bc8, data, tail] - [0x77acc, .rodata, ov_SC03_110_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x77b98, data, tail2] + - [0x77c44, .rodata, ov_SC03_110_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x77ca8, data, tail3] - [0x782ec, .rodata, ov_SC03_110_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x78320, data, tail3] + - [0x78320, data, tail4] - [0x78388, .rodata, ov_SC03_110_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x783f4, data, tail4] + - [0x783f4, data, tail5] - [0x78588, .rodata, ov_SC03_110_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x785a4, data, tail5] + - [0x785a4, data, tail6] - [0x785a8, .rodata, ov_SC03_110_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x785c4, data, tail6] + - [0x785c4, data, tail7] - [0x7861c, .rodata, ov_SC03_110_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7863c, data, tail7] + - [0x7863c, data, tail8] - [0x786bc, .rodata, ov_SC03_110_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x786d0, data, tail8] + - [0x786d0, data, tail9] - [0x78878, .rodata, ov_SC03_110_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x789f0, data, tail9] + - [0x789f0, data, tail10] - [0x7A384, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7A387] # 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_111.yaml b/config/splat.ov_SC03_111.yaml index ffe6a254b..a4d3f337c 100644 --- a/config/splat.ov_SC03_111.yaml +++ b/config/splat.ov_SC03_111.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_111] - [0x2b88, c, ov_SC03_111_jr_8012ACE0] + - [0xff88, c, ov_SC03_111_jr_801380E0] - [0x17e80, c, ov_SC03_111_jr_8013FFD8] - [0x1CA44, c, ov_SC03_111_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_111_after] @@ -107,20 +108,22 @@ segments: - [0x5c77c, data, tail] - [0x8f04c, .rodata, ov_SC03_111_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8f118, data, tail2] + - [0x8f1c4, .rodata, ov_SC03_111_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8f228, data, tail3] - [0x8f86c, .rodata, ov_SC03_111_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f8a0, data, tail3] + - [0x8f8a0, data, tail4] - [0x8f908, .rodata, ov_SC03_111_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8f974, data, tail4] + - [0x8f974, data, tail5] - [0x8fb08, .rodata, ov_SC03_111_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fb24, data, tail5] + - [0x8fb24, data, tail6] - [0x8fb28, .rodata, ov_SC03_111_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fb44, data, tail6] + - [0x8fb44, data, tail7] - [0x8fb9c, .rodata, ov_SC03_111_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fbbc, data, tail7] + - [0x8fbbc, data, tail8] - [0x8fc3c, .rodata, ov_SC03_111_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8fc50, data, tail8] + - [0x8fc50, data, tail9] - [0x8fdf8, .rodata, ov_SC03_111_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8ff70, data, tail9] + - [0x8ff70, data, tail10] - [0x91A2C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x91A2F] # 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_112.yaml b/config/splat.ov_SC03_112.yaml index 3586ecf49..478d0a7a9 100644 --- a/config/splat.ov_SC03_112.yaml +++ b/config/splat.ov_SC03_112.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_112] - [0x2b88, c, ov_SC03_112_jr_8012ACE0] + - [0xff88, c, ov_SC03_112_jr_801380E0] - [0x17e80, c, ov_SC03_112_jr_8013FFD8] - [0x1CA44, c, ov_SC03_112_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_112_after] @@ -107,20 +108,22 @@ segments: - [0x5d584, data, tail] - [0x827b4, .rodata, ov_SC03_112_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x82880, data, tail2] + - [0x8292c, .rodata, ov_SC03_112_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x82990, data, tail3] - [0x82fd4, .rodata, ov_SC03_112_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83008, data, tail3] + - [0x83008, data, tail4] - [0x83070, .rodata, ov_SC03_112_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x830dc, data, tail4] + - [0x830dc, data, tail5] - [0x83270, .rodata, ov_SC03_112_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8328c, data, tail5] + - [0x8328c, data, tail6] - [0x83290, .rodata, ov_SC03_112_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x832ac, data, tail6] + - [0x832ac, data, tail7] - [0x83304, .rodata, ov_SC03_112_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83324, data, tail7] + - [0x83324, data, tail8] - [0x833a4, .rodata, ov_SC03_112_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x833b8, data, tail8] + - [0x833b8, data, tail9] - [0x83560, .rodata, ov_SC03_112_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x836d8, data, tail9] + - [0x836d8, data, tail10] - [0x84FF4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x84FF7] # 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_113.yaml b/config/splat.ov_SC03_113.yaml index 4d8380aad..25041448d 100644 --- a/config/splat.ov_SC03_113.yaml +++ b/config/splat.ov_SC03_113.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_113] - [0x2b88, c, ov_SC03_113_jr_8012ACE0] + - [0xff88, c, ov_SC03_113_jr_801380E0] - [0x17e80, c, ov_SC03_113_jr_8013FFD8] - [0x1CA44, c, ov_SC03_113_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_113_after] @@ -107,20 +108,22 @@ segments: - [0x5ac34, data, tail] - [0x7b43c, .rodata, ov_SC03_113_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7b508, data, tail2] + - [0x7b5b4, .rodata, ov_SC03_113_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7b618, data, tail3] - [0x7bc5c, .rodata, ov_SC03_113_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bc90, data, tail3] + - [0x7bc90, data, tail4] - [0x7bcf8, .rodata, ov_SC03_113_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bd64, data, tail4] + - [0x7bd64, data, tail5] - [0x7bef8, .rodata, ov_SC03_113_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bf14, data, tail5] + - [0x7bf14, data, tail6] - [0x7bf18, .rodata, ov_SC03_113_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bf34, data, tail6] + - [0x7bf34, data, tail7] - [0x7bf8c, .rodata, ov_SC03_113_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7bfac, data, tail7] + - [0x7bfac, data, tail8] - [0x7c02c, .rodata, ov_SC03_113_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7c040, data, tail8] + - [0x7c040, data, tail9] - [0x7c1e8, .rodata, ov_SC03_113_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7c360, data, tail9] + - [0x7c360, data, tail10] - [0x7DB94, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7DB97] # 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_114.yaml b/config/splat.ov_SC03_114.yaml index 2ec439fd5..e2f877288 100644 --- a/config/splat.ov_SC03_114.yaml +++ b/config/splat.ov_SC03_114.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_114] - [0x2b88, c, ov_SC03_114_jr_8012ACE0] + - [0xff88, c, ov_SC03_114_jr_801380E0] - [0x17e80, c, ov_SC03_114_jr_8013FFD8] - [0x1CA44, c, ov_SC03_114_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_114_after] @@ -107,20 +108,22 @@ segments: - [0x5689c, data, tail] - [0x7f148, .rodata, ov_SC03_114_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7f214, data, tail2] + - [0x7f2c0, .rodata, ov_SC03_114_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7f324, data, tail3] - [0x7f968, .rodata, ov_SC03_114_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7f99c, data, tail3] + - [0x7f99c, data, tail4] - [0x7fa04, .rodata, ov_SC03_114_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fa70, data, tail4] + - [0x7fa70, data, tail5] - [0x7fc04, .rodata, ov_SC03_114_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fc20, data, tail5] + - [0x7fc20, data, tail6] - [0x7fc24, .rodata, ov_SC03_114_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fc40, data, tail6] + - [0x7fc40, data, tail7] - [0x7fc98, .rodata, ov_SC03_114_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fcb8, data, tail7] + - [0x7fcb8, data, tail8] - [0x7fd38, .rodata, ov_SC03_114_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fd4c, data, tail8] + - [0x7fd4c, data, tail9] - [0x7fef4, .rodata, ov_SC03_114_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8006c, data, tail9] + - [0x8006c, data, tail10] - [0x8170C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8170F] # 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_115.yaml b/config/splat.ov_SC03_115.yaml index 042fb35db..8ed3da8bd 100644 --- a/config/splat.ov_SC03_115.yaml +++ b/config/splat.ov_SC03_115.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_115] - [0x2b88, c, ov_SC03_115_jr_8012ACE0] + - [0xff88, c, ov_SC03_115_jr_801380E0] - [0x17e80, c, ov_SC03_115_jr_8013FFD8] - [0x1CA44, c, ov_SC03_115_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_115_after] @@ -107,20 +108,22 @@ segments: - [0x58308, data, tail] - [0x6aabc, .rodata, ov_SC03_115_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6ab88, data, tail2] + - [0x6ac34, .rodata, ov_SC03_115_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6ac98, data, tail3] - [0x6b2dc, .rodata, ov_SC03_115_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b310, data, tail3] + - [0x6b310, data, tail4] - [0x6b378, .rodata, ov_SC03_115_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b3e4, data, tail4] + - [0x6b3e4, data, tail5] - [0x6b578, .rodata, ov_SC03_115_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b594, data, tail5] + - [0x6b594, data, tail6] - [0x6b598, .rodata, ov_SC03_115_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b5b4, data, tail6] + - [0x6b5b4, data, tail7] - [0x6b60c, .rodata, ov_SC03_115_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b62c, data, tail7] + - [0x6b62c, data, tail8] - [0x6b6ac, .rodata, ov_SC03_115_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b6c0, data, tail8] + - [0x6b6c0, data, tail9] - [0x6b868, .rodata, ov_SC03_115_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b9e0, data, tail9] + - [0x6b9e0, data, tail10] - [0x6CFE4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6CFE7] # 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_116.yaml b/config/splat.ov_SC03_116.yaml index 60f7d1d48..0067c757c 100644 --- a/config/splat.ov_SC03_116.yaml +++ b/config/splat.ov_SC03_116.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_116] - [0x2b88, c, ov_SC03_116_jr_8012ACE0] + - [0xff88, c, ov_SC03_116_jr_801380E0] - [0x17e80, c, ov_SC03_116_jr_8013FFD8] - [0x1CA44, c, ov_SC03_116_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_116_after] @@ -107,20 +108,22 @@ segments: - [0x5a70c, data, tail] - [0x6d658, .rodata, ov_SC03_116_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6d724, data, tail2] + - [0x6d7d0, .rodata, ov_SC03_116_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6d834, data, tail3] - [0x6de78, .rodata, ov_SC03_116_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6deac, data, tail3] + - [0x6deac, data, tail4] - [0x6df14, .rodata, ov_SC03_116_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6df80, data, tail4] + - [0x6df80, data, tail5] - [0x6e114, .rodata, ov_SC03_116_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e130, data, tail5] + - [0x6e130, data, tail6] - [0x6e134, .rodata, ov_SC03_116_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e150, data, tail6] + - [0x6e150, data, tail7] - [0x6e1a8, .rodata, ov_SC03_116_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e1c8, data, tail7] + - [0x6e1c8, data, tail8] - [0x6e248, .rodata, ov_SC03_116_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e25c, data, tail8] + - [0x6e25c, data, tail9] - [0x6e404, .rodata, ov_SC03_116_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e57c, data, tail9] + - [0x6e57c, data, tail10] - [0x6FBF4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6FBF7] # 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_117.yaml b/config/splat.ov_SC03_117.yaml index a1160a3e0..7076b0235 100644 --- a/config/splat.ov_SC03_117.yaml +++ b/config/splat.ov_SC03_117.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_117] - [0x2b88, c, ov_SC03_117_jr_8012ACE0] + - [0xff88, c, ov_SC03_117_jr_801380E0] - [0x17e80, c, ov_SC03_117_jr_8013FFD8] - [0x1CA44, c, ov_SC03_117_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_117_after] @@ -107,20 +108,22 @@ segments: - [0x5c718, data, tail] - [0xa3cf8, .rodata, ov_SC03_117_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa3dc4, data, tail2] + - [0xa3e70, .rodata, ov_SC03_117_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa3ed4, data, tail3] - [0xa4518, .rodata, ov_SC03_117_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa454c, data, tail3] + - [0xa454c, data, tail4] - [0xa45b4, .rodata, ov_SC03_117_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa4620, data, tail4] + - [0xa4620, data, tail5] - [0xa47b4, .rodata, ov_SC03_117_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa47d0, data, tail5] + - [0xa47d0, data, tail6] - [0xa47d4, .rodata, ov_SC03_117_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa47f0, data, tail6] + - [0xa47f0, data, tail7] - [0xa4848, .rodata, ov_SC03_117_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa4868, data, tail7] + - [0xa4868, data, tail8] - [0xa48e8, .rodata, ov_SC03_117_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa48fc, data, tail8] + - [0xa48fc, data, tail9] - [0xa4aa4, .rodata, ov_SC03_117_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa4c1c, data, tail9] + - [0xa4c1c, data, tail10] - [0xA67EC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA67EF] # 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_118.yaml b/config/splat.ov_SC03_118.yaml index 27cfb7c70..4ea6db863 100644 --- a/config/splat.ov_SC03_118.yaml +++ b/config/splat.ov_SC03_118.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_118] - [0x2b88, c, ov_SC03_118_jr_8012ACE0] + - [0xff88, c, ov_SC03_118_jr_801380E0] - [0x17e80, c, ov_SC03_118_jr_8013FFD8] - [0x1CA44, c, ov_SC03_118_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_118_after] @@ -107,20 +108,22 @@ segments: - [0x617c4, data, tail] - [0xa9c54, .rodata, ov_SC03_118_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa9d20, data, tail2] + - [0xa9dcc, .rodata, ov_SC03_118_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa9e30, data, tail3] - [0xaa474, .rodata, ov_SC03_118_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa4a8, data, tail3] + - [0xaa4a8, data, tail4] - [0xaa510, .rodata, ov_SC03_118_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa57c, data, tail4] + - [0xaa57c, data, tail5] - [0xaa710, .rodata, ov_SC03_118_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa72c, data, tail5] + - [0xaa72c, data, tail6] - [0xaa730, .rodata, ov_SC03_118_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa74c, data, tail6] + - [0xaa74c, data, tail7] - [0xaa7a4, .rodata, ov_SC03_118_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa7c4, data, tail7] + - [0xaa7c4, data, tail8] - [0xaa844, .rodata, ov_SC03_118_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa858, data, tail8] + - [0xaa858, data, tail9] - [0xaaa00, .rodata, ov_SC03_118_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaab78, data, tail9] + - [0xaab78, data, tail10] - [0xAC6F4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xAC6F7] # 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_119.yaml b/config/splat.ov_SC03_119.yaml index 92d38833a..2400962dc 100644 --- a/config/splat.ov_SC03_119.yaml +++ b/config/splat.ov_SC03_119.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_119] - [0x2b88, c, ov_SC03_119_jr_8012ACE0] + - [0xff88, c, ov_SC03_119_jr_801380E0] - [0x17e80, c, ov_SC03_119_jr_8013FFD8] - [0x1CA44, c, ov_SC03_119_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_119_after] @@ -107,20 +108,22 @@ segments: - [0x617c4, data, tail] - [0xa9c54, .rodata, ov_SC03_119_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa9d20, data, tail2] + - [0xa9dcc, .rodata, ov_SC03_119_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa9e30, data, tail3] - [0xaa474, .rodata, ov_SC03_119_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa4a8, data, tail3] + - [0xaa4a8, data, tail4] - [0xaa510, .rodata, ov_SC03_119_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa57c, data, tail4] + - [0xaa57c, data, tail5] - [0xaa710, .rodata, ov_SC03_119_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa72c, data, tail5] + - [0xaa72c, data, tail6] - [0xaa730, .rodata, ov_SC03_119_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa74c, data, tail6] + - [0xaa74c, data, tail7] - [0xaa7a4, .rodata, ov_SC03_119_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa7c4, data, tail7] + - [0xaa7c4, data, tail8] - [0xaa844, .rodata, ov_SC03_119_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaa858, data, tail8] + - [0xaa858, data, tail9] - [0xaaa00, .rodata, ov_SC03_119_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xaab78, data, tail9] + - [0xaab78, data, tail10] - [0xAC6F4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xAC6F7] # 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_121.yaml b/config/splat.ov_SC03_121.yaml index a39fae7c6..6236c8ade 100644 --- a/config/splat.ov_SC03_121.yaml +++ b/config/splat.ov_SC03_121.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_121] - [0x2b88, c, ov_SC03_121_jr_8012ACE0] + - [0xff88, c, ov_SC03_121_jr_801380E0] - [0x17e80, c, ov_SC03_121_jr_8013FFD8] - [0x1CA44, c, ov_SC03_121_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_121_after] @@ -107,20 +108,22 @@ segments: - [0x59fe0, data, tail] - [0x8475c, .rodata, ov_SC03_121_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x84828, data, tail2] + - [0x848d4, .rodata, ov_SC03_121_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x84938, data, tail3] - [0x84f7c, .rodata, ov_SC03_121_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x84fb0, data, tail3] + - [0x84fb0, data, tail4] - [0x85018, .rodata, ov_SC03_121_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x85084, data, tail4] + - [0x85084, data, tail5] - [0x85218, .rodata, ov_SC03_121_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x85234, data, tail5] + - [0x85234, data, tail6] - [0x85238, .rodata, ov_SC03_121_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x85254, data, tail6] + - [0x85254, data, tail7] - [0x852ac, .rodata, ov_SC03_121_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x852cc, data, tail7] + - [0x852cc, data, tail8] - [0x8534c, .rodata, ov_SC03_121_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x85360, data, tail8] + - [0x85360, data, tail9] - [0x85508, .rodata, ov_SC03_121_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x85680, data, tail9] + - [0x85680, data, tail10] - [0x86E54, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x86E57] # 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_124.yaml b/config/splat.ov_SC03_124.yaml index d13cf09aa..722ad3749 100644 --- a/config/splat.ov_SC03_124.yaml +++ b/config/splat.ov_SC03_124.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_124] - [0x2b88, c, ov_SC03_124_jr_8012ACE0] + - [0xff88, c, ov_SC03_124_jr_801380E0] - [0x17e80, c, ov_SC03_124_jr_8013FFD8] - [0x1CA44, c, ov_SC03_124_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_124_after] @@ -107,20 +108,22 @@ segments: - [0x6276c, data, tail] - [0xb6eb0, .rodata, ov_SC03_124_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb6f7c, data, tail2] + - [0xb7028, .rodata, ov_SC03_124_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb708c, data, tail3] - [0xb76d0, .rodata, ov_SC03_124_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7704, data, tail3] + - [0xb7704, data, tail4] - [0xb776c, .rodata, ov_SC03_124_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb77d8, data, tail4] + - [0xb77d8, data, tail5] - [0xb796c, .rodata, ov_SC03_124_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7988, data, tail5] + - [0xb7988, data, tail6] - [0xb798c, .rodata, ov_SC03_124_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb79a8, data, tail6] + - [0xb79a8, data, tail7] - [0xb7a00, .rodata, ov_SC03_124_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7a20, data, tail7] + - [0xb7a20, data, tail8] - [0xb7aa0, .rodata, ov_SC03_124_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7ab4, data, tail8] + - [0xb7ab4, data, tail9] - [0xb7c5c, .rodata, ov_SC03_124_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7dd4, data, tail9] + - [0xb7dd4, data, tail10] - [0xBA48C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBA48F] # 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_125.yaml b/config/splat.ov_SC03_125.yaml index 3075d9e2f..01af86f44 100644 --- a/config/splat.ov_SC03_125.yaml +++ b/config/splat.ov_SC03_125.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_125] - [0x2b88, c, ov_SC03_125_jr_8012ACE0] + - [0xff88, c, ov_SC03_125_jr_801380E0] - [0x17e80, c, ov_SC03_125_jr_8013FFD8] - [0x1CA44, c, ov_SC03_125_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_125_after] @@ -107,20 +108,22 @@ segments: - [0x5bbdc, data, tail] - [0x99b9c, .rodata, ov_SC03_125_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x99c68, data, tail2] + - [0x99d14, .rodata, ov_SC03_125_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x99d78, data, tail3] - [0x9a3bc, .rodata, ov_SC03_125_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9a3f0, data, tail3] + - [0x9a3f0, data, tail4] - [0x9a458, .rodata, ov_SC03_125_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9a4c4, data, tail4] + - [0x9a4c4, data, tail5] - [0x9a658, .rodata, ov_SC03_125_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9a674, data, tail5] + - [0x9a674, data, tail6] - [0x9a678, .rodata, ov_SC03_125_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9a694, data, tail6] + - [0x9a694, data, tail7] - [0x9a6ec, .rodata, ov_SC03_125_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9a70c, data, tail7] + - [0x9a70c, data, tail8] - [0x9a78c, .rodata, ov_SC03_125_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9a7a0, data, tail8] + - [0x9a7a0, data, tail9] - [0x9a948, .rodata, ov_SC03_125_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9aac0, data, tail9] + - [0x9aac0, data, tail10] - [0x9C3E4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9C3E7] # 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_126.yaml b/config/splat.ov_SC03_126.yaml index 55c9dffd0..408466e45 100644 --- a/config/splat.ov_SC03_126.yaml +++ b/config/splat.ov_SC03_126.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC03_126] - [0x2b88, c, ov_SC03_126_jr_8012ACE0] + - [0xff88, c, ov_SC03_126_jr_801380E0] - [0x17e80, c, ov_SC03_126_jr_8013FFD8] - [0x1CA44, c, ov_SC03_126_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC03_126_after] @@ -107,20 +108,22 @@ segments: - [0x570d4, data, tail] - [0x65488, .rodata, ov_SC03_126_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x65554, data, tail2] + - [0x65600, .rodata, ov_SC03_126_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65664, data, tail3] - [0x65ca8, .rodata, ov_SC03_126_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65cdc, data, tail3] + - [0x65cdc, data, tail4] - [0x65d44, .rodata, ov_SC03_126_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65db0, data, tail4] + - [0x65db0, data, tail5] - [0x65f44, .rodata, ov_SC03_126_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65f60, data, tail5] + - [0x65f60, data, tail6] - [0x65f64, .rodata, ov_SC03_126_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65f80, data, tail6] + - [0x65f80, data, tail7] - [0x65fd8, .rodata, ov_SC03_126_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65ff8, data, tail7] + - [0x65ff8, data, tail8] - [0x66078, .rodata, ov_SC03_126_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6608c, data, tail8] + - [0x6608c, data, tail9] - [0x66234, .rodata, ov_SC03_126_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x663ac, data, tail9] + - [0x663ac, data, tail10] - [0x679D4, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x679D5] # 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_SC04_000.yaml b/config/splat.ov_SC04_000.yaml index 81d54c8c6..d6ba5b4ff 100644 --- a/config/splat.ov_SC04_000.yaml +++ b/config/splat.ov_SC04_000.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_000] - [0x2b88, c, ov_SC04_000_jr_8012ACE0] + - [0xff88, c, ov_SC04_000_jr_801380E0] - [0x17e80, c, ov_SC04_000_jr_8013FFD8] - [0x1CA44, c, ov_SC04_000_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_000_after] @@ -107,20 +108,22 @@ segments: - [0x5b0e0, data, tail] - [0x7f504, .rodata, ov_SC04_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7f5d0, data, tail2] + - [0x7f67c, .rodata, ov_SC04_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7f6e0, data, tail3] - [0x7fd24, .rodata, ov_SC04_000_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fd58, data, tail3] + - [0x7fd58, data, tail4] - [0x7fdc0, .rodata, ov_SC04_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fe2c, data, tail4] + - [0x7fe2c, data, tail5] - [0x7ffc0, .rodata, ov_SC04_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7ffdc, data, tail5] + - [0x7ffdc, data, tail6] - [0x7ffe0, .rodata, ov_SC04_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7fffc, data, tail6] + - [0x7fffc, data, tail7] - [0x80054, .rodata, ov_SC04_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80074, data, tail7] + - [0x80074, data, tail8] - [0x800f4, .rodata, ov_SC04_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80108, data, tail8] + - [0x80108, data, tail9] - [0x802b0, .rodata, ov_SC04_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80428, data, tail9] + - [0x80428, data, tail10] - [0x82EFC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x82EFF] # 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_SC04_002.yaml b/config/splat.ov_SC04_002.yaml index a310d162a..44e032b6e 100644 --- a/config/splat.ov_SC04_002.yaml +++ b/config/splat.ov_SC04_002.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_002] - [0x2b88, c, ov_SC04_002_jr_8012ACE0] + - [0xff88, c, ov_SC04_002_jr_801380E0] - [0x17e80, c, ov_SC04_002_jr_8013FFD8] - [0x1CA44, c, ov_SC04_002_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_002_after] @@ -107,20 +108,22 @@ segments: - [0x6024c, data, tail] - [0x96854, .rodata, ov_SC04_002_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x96920, data, tail2] + - [0x969cc, .rodata, ov_SC04_002_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x96a30, data, tail3] - [0x97074, .rodata, ov_SC04_002_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x970a8, data, tail3] + - [0x970a8, data, tail4] - [0x97110, .rodata, ov_SC04_002_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9717c, data, tail4] + - [0x9717c, data, tail5] - [0x97310, .rodata, ov_SC04_002_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9732c, data, tail5] + - [0x9732c, data, tail6] - [0x97330, .rodata, ov_SC04_002_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9734c, data, tail6] + - [0x9734c, data, tail7] - [0x973a4, .rodata, ov_SC04_002_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x973c4, data, tail7] + - [0x973c4, data, tail8] - [0x97444, .rodata, ov_SC04_002_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97458, data, tail8] + - [0x97458, data, tail9] - [0x97600, .rodata, ov_SC04_002_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97778, data, tail9] + - [0x97778, data, tail10] - [0x995DC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x995DF] # 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_SC04_003.yaml b/config/splat.ov_SC04_003.yaml index a5f2f7a1b..515c252a8 100644 --- a/config/splat.ov_SC04_003.yaml +++ b/config/splat.ov_SC04_003.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_003] - [0x2b88, c, ov_SC04_003_jr_8012ACE0] + - [0xff88, c, ov_SC04_003_jr_801380E0] - [0x17e80, c, ov_SC04_003_jr_8013FFD8] - [0x1CA44, c, ov_SC04_003_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_003_after] @@ -107,20 +108,22 @@ segments: - [0x59fe8, data, tail] - [0x714d0, .rodata, ov_SC04_003_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7159c, data, tail2] + - [0x71648, .rodata, ov_SC04_003_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x716ac, data, tail3] - [0x71cf0, .rodata, ov_SC04_003_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71d24, data, tail3] + - [0x71d24, data, tail4] - [0x71d8c, .rodata, ov_SC04_003_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71df8, data, tail4] + - [0x71df8, data, tail5] - [0x71f8c, .rodata, ov_SC04_003_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71fa8, data, tail5] + - [0x71fa8, data, tail6] - [0x71fac, .rodata, ov_SC04_003_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71fc8, data, tail6] + - [0x71fc8, data, tail7] - [0x72020, .rodata, ov_SC04_003_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x72040, data, tail7] + - [0x72040, data, tail8] - [0x720c0, .rodata, ov_SC04_003_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x720d4, data, tail8] + - [0x720d4, data, tail9] - [0x7227c, .rodata, ov_SC04_003_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x723f4, data, tail9] + - [0x723f4, data, tail10] - [0x73A94, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x73A97] # 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_SC04_004.yaml b/config/splat.ov_SC04_004.yaml index c0522459d..0071b2bda 100644 --- a/config/splat.ov_SC04_004.yaml +++ b/config/splat.ov_SC04_004.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_004] - [0x2b88, c, ov_SC04_004_jr_8012ACE0] + - [0xff88, c, ov_SC04_004_jr_801380E0] - [0x17e80, c, ov_SC04_004_jr_8013FFD8] - [0x1CA44, c, ov_SC04_004_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_004_after] @@ -107,20 +108,22 @@ segments: - [0x5c51c, data, tail] - [0x892cc, .rodata, ov_SC04_004_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x89398, data, tail2] + - [0x89444, .rodata, ov_SC04_004_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x894a8, data, tail3] - [0x89aec, .rodata, ov_SC04_004_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89b20, data, tail3] + - [0x89b20, data, tail4] - [0x89b88, .rodata, ov_SC04_004_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89bf4, data, tail4] + - [0x89bf4, data, tail5] - [0x89d88, .rodata, ov_SC04_004_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89da4, data, tail5] + - [0x89da4, data, tail6] - [0x89da8, .rodata, ov_SC04_004_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89dc4, data, tail6] + - [0x89dc4, data, tail7] - [0x89e1c, .rodata, ov_SC04_004_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89e3c, data, tail7] + - [0x89e3c, data, tail8] - [0x89ebc, .rodata, ov_SC04_004_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x89ed0, data, tail8] + - [0x89ed0, data, tail9] - [0x8a078, .rodata, ov_SC04_004_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8a1f0, data, tail9] + - [0x8a1f0, data, tail10] - [0x8BAFC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8BAFF] # 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_SC04_005.yaml b/config/splat.ov_SC04_005.yaml index 1a9be74ab..2c876c95c 100644 --- a/config/splat.ov_SC04_005.yaml +++ b/config/splat.ov_SC04_005.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_005] - [0x2b88, c, ov_SC04_005_jr_8012ACE0] + - [0xff88, c, ov_SC04_005_jr_801380E0] - [0x17e80, c, ov_SC04_005_jr_8013FFD8] - [0x1CA44, c, ov_SC04_005_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_005_after] @@ -107,20 +108,22 @@ segments: - [0x5f950, data, tail] - [0x97490, .rodata, ov_SC04_005_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9755c, data, tail2] + - [0x97608, .rodata, ov_SC04_005_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9766c, data, tail3] - [0x97cb0, .rodata, ov_SC04_005_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97ce4, data, tail3] + - [0x97ce4, data, tail4] - [0x97d4c, .rodata, ov_SC04_005_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97db8, data, tail4] + - [0x97db8, data, tail5] - [0x97f4c, .rodata, ov_SC04_005_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97f68, data, tail5] + - [0x97f68, data, tail6] - [0x97f6c, .rodata, ov_SC04_005_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x97f88, data, tail6] + - [0x97f88, data, tail7] - [0x97fe0, .rodata, ov_SC04_005_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x98000, data, tail7] + - [0x98000, data, tail8] - [0x98080, .rodata, ov_SC04_005_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x98094, data, tail8] + - [0x98094, data, tail9] - [0x9823c, .rodata, ov_SC04_005_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x983b4, data, tail9] + - [0x983b4, data, tail10] - [0x9A1D4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9A1D7] # 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_SC04_006.yaml b/config/splat.ov_SC04_006.yaml index 33e1a86ca..253930eea 100644 --- a/config/splat.ov_SC04_006.yaml +++ b/config/splat.ov_SC04_006.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_006] - [0x2b88, c, ov_SC04_006_jr_8012ACE0] + - [0xff88, c, ov_SC04_006_jr_801380E0] - [0x17e80, c, ov_SC04_006_jr_8013FFD8] - [0x1CA44, c, ov_SC04_006_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_006_after] @@ -107,20 +108,22 @@ segments: - [0x57a30, data, tail] - [0x73738, .rodata, ov_SC04_006_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x73804, data, tail2] + - [0x738b0, .rodata, ov_SC04_006_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x73914, data, tail3] - [0x73f58, .rodata, ov_SC04_006_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73f8c, data, tail3] + - [0x73f8c, data, tail4] - [0x73ff4, .rodata, ov_SC04_006_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74060, data, tail4] + - [0x74060, data, tail5] - [0x741f4, .rodata, ov_SC04_006_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74210, data, tail5] + - [0x74210, data, tail6] - [0x74214, .rodata, ov_SC04_006_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x74230, data, tail6] + - [0x74230, data, tail7] - [0x74288, .rodata, ov_SC04_006_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x742a8, data, tail7] + - [0x742a8, data, tail8] - [0x74328, .rodata, ov_SC04_006_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7433c, data, tail8] + - [0x7433c, data, tail9] - [0x744e4, .rodata, ov_SC04_006_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7465c, data, tail9] + - [0x7465c, data, tail10] - [0x75C74, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x75C77] # 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_SC04_007.yaml b/config/splat.ov_SC04_007.yaml index 7b83bb995..dc64f3fe0 100644 --- a/config/splat.ov_SC04_007.yaml +++ b/config/splat.ov_SC04_007.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_007] - [0x2b88, c, ov_SC04_007_jr_8012ACE0] + - [0xff88, c, ov_SC04_007_jr_801380E0] - [0x17e80, c, ov_SC04_007_jr_8013FFD8] - [0x1CA44, c, ov_SC04_007_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_007_after] @@ -107,20 +108,22 @@ segments: - [0x5d9e8, data, tail] - [0x8acf4, .rodata, ov_SC04_007_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8adc0, data, tail2] + - [0x8ae6c, .rodata, ov_SC04_007_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8aed0, data, tail3] - [0x8b514, .rodata, ov_SC04_007_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8b548, data, tail3] + - [0x8b548, data, tail4] - [0x8b5b0, .rodata, ov_SC04_007_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8b61c, data, tail4] + - [0x8b61c, data, tail5] - [0x8b7b0, .rodata, ov_SC04_007_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8b7cc, data, tail5] + - [0x8b7cc, data, tail6] - [0x8b7d0, .rodata, ov_SC04_007_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8b7ec, data, tail6] + - [0x8b7ec, data, tail7] - [0x8b844, .rodata, ov_SC04_007_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8b864, data, tail7] + - [0x8b864, data, tail8] - [0x8b8e4, .rodata, ov_SC04_007_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8b8f8, data, tail8] + - [0x8b8f8, data, tail9] - [0x8baa0, .rodata, ov_SC04_007_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8bc18, data, tail9] + - [0x8bc18, data, tail10] - [0x8DA34, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8DA37] # 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_SC04_008.yaml b/config/splat.ov_SC04_008.yaml index 9369e6f27..65746730c 100644 --- a/config/splat.ov_SC04_008.yaml +++ b/config/splat.ov_SC04_008.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_008] - [0x2b88, c, ov_SC04_008_jr_8012ACE0] + - [0xff88, c, ov_SC04_008_jr_801380E0] - [0x17e80, c, ov_SC04_008_jr_8013FFD8] - [0x1CA44, c, ov_SC04_008_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_008_after] @@ -105,18 +106,20 @@ segments: - [0x56920, data, tail] - [0x679dc, .rodata, ov_SC04_008_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x67aa8, data, tail2] + - [0x67b54, .rodata, ov_SC04_008_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x67bb8, data, tail3] - [0x681fc, .rodata, ov_SC04_008_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68230, data, tail3] + - [0x68230, data, tail4] - [0x68298, .rodata, ov_SC04_008_after] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68304, data, tail4] + - [0x68304, data, tail5] - [0x684b8, .rodata, ov_SC04_008_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x684d4, data, tail5] + - [0x684d4, data, tail6] - [0x6852c, .rodata, ov_SC04_008_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6854c, data, tail6] + - [0x6854c, data, tail7] - [0x685cc, .rodata, ov_SC04_008_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x685e0, data, tail7] + - [0x685e0, data, tail8] - [0x68788, .rodata, ov_SC04_008_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68900, data, tail8] + - [0x68900, data, tail9] - [0x6B364, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6B367] # 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_SC04_009.yaml b/config/splat.ov_SC04_009.yaml index 999e80e30..eee2b4db6 100644 --- a/config/splat.ov_SC04_009.yaml +++ b/config/splat.ov_SC04_009.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_009] - [0x2b88, c, ov_SC04_009_jr_8012ACE0] + - [0xff88, c, ov_SC04_009_jr_801380E0] - [0x17e80, c, ov_SC04_009_jr_8013FFD8] - [0x1CA44, c, ov_SC04_009_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_009_after] @@ -107,20 +108,22 @@ segments: - [0x5694c, data, tail] - [0x6dbf0, .rodata, ov_SC04_009_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6dcbc, data, tail2] + - [0x6dd68, .rodata, ov_SC04_009_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6ddcc, data, tail3] - [0x6e410, .rodata, ov_SC04_009_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e444, data, tail3] + - [0x6e444, data, tail4] - [0x6e4ac, .rodata, ov_SC04_009_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e518, data, tail4] + - [0x6e518, data, tail5] - [0x6e6ac, .rodata, ov_SC04_009_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e6c8, data, tail5] + - [0x6e6c8, data, tail6] - [0x6e6cc, .rodata, ov_SC04_009_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e6e8, data, tail6] + - [0x6e6e8, data, tail7] - [0x6e740, .rodata, ov_SC04_009_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e760, data, tail7] + - [0x6e760, data, tail8] - [0x6e7e0, .rodata, ov_SC04_009_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6e7f4, data, tail8] + - [0x6e7f4, data, tail9] - [0x6e99c, .rodata, ov_SC04_009_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6eb14, data, tail9] + - [0x6eb14, data, tail10] - [0x70114, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x70117] # 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_SC04_010.yaml b/config/splat.ov_SC04_010.yaml index e397fdb96..dbd01c197 100644 --- a/config/splat.ov_SC04_010.yaml +++ b/config/splat.ov_SC04_010.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_010] - [0x2b88, c, ov_SC04_010_jr_8012ACE0] + - [0xff88, c, ov_SC04_010_jr_801380E0] - [0x17e80, c, ov_SC04_010_jr_8013FFD8] - [0x1CA44, c, ov_SC04_010_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_010_after] @@ -107,20 +108,22 @@ segments: - [0x55ff8, data, tail] - [0x6507c, .rodata, ov_SC04_010_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x65148, data, tail2] + - [0x651f4, .rodata, ov_SC04_010_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65258, data, tail3] - [0x6589c, .rodata, ov_SC04_010_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x658d0, data, tail3] + - [0x658d0, data, tail4] - [0x65938, .rodata, ov_SC04_010_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x659a4, data, tail4] + - [0x659a4, data, tail5] - [0x65b38, .rodata, ov_SC04_010_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65b54, data, tail5] + - [0x65b54, data, tail6] - [0x65b58, .rodata, ov_SC04_010_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65b74, data, tail6] + - [0x65b74, data, tail7] - [0x65bcc, .rodata, ov_SC04_010_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65bec, data, tail7] + - [0x65bec, data, tail8] - [0x65c6c, .rodata, ov_SC04_010_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65c80, data, tail8] + - [0x65c80, data, tail9] - [0x65e28, .rodata, ov_SC04_010_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65fa0, data, tail9] + - [0x65fa0, data, tail10] - [0x675EC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x675EF] # 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_SC04_011.yaml b/config/splat.ov_SC04_011.yaml index 813724fad..030710ea2 100644 --- a/config/splat.ov_SC04_011.yaml +++ b/config/splat.ov_SC04_011.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_011] - [0x2b88, c, ov_SC04_011_jr_8012ACE0] + - [0xff88, c, ov_SC04_011_jr_801380E0] - [0x17e80, c, ov_SC04_011_jr_8013FFD8] - [0x1CA44, c, ov_SC04_011_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_011_after] @@ -107,20 +108,22 @@ segments: - [0x68288, data, tail] - [0xc4618, .rodata, ov_SC04_011_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc46e4, data, tail2] + - [0xc4790, .rodata, ov_SC04_011_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc47f4, data, tail3] - [0xc4e38, .rodata, ov_SC04_011_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc4e6c, data, tail3] + - [0xc4e6c, data, tail4] - [0xc4ed4, .rodata, ov_SC04_011_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc4f40, data, tail4] + - [0xc4f40, data, tail5] - [0xc50d4, .rodata, ov_SC04_011_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc50f0, data, tail5] + - [0xc50f0, data, tail6] - [0xc50f4, .rodata, ov_SC04_011_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5110, data, tail6] + - [0xc5110, data, tail7] - [0xc5168, .rodata, ov_SC04_011_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc5188, data, tail7] + - [0xc5188, data, tail8] - [0xc5208, .rodata, ov_SC04_011_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc521c, data, tail8] + - [0xc521c, data, tail9] - [0xc53c4, .rodata, ov_SC04_011_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc553c, data, tail9] + - [0xc553c, data, tail10] - [0xC9554, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC9557] # 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_SC04_012.yaml b/config/splat.ov_SC04_012.yaml index 74f932969..2fe152c34 100644 --- a/config/splat.ov_SC04_012.yaml +++ b/config/splat.ov_SC04_012.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_012] - [0x2b88, c, ov_SC04_012_jr_8012ACE0] + - [0xff88, c, ov_SC04_012_jr_801380E0] - [0x17e80, c, ov_SC04_012_jr_8013FFD8] - [0x1CA44, c, ov_SC04_012_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_012_after] @@ -107,20 +108,22 @@ segments: - [0x5645c, data, tail] - [0x6775c, .rodata, ov_SC04_012_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x67828, data, tail2] + - [0x678d4, .rodata, ov_SC04_012_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x67938, data, tail3] - [0x67f7c, .rodata, ov_SC04_012_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x67fb0, data, tail3] + - [0x67fb0, data, tail4] - [0x68018, .rodata, ov_SC04_012_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68084, data, tail4] + - [0x68084, data, tail5] - [0x68218, .rodata, ov_SC04_012_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68234, data, tail5] + - [0x68234, data, tail6] - [0x68238, .rodata, ov_SC04_012_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68254, data, tail6] + - [0x68254, data, tail7] - [0x682ac, .rodata, ov_SC04_012_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x682cc, data, tail7] + - [0x682cc, data, tail8] - [0x6834c, .rodata, ov_SC04_012_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68360, data, tail8] + - [0x68360, data, tail9] - [0x68508, .rodata, ov_SC04_012_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x68680, data, tail9] + - [0x68680, data, tail10] - [0x6B0E4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6B0E7] # 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_SC04_015.yaml b/config/splat.ov_SC04_015.yaml index 38ff0bd87..0b51b1525 100644 --- a/config/splat.ov_SC04_015.yaml +++ b/config/splat.ov_SC04_015.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_015] - [0x2b88, c, ov_SC04_015_jr_8012ACE0] + - [0xff88, c, ov_SC04_015_jr_801380E0] - [0x17e80, c, ov_SC04_015_jr_8013FFD8] - [0x1CA44, c, ov_SC04_015_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_015_after] @@ -107,20 +108,22 @@ segments: - [0x5c38c, data, tail] - [0x9e3f4, .rodata, ov_SC04_015_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9e4c0, data, tail2] + - [0x9e56c, .rodata, ov_SC04_015_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9e5d0, data, tail3] - [0x9ec14, .rodata, ov_SC04_015_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ec48, data, tail3] + - [0x9ec48, data, tail4] - [0x9ecb0, .rodata, ov_SC04_015_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ed1c, data, tail4] + - [0x9ed1c, data, tail5] - [0x9eeb0, .rodata, ov_SC04_015_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9eecc, data, tail5] + - [0x9eecc, data, tail6] - [0x9eed0, .rodata, ov_SC04_015_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9eeec, data, tail6] + - [0x9eeec, data, tail7] - [0x9ef44, .rodata, ov_SC04_015_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9ef64, data, tail7] + - [0x9ef64, data, tail8] - [0x9efe4, .rodata, ov_SC04_015_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9eff8, data, tail8] + - [0x9eff8, data, tail9] - [0x9f1a0, .rodata, ov_SC04_015_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9f318, data, tail9] + - [0x9f318, data, tail10] - [0xA1284, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA1287] # 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_SC04_016.yaml b/config/splat.ov_SC04_016.yaml index 0a618655a..09e181083 100644 --- a/config/splat.ov_SC04_016.yaml +++ b/config/splat.ov_SC04_016.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_016] - [0x2b88, c, ov_SC04_016_jr_8012ACE0] + - [0xff88, c, ov_SC04_016_jr_801380E0] - [0x17e80, c, ov_SC04_016_jr_8013FFD8] - [0x1CA44, c, ov_SC04_016_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_016_after] @@ -107,20 +108,22 @@ segments: - [0x57e58, data, tail] - [0x7c5ac, .rodata, ov_SC04_016_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7c678, data, tail2] + - [0x7c724, .rodata, ov_SC04_016_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7c788, data, tail3] - [0x7cdcc, .rodata, ov_SC04_016_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7ce00, data, tail3] + - [0x7ce00, data, tail4] - [0x7ce68, .rodata, ov_SC04_016_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7ced4, data, tail4] + - [0x7ced4, data, tail5] - [0x7d068, .rodata, ov_SC04_016_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7d084, data, tail5] + - [0x7d084, data, tail6] - [0x7d088, .rodata, ov_SC04_016_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7d0a4, data, tail6] + - [0x7d0a4, data, tail7] - [0x7d0fc, .rodata, ov_SC04_016_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7d11c, data, tail7] + - [0x7d11c, data, tail8] - [0x7d19c, .rodata, ov_SC04_016_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7d1b0, data, tail8] + - [0x7d1b0, data, tail9] - [0x7d358, .rodata, ov_SC04_016_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7d4d0, data, tail9] + - [0x7d4d0, data, tail10] - [0x84184, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x84187] # 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_SC04_018.yaml b/config/splat.ov_SC04_018.yaml index bd3abd9aa..b7b2a50ff 100644 --- a/config/splat.ov_SC04_018.yaml +++ b/config/splat.ov_SC04_018.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_018] - [0x2b88, c, ov_SC04_018_jr_8012ACE0] + - [0xff88, c, ov_SC04_018_jr_801380E0] - [0x17e80, c, ov_SC04_018_jr_8013FFD8] - [0x1CA44, c, ov_SC04_018_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_018_after] @@ -107,20 +108,22 @@ segments: - [0x64dd0, data, tail] - [0xbc3c4, .rodata, ov_SC04_018_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbc490, data, tail2] + - [0xbc53c, .rodata, ov_SC04_018_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xbc5a0, data, tail3] - [0xbcbe4, .rodata, ov_SC04_018_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcc18, data, tail3] + - [0xbcc18, data, tail4] - [0xbcc80, .rodata, ov_SC04_018_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbccec, data, tail4] + - [0xbccec, data, tail5] - [0xbce80, .rodata, ov_SC04_018_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbce9c, data, tail5] + - [0xbce9c, data, tail6] - [0xbcea0, .rodata, ov_SC04_018_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcebc, data, tail6] + - [0xbcebc, data, tail7] - [0xbcf14, .rodata, ov_SC04_018_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcf34, data, tail7] + - [0xbcf34, data, tail8] - [0xbcfb4, .rodata, ov_SC04_018_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcfc8, data, tail8] + - [0xbcfc8, data, tail9] - [0xbd170, .rodata, ov_SC04_018_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbd2e8, data, tail9] + - [0xbd2e8, data, tail10] - [0xBF9CC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBF9CF] # 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_SC04_019.yaml b/config/splat.ov_SC04_019.yaml index cf7eae223..f11b95b85 100644 --- a/config/splat.ov_SC04_019.yaml +++ b/config/splat.ov_SC04_019.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_019] - [0x2b88, c, ov_SC04_019_jr_8012ACE0] + - [0xff88, c, ov_SC04_019_jr_801380E0] - [0x17e80, c, ov_SC04_019_jr_8013FFD8] - [0x1CA44, c, ov_SC04_019_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_019_after] @@ -107,20 +108,22 @@ segments: - [0x64dd0, data, tail] - [0xbc3c4, .rodata, ov_SC04_019_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbc490, data, tail2] + - [0xbc53c, .rodata, ov_SC04_019_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xbc5a0, data, tail3] - [0xbcbe4, .rodata, ov_SC04_019_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcc18, data, tail3] + - [0xbcc18, data, tail4] - [0xbcc80, .rodata, ov_SC04_019_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbccec, data, tail4] + - [0xbccec, data, tail5] - [0xbce80, .rodata, ov_SC04_019_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbce9c, data, tail5] + - [0xbce9c, data, tail6] - [0xbcea0, .rodata, ov_SC04_019_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcebc, data, tail6] + - [0xbcebc, data, tail7] - [0xbcf14, .rodata, ov_SC04_019_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcf34, data, tail7] + - [0xbcf34, data, tail8] - [0xbcfb4, .rodata, ov_SC04_019_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcfc8, data, tail8] + - [0xbcfc8, data, tail9] - [0xbd170, .rodata, ov_SC04_019_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbd2e8, data, tail9] + - [0xbd2e8, data, tail10] - [0xBF9CC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBF9CF] # 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_SC04_020.yaml b/config/splat.ov_SC04_020.yaml index 5f68d4bbc..5d950ef82 100644 --- a/config/splat.ov_SC04_020.yaml +++ b/config/splat.ov_SC04_020.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_020] - [0x2b88, c, ov_SC04_020_jr_8012ACE0] + - [0xff88, c, ov_SC04_020_jr_801380E0] - [0x17e80, c, ov_SC04_020_jr_8013FFD8] - [0x1CA44, c, ov_SC04_020_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_020_after] @@ -107,20 +108,22 @@ segments: - [0x5b1a8, data, tail] - [0x91dec, .rodata, ov_SC04_020_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x91eb8, data, tail2] + - [0x91f64, .rodata, ov_SC04_020_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x91fc8, data, tail3] - [0x9260c, .rodata, ov_SC04_020_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x92640, data, tail3] + - [0x92640, data, tail4] - [0x926a8, .rodata, ov_SC04_020_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x92714, data, tail4] + - [0x92714, data, tail5] - [0x928a8, .rodata, ov_SC04_020_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x928c4, data, tail5] + - [0x928c4, data, tail6] - [0x928c8, .rodata, ov_SC04_020_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x928e4, data, tail6] + - [0x928e4, data, tail7] - [0x9293c, .rodata, ov_SC04_020_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9295c, data, tail7] + - [0x9295c, data, tail8] - [0x929dc, .rodata, ov_SC04_020_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x929f0, data, tail8] + - [0x929f0, data, tail9] - [0x92b98, .rodata, ov_SC04_020_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x92d10, data, tail9] + - [0x92d10, data, tail10] - [0x94654, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x94657] # 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_SC04_021.yaml b/config/splat.ov_SC04_021.yaml index edfdb5918..fae99dc29 100644 --- a/config/splat.ov_SC04_021.yaml +++ b/config/splat.ov_SC04_021.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC04_021] - [0x2b88, c, ov_SC04_021_jr_8012ACE0] + - [0xff88, c, ov_SC04_021_jr_801380E0] - [0x17e80, c, ov_SC04_021_jr_8013FFD8] - [0x1CA44, c, ov_SC04_021_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC04_021_after] @@ -107,20 +108,22 @@ segments: - [0x570d4, data, tail] - [0x65488, .rodata, ov_SC04_021_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x65554, data, tail2] + - [0x65600, .rodata, ov_SC04_021_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65664, data, tail3] - [0x65ca8, .rodata, ov_SC04_021_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65cdc, data, tail3] + - [0x65cdc, data, tail4] - [0x65d44, .rodata, ov_SC04_021_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65db0, data, tail4] + - [0x65db0, data, tail5] - [0x65f44, .rodata, ov_SC04_021_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65f60, data, tail5] + - [0x65f60, data, tail6] - [0x65f64, .rodata, ov_SC04_021_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65f80, data, tail6] + - [0x65f80, data, tail7] - [0x65fd8, .rodata, ov_SC04_021_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65ff8, data, tail7] + - [0x65ff8, data, tail8] - [0x66078, .rodata, ov_SC04_021_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6608c, data, tail8] + - [0x6608c, data, tail9] - [0x66234, .rodata, ov_SC04_021_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x663ac, data, tail9] + - [0x663ac, data, tail10] - [0x679D4, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x679D5] # 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_SC05_000.yaml b/config/splat.ov_SC05_000.yaml index cdf506709..db2ff33ba 100644 --- a/config/splat.ov_SC05_000.yaml +++ b/config/splat.ov_SC05_000.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_000] - [0x2b88, c, ov_SC05_000_jr_8012ACE0] + - [0xff88, c, ov_SC05_000_jr_801380E0] - [0x17e80, c, ov_SC05_000_jr_8013FFD8] - [0x1CA44, c, ov_SC05_000_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_000_after] @@ -107,20 +108,22 @@ segments: - [0x560e8, data, tail] - [0x705d8, .rodata, ov_SC05_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x706a4, data, tail2] + - [0x70750, .rodata, ov_SC05_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x707b4, data, tail3] - [0x70df8, .rodata, ov_SC05_000_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70e2c, data, tail3] + - [0x70e2c, data, tail4] - [0x70e94, .rodata, ov_SC05_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70f00, data, tail4] + - [0x70f00, data, tail5] - [0x71094, .rodata, ov_SC05_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x710b0, data, tail5] + - [0x710b0, data, tail6] - [0x710b4, .rodata, ov_SC05_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x710d0, data, tail6] + - [0x710d0, data, tail7] - [0x71128, .rodata, ov_SC05_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71148, data, tail7] + - [0x71148, data, tail8] - [0x711c8, .rodata, ov_SC05_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x711dc, data, tail8] + - [0x711dc, data, tail9] - [0x71384, .rodata, ov_SC05_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x714fc, data, tail9] + - [0x714fc, data, tail10] - [0x72AFC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x72AFF] # 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_SC05_001.yaml b/config/splat.ov_SC05_001.yaml index b232b4f9f..4a4e899ff 100644 --- a/config/splat.ov_SC05_001.yaml +++ b/config/splat.ov_SC05_001.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_001] - [0x2b88, c, ov_SC05_001_jr_8012ACE0] + - [0xff88, c, ov_SC05_001_jr_801380E0] - [0x17e80, c, ov_SC05_001_jr_8013FFD8] - [0x1CA44, c, ov_SC05_001_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_001_after] @@ -107,20 +108,22 @@ segments: - [0x5d8c4, data, tail] - [0x8b58c, .rodata, ov_SC05_001_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8b658, data, tail2] + - [0x8b704, .rodata, ov_SC05_001_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8b768, data, tail3] - [0x8bdac, .rodata, ov_SC05_001_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8bde0, data, tail3] + - [0x8bde0, data, tail4] - [0x8be48, .rodata, ov_SC05_001_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8beb4, data, tail4] + - [0x8beb4, data, tail5] - [0x8c048, .rodata, ov_SC05_001_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8c064, data, tail5] + - [0x8c064, data, tail6] - [0x8c068, .rodata, ov_SC05_001_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8c084, data, tail6] + - [0x8c084, data, tail7] - [0x8c0dc, .rodata, ov_SC05_001_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8c0fc, data, tail7] + - [0x8c0fc, data, tail8] - [0x8c17c, .rodata, ov_SC05_001_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8c190, data, tail8] + - [0x8c190, data, tail9] - [0x8c338, .rodata, ov_SC05_001_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8c4b0, data, tail9] + - [0x8c4b0, data, tail10] - [0x8DEAC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8DEAF] # 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_SC05_002.yaml b/config/splat.ov_SC05_002.yaml index f59890f94..c6f5c8dda 100644 --- a/config/splat.ov_SC05_002.yaml +++ b/config/splat.ov_SC05_002.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_002] - [0x2b88, c, ov_SC05_002_jr_8012ACE0] + - [0xff88, c, ov_SC05_002_jr_801380E0] - [0x17e80, c, ov_SC05_002_jr_8013FFD8] - [0x1CA44, c, ov_SC05_002_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_002_after] @@ -107,20 +108,22 @@ segments: - [0x58084, data, tail] - [0x75938, .rodata, ov_SC05_002_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x75a04, data, tail2] + - [0x75ab0, .rodata, ov_SC05_002_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x75b14, data, tail3] - [0x76158, .rodata, ov_SC05_002_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7618c, data, tail3] + - [0x7618c, data, tail4] - [0x761f4, .rodata, ov_SC05_002_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76260, data, tail4] + - [0x76260, data, tail5] - [0x763f4, .rodata, ov_SC05_002_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76410, data, tail5] + - [0x76410, data, tail6] - [0x76414, .rodata, ov_SC05_002_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x76430, data, tail6] + - [0x76430, data, tail7] - [0x76488, .rodata, ov_SC05_002_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x764a8, data, tail7] + - [0x764a8, data, tail8] - [0x76528, .rodata, ov_SC05_002_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7653c, data, tail8] + - [0x7653c, data, tail9] - [0x766e4, .rodata, ov_SC05_002_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7685c, data, tail9] + - [0x7685c, data, tail10] - [0x77E64, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x77E67] # 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_SC05_003.yaml b/config/splat.ov_SC05_003.yaml index 5de8d71c9..4c7f14e0e 100644 --- a/config/splat.ov_SC05_003.yaml +++ b/config/splat.ov_SC05_003.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_003] - [0x2b88, c, ov_SC05_003_jr_8012ACE0] + - [0xff88, c, ov_SC05_003_jr_801380E0] - [0x17e80, c, ov_SC05_003_jr_8013FFD8] - [0x1CA44, c, ov_SC05_003_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_003_after] @@ -107,20 +108,22 @@ segments: - [0x5a3bc, data, tail] - [0x82434, .rodata, ov_SC05_003_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x82500, data, tail2] + - [0x825ac, .rodata, ov_SC05_003_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x82610, data, tail3] - [0x82c54, .rodata, ov_SC05_003_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82c88, data, tail3] + - [0x82c88, data, tail4] - [0x82cf0, .rodata, ov_SC05_003_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82d5c, data, tail4] + - [0x82d5c, data, tail5] - [0x82ef0, .rodata, ov_SC05_003_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82f0c, data, tail5] + - [0x82f0c, data, tail6] - [0x82f10, .rodata, ov_SC05_003_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82f2c, data, tail6] + - [0x82f2c, data, tail7] - [0x82f84, .rodata, ov_SC05_003_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82fa4, data, tail7] + - [0x82fa4, data, tail8] - [0x83024, .rodata, ov_SC05_003_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83038, data, tail8] + - [0x83038, data, tail9] - [0x831e0, .rodata, ov_SC05_003_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x83358, data, tail9] + - [0x83358, data, tail10] - [0x84974, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x84977] # 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_SC05_004.yaml b/config/splat.ov_SC05_004.yaml index 8e0829f40..762cfb2db 100644 --- a/config/splat.ov_SC05_004.yaml +++ b/config/splat.ov_SC05_004.yaml @@ -93,7 +93,9 @@ segments: # shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at # 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave). # - [0x0, rodata, head] - - [0x0, c, ov_SC05_004] # -O2 before whale (file 0x0..0x1CA44) + - [0x0, c, ov_SC05_004] + - [0x2b88, c, ov_SC05_004_jr_8012ACE0] + - [0xff88, c, ov_SC05_004_jr_801380E0] - [0x1CA44, c, ov_SC05_004_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_004_after] - [0x2c2f4, c, ov_SC05_004_jr_8015444C] @@ -103,20 +105,22 @@ segments: - [0x4b364, c, ov_SC05_004_jr_801734BC] - [0x50be8, c, ov_SC05_004_jr_80178D40] - [0x594c8, data, tail] - - [0x74a28, .rodata, ov_SC05_004] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x74a28, .rodata, ov_SC05_004_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x74af4, data, tail2] + - [0x74ba0, .rodata, ov_SC05_004_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x74c04, data, tail3] - [0x752e4, .rodata, ov_SC05_004_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75350, data, tail3] + - [0x75350, data, tail4] - [0x754e4, .rodata, ov_SC05_004_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75500, data, tail4] + - [0x75500, data, tail5] - [0x75504, .rodata, ov_SC05_004_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75520, data, tail5] + - [0x75520, data, tail6] - [0x75578, .rodata, ov_SC05_004_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75598, data, tail6] + - [0x75598, data, tail7] - [0x75618, .rodata, ov_SC05_004_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7562c, data, tail7] + - [0x7562c, data, tail8] - [0x757d4, .rodata, ov_SC05_004_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7594c, data, tail8] + - [0x7594c, data, tail9] - [0x771CC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x771CF] # 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_SC05_005.yaml b/config/splat.ov_SC05_005.yaml index 9a1d570d6..3a1603d2f 100644 --- a/config/splat.ov_SC05_005.yaml +++ b/config/splat.ov_SC05_005.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_005] - [0x2b88, c, ov_SC05_005_jr_8012ACE0] + - [0xff88, c, ov_SC05_005_jr_801380E0] - [0x17e80, c, ov_SC05_005_jr_8013FFD8] - [0x1CA44, c, ov_SC05_005_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_005_after] @@ -107,20 +108,22 @@ segments: - [0x5a29c, data, tail] - [0x87710, .rodata, ov_SC05_005_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x877dc, data, tail2] + - [0x87888, .rodata, ov_SC05_005_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x878ec, data, tail3] - [0x87f30, .rodata, ov_SC05_005_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87f64, data, tail3] + - [0x87f64, data, tail4] - [0x87fcc, .rodata, ov_SC05_005_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88038, data, tail4] + - [0x88038, data, tail5] - [0x881cc, .rodata, ov_SC05_005_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x881e8, data, tail5] + - [0x881e8, data, tail6] - [0x881ec, .rodata, ov_SC05_005_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88208, data, tail6] + - [0x88208, data, tail7] - [0x88260, .rodata, ov_SC05_005_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88280, data, tail7] + - [0x88280, data, tail8] - [0x88300, .rodata, ov_SC05_005_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88314, data, tail8] + - [0x88314, data, tail9] - [0x884bc, .rodata, ov_SC05_005_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88634, data, tail9] + - [0x88634, data, tail10] - [0x89ED4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x89ED7] # 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_SC05_006.yaml b/config/splat.ov_SC05_006.yaml index 7e99ae1f6..3a7c3a734 100644 --- a/config/splat.ov_SC05_006.yaml +++ b/config/splat.ov_SC05_006.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_006] - [0x2b88, c, ov_SC05_006_jr_8012ACE0] + - [0xff88, c, ov_SC05_006_jr_801380E0] - [0x17e80, c, ov_SC05_006_jr_8013FFD8] - [0x1CA44, c, ov_SC05_006_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_006_after] @@ -107,20 +108,22 @@ segments: - [0x572bc, data, tail] - [0x65860, .rodata, ov_SC05_006_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6592c, data, tail2] + - [0x659d8, .rodata, ov_SC05_006_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65a3c, data, tail3] - [0x66080, .rodata, ov_SC05_006_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x660b4, data, tail3] + - [0x660b4, data, tail4] - [0x6611c, .rodata, ov_SC05_006_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66188, data, tail4] + - [0x66188, data, tail5] - [0x6631c, .rodata, ov_SC05_006_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66338, data, tail5] + - [0x66338, data, tail6] - [0x6633c, .rodata, ov_SC05_006_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66358, data, tail6] + - [0x66358, data, tail7] - [0x663b0, .rodata, ov_SC05_006_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x663d0, data, tail7] + - [0x663d0, data, tail8] - [0x66450, .rodata, ov_SC05_006_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66464, data, tail8] + - [0x66464, data, tail9] - [0x6660c, .rodata, ov_SC05_006_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x66784, data, tail9] + - [0x66784, data, tail10] - [0x68004, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x68007] # 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_SC05_007.yaml b/config/splat.ov_SC05_007.yaml index 3863ebc70..32737b5b4 100644 --- a/config/splat.ov_SC05_007.yaml +++ b/config/splat.ov_SC05_007.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_007] - [0x2b88, c, ov_SC05_007_jr_8012ACE0] + - [0xff88, c, ov_SC05_007_jr_801380E0] - [0x17e80, c, ov_SC05_007_jr_8013FFD8] - [0x1CA44, c, ov_SC05_007_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_007_after] @@ -107,20 +108,22 @@ segments: - [0x588b8, data, tail] - [0x72838, .rodata, ov_SC05_007_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x72904, data, tail2] + - [0x729b0, .rodata, ov_SC05_007_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x72a14, data, tail3] - [0x73058, .rodata, ov_SC05_007_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7308c, data, tail3] + - [0x7308c, data, tail4] - [0x730f4, .rodata, ov_SC05_007_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73160, data, tail4] + - [0x73160, data, tail5] - [0x732f4, .rodata, ov_SC05_007_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73310, data, tail5] + - [0x73310, data, tail6] - [0x73314, .rodata, ov_SC05_007_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73330, data, tail6] + - [0x73330, data, tail7] - [0x73388, .rodata, ov_SC05_007_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x733a8, data, tail7] + - [0x733a8, data, tail8] - [0x73428, .rodata, ov_SC05_007_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7343c, data, tail8] + - [0x7343c, data, tail9] - [0x735e4, .rodata, ov_SC05_007_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7375c, data, tail9] + - [0x7375c, data, tail10] - [0x74DA4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x74DA7] # 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_SC05_008.yaml b/config/splat.ov_SC05_008.yaml index 63351077c..cfe164e59 100644 --- a/config/splat.ov_SC05_008.yaml +++ b/config/splat.ov_SC05_008.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_008] - [0x2b88, c, ov_SC05_008_jr_8012ACE0] + - [0xff88, c, ov_SC05_008_jr_801380E0] - [0x17e80, c, ov_SC05_008_jr_8013FFD8] - [0x1CA44, c, ov_SC05_008_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_008_after] @@ -107,20 +108,22 @@ segments: - [0x5a810, data, tail] - [0x76b6c, .rodata, ov_SC05_008_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x76c38, data, tail2] + - [0x76ce4, .rodata, ov_SC05_008_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x76d48, data, tail3] - [0x7738c, .rodata, ov_SC05_008_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x773c0, data, tail3] + - [0x773c0, data, tail4] - [0x77428, .rodata, ov_SC05_008_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77494, data, tail4] + - [0x77494, data, tail5] - [0x77628, .rodata, ov_SC05_008_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77644, data, tail5] + - [0x77644, data, tail6] - [0x77648, .rodata, ov_SC05_008_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77664, data, tail6] + - [0x77664, data, tail7] - [0x776bc, .rodata, ov_SC05_008_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x776dc, data, tail7] + - [0x776dc, data, tail8] - [0x7775c, .rodata, ov_SC05_008_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77770, data, tail8] + - [0x77770, data, tail9] - [0x77918, .rodata, ov_SC05_008_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77a90, data, tail9] + - [0x77a90, data, tail10] - [0x79190, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x79193] # 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_SC05_009.yaml b/config/splat.ov_SC05_009.yaml index cb9b4131c..87a5c5943 100644 --- a/config/splat.ov_SC05_009.yaml +++ b/config/splat.ov_SC05_009.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_009] - [0x2b88, c, ov_SC05_009_jr_8012ACE0] + - [0xff88, c, ov_SC05_009_jr_801380E0] - [0x17e80, c, ov_SC05_009_jr_8013FFD8] - [0x1CA44, c, ov_SC05_009_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_009_after] @@ -105,18 +106,20 @@ segments: - [0x56920, data, tail] - [0x6c580, .rodata, ov_SC05_009_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6c64c, data, tail2] + - [0x6c6f8, .rodata, ov_SC05_009_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6c75c, data, tail3] - [0x6cda0, .rodata, ov_SC05_009_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cdd4, data, tail3] + - [0x6cdd4, data, tail4] - [0x6ce3c, .rodata, ov_SC05_009_after] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cea8, data, tail4] + - [0x6cea8, data, tail5] - [0x6d05c, .rodata, ov_SC05_009_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6d078, data, tail5] + - [0x6d078, data, tail6] - [0x6d0d0, .rodata, ov_SC05_009_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6d0f0, data, tail6] + - [0x6d0f0, data, tail7] - [0x6d170, .rodata, ov_SC05_009_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6d184, data, tail7] + - [0x6d184, data, tail8] - [0x6d32c, .rodata, ov_SC05_009_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6d4a4, data, tail8] + - [0x6d4a4, data, tail9] - [0x6EAEC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6EAEF] # 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_SC05_010.yaml b/config/splat.ov_SC05_010.yaml index 741b7219c..f020c7f39 100644 --- a/config/splat.ov_SC05_010.yaml +++ b/config/splat.ov_SC05_010.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_010] - [0x2b88, c, ov_SC05_010_jr_8012ACE0] + - [0xff88, c, ov_SC05_010_jr_801380E0] - [0x17e80, c, ov_SC05_010_jr_8013FFD8] - [0x1CA44, c, ov_SC05_010_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_010_after] @@ -107,20 +108,22 @@ segments: - [0x607fc, data, tail] - [0x9c7b4, .rodata, ov_SC05_010_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x9c880, data, tail2] + - [0x9c92c, .rodata, ov_SC05_010_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x9c990, data, tail3] - [0x9cfd4, .rodata, ov_SC05_010_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d008, data, tail3] + - [0x9d008, data, tail4] - [0x9d070, .rodata, ov_SC05_010_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d0dc, data, tail4] + - [0x9d0dc, data, tail5] - [0x9d270, .rodata, ov_SC05_010_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d28c, data, tail5] + - [0x9d28c, data, tail6] - [0x9d290, .rodata, ov_SC05_010_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d2ac, data, tail6] + - [0x9d2ac, data, tail7] - [0x9d304, .rodata, ov_SC05_010_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d324, data, tail7] + - [0x9d324, data, tail8] - [0x9d3a4, .rodata, ov_SC05_010_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d3b8, data, tail8] + - [0x9d3b8, data, tail9] - [0x9d560, .rodata, ov_SC05_010_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9d6d8, data, tail9] + - [0x9d6d8, data, tail10] - [0x9FED4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x9FED7] # 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_SC05_011.yaml b/config/splat.ov_SC05_011.yaml index f5f961569..dad695ef9 100644 --- a/config/splat.ov_SC05_011.yaml +++ b/config/splat.ov_SC05_011.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_011] - [0x2b88, c, ov_SC05_011_jr_8012ACE0] + - [0xff88, c, ov_SC05_011_jr_801380E0] - [0x17e80, c, ov_SC05_011_jr_8013FFD8] - [0x1CA44, c, ov_SC05_011_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_011_after] @@ -107,20 +108,22 @@ segments: - [0x55b74, data, tail] - [0x72b18, .rodata, ov_SC05_011_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x72be4, data, tail2] + - [0x72c90, .rodata, ov_SC05_011_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x72cf4, data, tail3] - [0x73338, .rodata, ov_SC05_011_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7336c, data, tail3] + - [0x7336c, data, tail4] - [0x733d4, .rodata, ov_SC05_011_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73440, data, tail4] + - [0x73440, data, tail5] - [0x735d4, .rodata, ov_SC05_011_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x735f0, data, tail5] + - [0x735f0, data, tail6] - [0x735f4, .rodata, ov_SC05_011_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73610, data, tail6] + - [0x73610, data, tail7] - [0x73668, .rodata, ov_SC05_011_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73688, data, tail7] + - [0x73688, data, tail8] - [0x73708, .rodata, ov_SC05_011_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7371c, data, tail8] + - [0x7371c, data, tail9] - [0x738c4, .rodata, ov_SC05_011_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73a3c, data, tail9] + - [0x73a3c, data, tail10] - [0x75084, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x75087] # 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_SC05_017.yaml b/config/splat.ov_SC05_017.yaml index d9e01a560..be68093d6 100644 --- a/config/splat.ov_SC05_017.yaml +++ b/config/splat.ov_SC05_017.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_017] - [0x2b88, c, ov_SC05_017_jr_8012ACE0] + - [0xff88, c, ov_SC05_017_jr_801380E0] - [0x17e80, c, ov_SC05_017_jr_8013FFD8] - [0x1CA44, c, ov_SC05_017_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_017_after] @@ -107,20 +108,22 @@ segments: - [0x64d94, data, tail] - [0xc2200, .rodata, ov_SC05_017_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc22cc, data, tail2] + - [0xc2378, .rodata, ov_SC05_017_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xc23dc, data, tail3] - [0xc2a20, .rodata, ov_SC05_017_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc2a54, data, tail3] + - [0xc2a54, data, tail4] - [0xc2abc, .rodata, ov_SC05_017_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc2b28, data, tail4] + - [0xc2b28, data, tail5] - [0xc2cbc, .rodata, ov_SC05_017_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc2cd8, data, tail5] + - [0xc2cd8, data, tail6] - [0xc2cdc, .rodata, ov_SC05_017_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc2cf8, data, tail6] + - [0xc2cf8, data, tail7] - [0xc2d50, .rodata, ov_SC05_017_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc2d70, data, tail7] + - [0xc2d70, data, tail8] - [0xc2df0, .rodata, ov_SC05_017_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc2e04, data, tail8] + - [0xc2e04, data, tail9] - [0xc2fac, .rodata, ov_SC05_017_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc3124, data, tail9] + - [0xc3124, data, tail10] - [0xC582C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xC582F] # 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_SC05_018.yaml b/config/splat.ov_SC05_018.yaml index 98ad89070..1afc29c62 100644 --- a/config/splat.ov_SC05_018.yaml +++ b/config/splat.ov_SC05_018.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_018] - [0x2b88, c, ov_SC05_018_jr_8012ACE0] + - [0xff88, c, ov_SC05_018_jr_801380E0] - [0x17e80, c, ov_SC05_018_jr_8013FFD8] - [0x1CA44, c, ov_SC05_018_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_018_after] @@ -107,20 +108,22 @@ segments: - [0x5e790, data, tail] - [0xbbd74, .rodata, ov_SC05_018_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xbbe40, data, tail2] + - [0xbbeec, .rodata, ov_SC05_018_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xbbf50, data, tail3] - [0xbc594, .rodata, ov_SC05_018_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbc5c8, data, tail3] + - [0xbc5c8, data, tail4] - [0xbc630, .rodata, ov_SC05_018_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbc69c, data, tail4] + - [0xbc69c, data, tail5] - [0xbc830, .rodata, ov_SC05_018_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbc84c, data, tail5] + - [0xbc84c, data, tail6] - [0xbc850, .rodata, ov_SC05_018_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbc86c, data, tail6] + - [0xbc86c, data, tail7] - [0xbc8c4, .rodata, ov_SC05_018_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbc8e4, data, tail7] + - [0xbc8e4, data, tail8] - [0xbc964, .rodata, ov_SC05_018_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbc978, data, tail8] + - [0xbc978, data, tail9] - [0xbcb20, .rodata, ov_SC05_018_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xbcc98, data, tail9] + - [0xbcc98, data, tail10] - [0xBE734, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBE737] # 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_SC05_019.yaml b/config/splat.ov_SC05_019.yaml index c98df4895..148189419 100644 --- a/config/splat.ov_SC05_019.yaml +++ b/config/splat.ov_SC05_019.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC05_019] - [0x2b88, c, ov_SC05_019_jr_8012ACE0] + - [0xff88, c, ov_SC05_019_jr_801380E0] - [0x17e80, c, ov_SC05_019_jr_8013FFD8] - [0x1CA44, c, ov_SC05_019_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC05_019_after] @@ -107,20 +108,22 @@ segments: - [0x570d4, data, tail] - [0x65488, .rodata, ov_SC05_019_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x65554, data, tail2] + - [0x65600, .rodata, ov_SC05_019_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x65664, data, tail3] - [0x65ca8, .rodata, ov_SC05_019_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65cdc, data, tail3] + - [0x65cdc, data, tail4] - [0x65d44, .rodata, ov_SC05_019_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65db0, data, tail4] + - [0x65db0, data, tail5] - [0x65f44, .rodata, ov_SC05_019_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65f60, data, tail5] + - [0x65f60, data, tail6] - [0x65f64, .rodata, ov_SC05_019_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65f80, data, tail6] + - [0x65f80, data, tail7] - [0x65fd8, .rodata, ov_SC05_019_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x65ff8, data, tail7] + - [0x65ff8, data, tail8] - [0x66078, .rodata, ov_SC05_019_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6608c, data, tail8] + - [0x6608c, data, tail9] - [0x66234, .rodata, ov_SC05_019_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x663ac, data, tail9] + - [0x663ac, data, tail10] - [0x679D4, bin, trailing] # final 1 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x679D5] # 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_SC06_000.yaml b/config/splat.ov_SC06_000.yaml index 8dc78fafb..5c09f0b13 100644 --- a/config/splat.ov_SC06_000.yaml +++ b/config/splat.ov_SC06_000.yaml @@ -93,7 +93,9 @@ segments: # shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at # 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave). # - [0x0, rodata, head] - - [0x0, c, ov_SC06_000] # -O2 before whale (file 0x0..0x1CA44) + - [0x0, c, ov_SC06_000] + - [0x2b88, c, ov_SC06_000_jr_8012ACE0] + - [0xff88, c, ov_SC06_000_jr_801380E0] - [0x1CA44, c, ov_SC06_000_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_000_after] - [0x2c2f4, c, ov_SC06_000_jr_8015444C] @@ -103,20 +105,22 @@ segments: - [0x4b364, c, ov_SC06_000_jr_801734BC] - [0x50be8, c, ov_SC06_000_jr_80178D40] - [0x600e4, data, tail] - - [0x84100, .rodata, ov_SC06_000] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x84100, .rodata, ov_SC06_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x841cc, data, tail2] + - [0x84278, .rodata, ov_SC06_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x842dc, data, tail3] - [0x849bc, .rodata, ov_SC06_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x84a28, data, tail3] + - [0x84a28, data, tail4] - [0x84bbc, .rodata, ov_SC06_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x84bd8, data, tail4] + - [0x84bd8, data, tail5] - [0x84bdc, .rodata, ov_SC06_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x84bf8, data, tail5] + - [0x84bf8, data, tail6] - [0x84c50, .rodata, ov_SC06_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x84c70, data, tail6] + - [0x84c70, data, tail7] - [0x84cf0, .rodata, ov_SC06_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x84d04, data, tail7] + - [0x84d04, data, tail8] - [0x84eac, .rodata, ov_SC06_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x85024, data, tail8] + - [0x85024, data, tail9] - [0x8A02C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8A02F] # 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_SC06_006.yaml b/config/splat.ov_SC06_006.yaml index 2a0dce258..5aa3037e7 100644 --- a/config/splat.ov_SC06_006.yaml +++ b/config/splat.ov_SC06_006.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_006] - [0x2b88, c, ov_SC06_006_jr_8012ACE0] + - [0xff88, c, ov_SC06_006_jr_801380E0] - [0x17e80, c, ov_SC06_006_jr_8013FFD8] - [0x1CA44, c, ov_SC06_006_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_006_after] @@ -107,20 +108,22 @@ segments: - [0x59c08, data, tail] - [0xcda08, .rodata, ov_SC06_006_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xcdad4, data, tail2] + - [0xcdb80, .rodata, ov_SC06_006_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xcdbe4, data, tail3] - [0xce228, .rodata, ov_SC06_006_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce25c, data, tail3] + - [0xce25c, data, tail4] - [0xce2c4, .rodata, ov_SC06_006_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce330, data, tail4] + - [0xce330, data, tail5] - [0xce4c4, .rodata, ov_SC06_006_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce4e0, data, tail5] + - [0xce4e0, data, tail6] - [0xce4e4, .rodata, ov_SC06_006_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce500, data, tail6] + - [0xce500, data, tail7] - [0xce558, .rodata, ov_SC06_006_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce578, data, tail7] + - [0xce578, data, tail8] - [0xce5f8, .rodata, ov_SC06_006_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce60c, data, tail8] + - [0xce60c, data, tail9] - [0xce7b4, .rodata, ov_SC06_006_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xce92c, data, tail9] + - [0xce92c, data, tail10] - [0xD0A0C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xD0A0F] # 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_SC06_008.yaml b/config/splat.ov_SC06_008.yaml index aa473abc6..529b8fd04 100644 --- a/config/splat.ov_SC06_008.yaml +++ b/config/splat.ov_SC06_008.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_008] - [0x2b88, c, ov_SC06_008_jr_8012ACE0] + - [0xff88, c, ov_SC06_008_jr_801380E0] - [0x17e80, c, ov_SC06_008_jr_8013FFD8] - [0x1CA44, c, ov_SC06_008_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_008_after] @@ -107,20 +108,22 @@ segments: - [0x5d670, data, tail] - [0x7fae0, .rodata, ov_SC06_008_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7fbac, data, tail2] + - [0x7fc58, .rodata, ov_SC06_008_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7fcbc, data, tail3] - [0x80300, .rodata, ov_SC06_008_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80334, data, tail3] + - [0x80334, data, tail4] - [0x8039c, .rodata, ov_SC06_008_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80408, data, tail4] + - [0x80408, data, tail5] - [0x8059c, .rodata, ov_SC06_008_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x805b8, data, tail5] + - [0x805b8, data, tail6] - [0x805bc, .rodata, ov_SC06_008_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x805d8, data, tail6] + - [0x805d8, data, tail7] - [0x80630, .rodata, ov_SC06_008_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80650, data, tail7] + - [0x80650, data, tail8] - [0x806d0, .rodata, ov_SC06_008_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x806e4, data, tail8] + - [0x806e4, data, tail9] - [0x8088c, .rodata, ov_SC06_008_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80a04, data, tail9] + - [0x80a04, data, tail10] - [0x826DC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x826DF] # 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_SC06_010.yaml b/config/splat.ov_SC06_010.yaml index c0533c4b1..8b9a932d4 100644 --- a/config/splat.ov_SC06_010.yaml +++ b/config/splat.ov_SC06_010.yaml @@ -93,7 +93,9 @@ segments: # shift the code start. Mark it `rodata` (section_order places .rodata first) so it lands at # 0x80128158 ahead of the code, a 1-word analogue of main's rodata-island (no ld_interleave). # - [0x0, rodata, head] - - [0x0, c, ov_SC06_010] # -O2 before whale (file 0x0..0x1CA44) + - [0x0, c, ov_SC06_010] + - [0x2b88, c, ov_SC06_010_jr_8012ACE0] + - [0xff88, c, ov_SC06_010_jr_801380E0] - [0x1CA44, c, ov_SC06_010_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_010_after] - [0x2c2f4, c, ov_SC06_010_jr_8015444C] @@ -103,20 +105,22 @@ segments: - [0x4b364, c, ov_SC06_010_jr_801734BC] - [0x50be8, c, ov_SC06_010_jr_80178D40] - [0x5e84c, data, tail] - - [0x87b34, .rodata, ov_SC06_010] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x87b34, .rodata, ov_SC06_010_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x87c00, data, tail2] + - [0x87cac, .rodata, ov_SC06_010_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x87d10, data, tail3] - [0x883f0, .rodata, ov_SC06_010_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8845c, data, tail3] + - [0x8845c, data, tail4] - [0x885f0, .rodata, ov_SC06_010_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8860c, data, tail4] + - [0x8860c, data, tail5] - [0x88610, .rodata, ov_SC06_010_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8862c, data, tail5] + - [0x8862c, data, tail6] - [0x88684, .rodata, ov_SC06_010_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x886a4, data, tail6] + - [0x886a4, data, tail7] - [0x88724, .rodata, ov_SC06_010_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88738, data, tail7] + - [0x88738, data, tail8] - [0x888e0, .rodata, ov_SC06_010_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x88a58, data, tail8] + - [0x88a58, data, tail9] - [0x8AB24, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8AB27] # 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_SC06_011.yaml b/config/splat.ov_SC06_011.yaml index b817b55ab..cdd43f556 100644 --- a/config/splat.ov_SC06_011.yaml +++ b/config/splat.ov_SC06_011.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_011] - [0x2b88, c, ov_SC06_011_jr_8012ACE0] + - [0xff88, c, ov_SC06_011_jr_801380E0] - [0x17e80, c, ov_SC06_011_jr_8013FFD8] - [0x1CA44, c, ov_SC06_011_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_011_after] @@ -107,20 +108,22 @@ segments: - [0x582ac, data, tail] - [0x81694, .rodata, ov_SC06_011_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x81760, data, tail2] + - [0x8180c, .rodata, ov_SC06_011_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x81870, data, tail3] - [0x81eb4, .rodata, ov_SC06_011_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81ee8, data, tail3] + - [0x81ee8, data, tail4] - [0x81f50, .rodata, ov_SC06_011_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81fbc, data, tail4] + - [0x81fbc, data, tail5] - [0x82150, .rodata, ov_SC06_011_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8216c, data, tail5] + - [0x8216c, data, tail6] - [0x82170, .rodata, ov_SC06_011_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8218c, data, tail6] + - [0x8218c, data, tail7] - [0x821e4, .rodata, ov_SC06_011_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82204, data, tail7] + - [0x82204, data, tail8] - [0x82284, .rodata, ov_SC06_011_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x82298, data, tail8] + - [0x82298, data, tail9] - [0x82440, .rodata, ov_SC06_011_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x825b8, data, tail9] + - [0x825b8, data, tail10] - [0x83BFC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x83BFF] # 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_SC06_013.yaml b/config/splat.ov_SC06_013.yaml index d5992b02b..dd5eb43a9 100644 --- a/config/splat.ov_SC06_013.yaml +++ b/config/splat.ov_SC06_013.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_013] - [0x2b88, c, ov_SC06_013_jr_8012ACE0] + - [0xff88, c, ov_SC06_013_jr_801380E0] - [0x17e80, c, ov_SC06_013_jr_8013FFD8] - [0x1CA44, c, ov_SC06_013_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_013_after] @@ -107,20 +108,22 @@ segments: - [0x56a28, data, tail] - [0x70568, .rodata, ov_SC06_013_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x70634, data, tail2] + - [0x706e0, .rodata, ov_SC06_013_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x70744, data, tail3] - [0x70d88, .rodata, ov_SC06_013_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70dbc, data, tail3] + - [0x70dbc, data, tail4] - [0x70e24, .rodata, ov_SC06_013_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x70e90, data, tail4] + - [0x70e90, data, tail5] - [0x71024, .rodata, ov_SC06_013_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71040, data, tail5] + - [0x71040, data, tail6] - [0x71044, .rodata, ov_SC06_013_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71060, data, tail6] + - [0x71060, data, tail7] - [0x710b8, .rodata, ov_SC06_013_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x710d8, data, tail7] + - [0x710d8, data, tail8] - [0x71158, .rodata, ov_SC06_013_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7116c, data, tail8] + - [0x7116c, data, tail9] - [0x71314, .rodata, ov_SC06_013_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7148c, data, tail9] + - [0x7148c, data, tail10] - [0x72AAC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x72AAF] # 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_SC06_014.yaml b/config/splat.ov_SC06_014.yaml index 53baec817..31e535062 100644 --- a/config/splat.ov_SC06_014.yaml +++ b/config/splat.ov_SC06_014.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_014] - [0x2b88, c, ov_SC06_014_jr_8012ACE0] + - [0xff88, c, ov_SC06_014_jr_801380E0] - [0x17e80, c, ov_SC06_014_jr_8013FFD8] - [0x1CA44, c, ov_SC06_014_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_014_after] @@ -107,20 +108,22 @@ segments: - [0x57d8c, data, tail] - [0x76f58, .rodata, ov_SC06_014_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x77024, data, tail2] + - [0x770d0, .rodata, ov_SC06_014_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x77134, data, tail3] - [0x77778, .rodata, ov_SC06_014_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x777ac, data, tail3] + - [0x777ac, data, tail4] - [0x77814, .rodata, ov_SC06_014_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77880, data, tail4] + - [0x77880, data, tail5] - [0x77a14, .rodata, ov_SC06_014_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77a30, data, tail5] + - [0x77a30, data, tail6] - [0x77a34, .rodata, ov_SC06_014_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77a50, data, tail6] + - [0x77a50, data, tail7] - [0x77aa8, .rodata, ov_SC06_014_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77ac8, data, tail7] + - [0x77ac8, data, tail8] - [0x77b48, .rodata, ov_SC06_014_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77b5c, data, tail8] + - [0x77b5c, data, tail9] - [0x77d04, .rodata, ov_SC06_014_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x77e7c, data, tail9] + - [0x77e7c, data, tail10] - [0x794C4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x794C7] # 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_SC06_015.yaml b/config/splat.ov_SC06_015.yaml index 2d96e9e88..2f31b1053 100644 --- a/config/splat.ov_SC06_015.yaml +++ b/config/splat.ov_SC06_015.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_015] - [0x2b88, c, ov_SC06_015_jr_8012ACE0] + - [0xff88, c, ov_SC06_015_jr_801380E0] - [0x17e80, c, ov_SC06_015_jr_8013FFD8] - [0x1CA44, c, ov_SC06_015_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_015_after] @@ -107,20 +108,22 @@ segments: - [0x568e4, data, tail] - [0x6a338, .rodata, ov_SC06_015_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6a404, data, tail2] + - [0x6a4b0, .rodata, ov_SC06_015_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6a514, data, tail3] - [0x6ab58, .rodata, ov_SC06_015_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6ab8c, data, tail3] + - [0x6ab8c, data, tail4] - [0x6abf4, .rodata, ov_SC06_015_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6ac60, data, tail4] + - [0x6ac60, data, tail5] - [0x6adf4, .rodata, ov_SC06_015_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6ae10, data, tail5] + - [0x6ae10, data, tail6] - [0x6ae14, .rodata, ov_SC06_015_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6ae30, data, tail6] + - [0x6ae30, data, tail7] - [0x6ae88, .rodata, ov_SC06_015_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6aea8, data, tail7] + - [0x6aea8, data, tail8] - [0x6af28, .rodata, ov_SC06_015_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6af3c, data, tail8] + - [0x6af3c, data, tail9] - [0x6b0e4, .rodata, ov_SC06_015_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6b25c, data, tail9] + - [0x6b25c, data, tail10] - [0x6C8A4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6C8A7] # 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_SC06_016.yaml b/config/splat.ov_SC06_016.yaml index 4a2f42602..0021cafbe 100644 --- a/config/splat.ov_SC06_016.yaml +++ b/config/splat.ov_SC06_016.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_016] - [0x2b88, c, ov_SC06_016_jr_8012ACE0] + - [0xff88, c, ov_SC06_016_jr_801380E0] - [0x17e80, c, ov_SC06_016_jr_8013FFD8] - [0x1CA44, c, ov_SC06_016_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_016_after] @@ -107,20 +108,22 @@ segments: - [0x5ccf4, data, tail] - [0x74f80, .rodata, ov_SC06_016_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x7504c, data, tail2] + - [0x750f8, .rodata, ov_SC06_016_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x7515c, data, tail3] - [0x757a0, .rodata, ov_SC06_016_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x757d4, data, tail3] + - [0x757d4, data, tail4] - [0x7583c, .rodata, ov_SC06_016_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x758a8, data, tail4] + - [0x758a8, data, tail5] - [0x75a3c, .rodata, ov_SC06_016_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75a58, data, tail5] + - [0x75a58, data, tail6] - [0x75a5c, .rodata, ov_SC06_016_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75a78, data, tail6] + - [0x75a78, data, tail7] - [0x75ad0, .rodata, ov_SC06_016_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75af0, data, tail7] + - [0x75af0, data, tail8] - [0x75b70, .rodata, ov_SC06_016_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75b84, data, tail8] + - [0x75b84, data, tail9] - [0x75d2c, .rodata, ov_SC06_016_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x75ea4, data, tail9] + - [0x75ea4, data, tail10] - [0x78114, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x78117] # 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_SC06_018.yaml b/config/splat.ov_SC06_018.yaml index 23f9cb010..a81811537 100644 --- a/config/splat.ov_SC06_018.yaml +++ b/config/splat.ov_SC06_018.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_018] - [0x2b88, c, ov_SC06_018_jr_8012ACE0] + - [0xff88, c, ov_SC06_018_jr_801380E0] - [0x17e80, c, ov_SC06_018_jr_8013FFD8] - [0x1CA44, c, ov_SC06_018_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_018_after] @@ -107,20 +108,22 @@ segments: - [0x6b430, data, tail] - [0xaa810, .rodata, ov_SC06_018_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xaa8dc, data, tail2] + - [0xaa988, .rodata, ov_SC06_018_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xaa9ec, data, tail3] - [0xab030, .rodata, ov_SC06_018_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab064, data, tail3] + - [0xab064, data, tail4] - [0xab0cc, .rodata, ov_SC06_018_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab138, data, tail4] + - [0xab138, data, tail5] - [0xab2cc, .rodata, ov_SC06_018_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab2e8, data, tail5] + - [0xab2e8, data, tail6] - [0xab2ec, .rodata, ov_SC06_018_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab308, data, tail6] + - [0xab308, data, tail7] - [0xab360, .rodata, ov_SC06_018_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab380, data, tail7] + - [0xab380, data, tail8] - [0xab400, .rodata, ov_SC06_018_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab414, data, tail8] + - [0xab414, data, tail9] - [0xab5bc, .rodata, ov_SC06_018_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab734, data, tail9] + - [0xab734, data, tail10] - [0xADA44, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xADA47] # 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_SC06_020.yaml b/config/splat.ov_SC06_020.yaml index 8b795c044..29246d331 100644 --- a/config/splat.ov_SC06_020.yaml +++ b/config/splat.ov_SC06_020.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_020] - [0x2b88, c, ov_SC06_020_jr_8012ACE0] + - [0xff88, c, ov_SC06_020_jr_801380E0] - [0x17e80, c, ov_SC06_020_jr_8013FFD8] - [0x1CA44, c, ov_SC06_020_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_020_after] @@ -107,20 +108,22 @@ segments: - [0x5ceb8, data, tail] - [0x900f8, .rodata, ov_SC06_020_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x901c4, data, tail2] + - [0x90270, .rodata, ov_SC06_020_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x902d4, data, tail3] - [0x90918, .rodata, ov_SC06_020_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9094c, data, tail3] + - [0x9094c, data, tail4] - [0x909b4, .rodata, ov_SC06_020_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90a20, data, tail4] + - [0x90a20, data, tail5] - [0x90bb4, .rodata, ov_SC06_020_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90bd0, data, tail5] + - [0x90bd0, data, tail6] - [0x90bd4, .rodata, ov_SC06_020_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90bf0, data, tail6] + - [0x90bf0, data, tail7] - [0x90c48, .rodata, ov_SC06_020_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90c68, data, tail7] + - [0x90c68, data, tail8] - [0x90ce8, .rodata, ov_SC06_020_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90cfc, data, tail8] + - [0x90cfc, data, tail9] - [0x90ea4, .rodata, ov_SC06_020_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9101c, data, tail9] + - [0x9101c, data, tail10] - [0x92894, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x92897] # 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_SC06_022.yaml b/config/splat.ov_SC06_022.yaml index 804174ad3..a63b665d2 100644 --- a/config/splat.ov_SC06_022.yaml +++ b/config/splat.ov_SC06_022.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_022] - [0x2b88, c, ov_SC06_022_jr_8012ACE0] + - [0xff88, c, ov_SC06_022_jr_801380E0] - [0x17e80, c, ov_SC06_022_jr_8013FFD8] - [0x1CA44, c, ov_SC06_022_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_022_after] @@ -107,20 +108,22 @@ segments: - [0x65174, data, tail] - [0xb7908, .rodata, ov_SC06_022_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb79d4, data, tail2] + - [0xb7a80, .rodata, ov_SC06_022_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb7ae4, data, tail3] - [0xb8128, .rodata, ov_SC06_022_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb815c, data, tail3] + - [0xb815c, data, tail4] - [0xb81c4, .rodata, ov_SC06_022_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb8230, data, tail4] + - [0xb8230, data, tail5] - [0xb83c4, .rodata, ov_SC06_022_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb83e0, data, tail5] + - [0xb83e0, data, tail6] - [0xb83e4, .rodata, ov_SC06_022_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb8400, data, tail6] + - [0xb8400, data, tail7] - [0xb8458, .rodata, ov_SC06_022_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb8478, data, tail7] + - [0xb8478, data, tail8] - [0xb84f8, .rodata, ov_SC06_022_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb850c, data, tail8] + - [0xb850c, data, tail9] - [0xb86b4, .rodata, ov_SC06_022_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb882c, data, tail9] + - [0xb882c, data, tail10] - [0xBA114, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBA117] # 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_SC06_024.yaml b/config/splat.ov_SC06_024.yaml index 82615e646..4d5106e78 100644 --- a/config/splat.ov_SC06_024.yaml +++ b/config/splat.ov_SC06_024.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_024] - [0x2b88, c, ov_SC06_024_jr_8012ACE0] + - [0xff88, c, ov_SC06_024_jr_801380E0] - [0x17e80, c, ov_SC06_024_jr_8013FFD8] - [0x1CA44, c, ov_SC06_024_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_024_after] @@ -107,20 +108,22 @@ segments: - [0x6764c, data, tail] - [0xb6a4c, .rodata, ov_SC06_024_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb6b18, data, tail2] + - [0xb6bc4, .rodata, ov_SC06_024_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb6c28, data, tail3] - [0xb726c, .rodata, ov_SC06_024_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb72a0, data, tail3] + - [0xb72a0, data, tail4] - [0xb7308, .rodata, ov_SC06_024_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7374, data, tail4] + - [0xb7374, data, tail5] - [0xb7508, .rodata, ov_SC06_024_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7524, data, tail5] + - [0xb7524, data, tail6] - [0xb7528, .rodata, ov_SC06_024_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7544, data, tail6] + - [0xb7544, data, tail7] - [0xb759c, .rodata, ov_SC06_024_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb75bc, data, tail7] + - [0xb75bc, data, tail8] - [0xb763c, .rodata, ov_SC06_024_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7650, data, tail8] + - [0xb7650, data, tail9] - [0xb77f8, .rodata, ov_SC06_024_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb7970, data, tail9] + - [0xb7970, data, tail10] - [0xB980C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xB980F] # 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_SC06_025.yaml b/config/splat.ov_SC06_025.yaml index 299fe37ed..51c394130 100644 --- a/config/splat.ov_SC06_025.yaml +++ b/config/splat.ov_SC06_025.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_025] - [0x2b88, c, ov_SC06_025_jr_8012ACE0] + - [0xff88, c, ov_SC06_025_jr_801380E0] - [0x17e80, c, ov_SC06_025_jr_8013FFD8] - [0x1CA44, c, ov_SC06_025_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_025_after] @@ -107,20 +108,22 @@ segments: - [0x5caf0, data, tail] - [0x86d6c, .rodata, ov_SC06_025_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x86e38, data, tail2] + - [0x86ee4, .rodata, ov_SC06_025_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x86f48, data, tail3] - [0x8758c, .rodata, ov_SC06_025_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x875c0, data, tail3] + - [0x875c0, data, tail4] - [0x87628, .rodata, ov_SC06_025_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87694, data, tail4] + - [0x87694, data, tail5] - [0x87828, .rodata, ov_SC06_025_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87844, data, tail5] + - [0x87844, data, tail6] - [0x87848, .rodata, ov_SC06_025_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87864, data, tail6] + - [0x87864, data, tail7] - [0x878bc, .rodata, ov_SC06_025_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x878dc, data, tail7] + - [0x878dc, data, tail8] - [0x8795c, .rodata, ov_SC06_025_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87970, data, tail8] + - [0x87970, data, tail9] - [0x87b18, .rodata, ov_SC06_025_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x87c90, data, tail9] + - [0x87c90, data, tail10] - [0x8A12C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x8A12F] # 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_SC06_027.yaml b/config/splat.ov_SC06_027.yaml index 18059e647..2c4c8045c 100644 --- a/config/splat.ov_SC06_027.yaml +++ b/config/splat.ov_SC06_027.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_027] - [0x2b88, c, ov_SC06_027_jr_8012ACE0] + - [0xff88, c, ov_SC06_027_jr_801380E0] - [0x17e80, c, ov_SC06_027_jr_8013FFD8] - [0x1CA44, c, ov_SC06_027_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_027_after] @@ -107,20 +108,22 @@ segments: - [0x55e30, data, tail] - [0x72da8, .rodata, ov_SC06_027_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x72e74, data, tail2] + - [0x72f20, .rodata, ov_SC06_027_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x72f84, data, tail3] - [0x735c8, .rodata, ov_SC06_027_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x735fc, data, tail3] + - [0x735fc, data, tail4] - [0x73664, .rodata, ov_SC06_027_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x736d0, data, tail4] + - [0x736d0, data, tail5] - [0x73864, .rodata, ov_SC06_027_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73880, data, tail5] + - [0x73880, data, tail6] - [0x73884, .rodata, ov_SC06_027_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x738a0, data, tail6] + - [0x738a0, data, tail7] - [0x738f8, .rodata, ov_SC06_027_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73918, data, tail7] + - [0x73918, data, tail8] - [0x73998, .rodata, ov_SC06_027_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x739ac, data, tail8] + - [0x739ac, data, tail9] - [0x73b54, .rodata, ov_SC06_027_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x73ccc, data, tail9] + - [0x73ccc, data, tail10] - [0x752D4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x752D7] # 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_SC06_029.yaml b/config/splat.ov_SC06_029.yaml index f6932305f..9fb8ad5c9 100644 --- a/config/splat.ov_SC06_029.yaml +++ b/config/splat.ov_SC06_029.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_029] - [0x2b88, c, ov_SC06_029_jr_8012ACE0] + - [0xff88, c, ov_SC06_029_jr_801380E0] - [0x17e80, c, ov_SC06_029_jr_8013FFD8] - [0x1CA44, c, ov_SC06_029_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_029_after] @@ -107,20 +108,22 @@ segments: - [0x643c0, data, tail] - [0xb2424, .rodata, ov_SC06_029_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xb24f0, data, tail2] + - [0xb259c, .rodata, ov_SC06_029_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xb2600, data, tail3] - [0xb2c44, .rodata, ov_SC06_029_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb2c78, data, tail3] + - [0xb2c78, data, tail4] - [0xb2ce0, .rodata, ov_SC06_029_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb2d4c, data, tail4] + - [0xb2d4c, data, tail5] - [0xb2ee0, .rodata, ov_SC06_029_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb2efc, data, tail5] + - [0xb2efc, data, tail6] - [0xb2f00, .rodata, ov_SC06_029_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb2f1c, data, tail6] + - [0xb2f1c, data, tail7] - [0xb2f74, .rodata, ov_SC06_029_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb2f94, data, tail7] + - [0xb2f94, data, tail8] - [0xb3014, .rodata, ov_SC06_029_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb3028, data, tail8] + - [0xb3028, data, tail9] - [0xb31d0, .rodata, ov_SC06_029_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xb3348, data, tail9] + - [0xb3348, data, tail10] - [0xBA034, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xBA037] # 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_SC06_030.yaml b/config/splat.ov_SC06_030.yaml index 5f5e02442..f9bc91f9b 100644 --- a/config/splat.ov_SC06_030.yaml +++ b/config/splat.ov_SC06_030.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_030] - [0x2b88, c, ov_SC06_030_jr_8012ACE0] + - [0xff88, c, ov_SC06_030_jr_801380E0] - [0x17e80, c, ov_SC06_030_jr_8013FFD8] - [0x1CA44, c, ov_SC06_030_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_030_after] @@ -107,20 +108,22 @@ segments: - [0x59cb4, data, tail] - [0x8f788, .rodata, ov_SC06_030_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8f854, data, tail2] + - [0x8f900, .rodata, ov_SC06_030_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8f964, data, tail3] - [0x8ffa8, .rodata, ov_SC06_030_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x8ffdc, data, tail3] + - [0x8ffdc, data, tail4] - [0x90044, .rodata, ov_SC06_030_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x900b0, data, tail4] + - [0x900b0, data, tail5] - [0x90244, .rodata, ov_SC06_030_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90260, data, tail5] + - [0x90260, data, tail6] - [0x90264, .rodata, ov_SC06_030_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x90280, data, tail6] + - [0x90280, data, tail7] - [0x902d8, .rodata, ov_SC06_030_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x902f8, data, tail7] + - [0x902f8, data, tail8] - [0x90378, .rodata, ov_SC06_030_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x9038c, data, tail8] + - [0x9038c, data, tail9] - [0x90534, .rodata, ov_SC06_030_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x906ac, data, tail9] + - [0x906ac, data, tail10] - [0x91F2C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x91F2F] # 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_SC06_032.yaml b/config/splat.ov_SC06_032.yaml index 2fdce2756..a60172690 100644 --- a/config/splat.ov_SC06_032.yaml +++ b/config/splat.ov_SC06_032.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_032] - [0x2b88, c, ov_SC06_032_jr_8012ACE0] + - [0xff88, c, ov_SC06_032_jr_801380E0] - [0x17e80, c, ov_SC06_032_jr_8013FFD8] - [0x1CA44, c, ov_SC06_032_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_032_after] @@ -107,20 +108,22 @@ segments: - [0x6b180, data, tail] - [0xa5de4, .rodata, ov_SC06_032_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa5eb0, data, tail2] + - [0xa5f5c, .rodata, ov_SC06_032_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa5fc0, data, tail3] - [0xa6604, .rodata, ov_SC06_032_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6638, data, tail3] + - [0xa6638, data, tail4] - [0xa66a0, .rodata, ov_SC06_032_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa670c, data, tail4] + - [0xa670c, data, tail5] - [0xa68a0, .rodata, ov_SC06_032_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa68bc, data, tail5] + - [0xa68bc, data, tail6] - [0xa68c0, .rodata, ov_SC06_032_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa68dc, data, tail6] + - [0xa68dc, data, tail7] - [0xa6934, .rodata, ov_SC06_032_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6954, data, tail7] + - [0xa6954, data, tail8] - [0xa69d4, .rodata, ov_SC06_032_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa69e8, data, tail8] + - [0xa69e8, data, tail9] - [0xa6b90, .rodata, ov_SC06_032_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6d08, data, tail9] + - [0xa6d08, data, tail10] - [0xA9014, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA9017] # 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_SC06_033.yaml b/config/splat.ov_SC06_033.yaml index f68173300..0ce220912 100644 --- a/config/splat.ov_SC06_033.yaml +++ b/config/splat.ov_SC06_033.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC06_033] - [0x2b88, c, ov_SC06_033_jr_8012ACE0] + - [0xff88, c, ov_SC06_033_jr_801380E0] - [0x17e80, c, ov_SC06_033_jr_8013FFD8] - [0x1CA44, c, ov_SC06_033_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC06_033_after] @@ -107,20 +108,22 @@ segments: - [0x69690, data, tail] - [0xa5e98, .rodata, ov_SC06_033_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa5f64, data, tail2] + - [0xa6010, .rodata, ov_SC06_033_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa6074, data, tail3] - [0xa66b8, .rodata, ov_SC06_033_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa66ec, data, tail3] + - [0xa66ec, data, tail4] - [0xa6754, .rodata, ov_SC06_033_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa67c0, data, tail4] + - [0xa67c0, data, tail5] - [0xa6954, .rodata, ov_SC06_033_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6970, data, tail5] + - [0xa6970, data, tail6] - [0xa6974, .rodata, ov_SC06_033_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6990, data, tail6] + - [0xa6990, data, tail7] - [0xa69e8, .rodata, ov_SC06_033_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6a08, data, tail7] + - [0xa6a08, data, tail8] - [0xa6a88, .rodata, ov_SC06_033_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6a9c, data, tail8] + - [0xa6a9c, data, tail9] - [0xa6c44, .rodata, ov_SC06_033_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6dbc, data, tail9] + - [0xa6dbc, data, tail10] - [0xA8E94, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA8E97] # 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_SC07_000.yaml b/config/splat.ov_SC07_000.yaml index 900a316d3..112e84cd1 100644 --- a/config/splat.ov_SC07_000.yaml +++ b/config/splat.ov_SC07_000.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC07_000] - [0x2b88, c, ov_SC07_000_jr_8012ACE0] + - [0xff88, c, ov_SC07_000_jr_801380E0] - [0x17e80, c, ov_SC07_000_jr_8013FFD8] - [0x1CA44, c, ov_SC07_000_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC07_000_after] @@ -107,20 +108,22 @@ segments: - [0x5a4d8, data, tail] - [0xa54f4, .rodata, ov_SC07_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa55c0, data, tail2] + - [0xa566c, .rodata, ov_SC07_000_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xa56d0, data, tail3] - [0xa5d14, .rodata, ov_SC07_000_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa5d48, data, tail3] + - [0xa5d48, data, tail4] - [0xa5db0, .rodata, ov_SC07_000_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa5e1c, data, tail4] + - [0xa5e1c, data, tail5] - [0xa5fb0, .rodata, ov_SC07_000_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa5fcc, data, tail5] + - [0xa5fcc, data, tail6] - [0xa5fd0, .rodata, ov_SC07_000_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa5fec, data, tail6] + - [0xa5fec, data, tail7] - [0xa6044, .rodata, ov_SC07_000_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6064, data, tail7] + - [0xa6064, data, tail8] - [0xa60e4, .rodata, ov_SC07_000_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa60f8, data, tail8] + - [0xa60f8, data, tail9] - [0xa62a0, .rodata, ov_SC07_000_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xa6418, data, tail9] + - [0xa6418, data, tail10] - [0xA8B8C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xA8B8F] # 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_SC07_001.yaml b/config/splat.ov_SC07_001.yaml index 311898e13..7c6b6d791 100644 --- a/config/splat.ov_SC07_001.yaml +++ b/config/splat.ov_SC07_001.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC07_001] - [0x2b88, c, ov_SC07_001_jr_8012ACE0] + - [0xff88, c, ov_SC07_001_jr_801380E0] - [0x17e80, c, ov_SC07_001_jr_8013FFD8] - [0x1CA44, c, ov_SC07_001_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC07_001_after] @@ -107,20 +108,22 @@ segments: - [0x59388, data, tail] - [0x80690, .rodata, ov_SC07_001_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x8075c, data, tail2] + - [0x80808, .rodata, ov_SC07_001_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x8086c, data, tail3] - [0x80eb0, .rodata, ov_SC07_001_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80ee4, data, tail3] + - [0x80ee4, data, tail4] - [0x80f4c, .rodata, ov_SC07_001_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x80fb8, data, tail4] + - [0x80fb8, data, tail5] - [0x8114c, .rodata, ov_SC07_001_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81168, data, tail5] + - [0x81168, data, tail6] - [0x8116c, .rodata, ov_SC07_001_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81188, data, tail6] + - [0x81188, data, tail7] - [0x811e0, .rodata, ov_SC07_001_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81200, data, tail7] + - [0x81200, data, tail8] - [0x81280, .rodata, ov_SC07_001_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x81294, data, tail8] + - [0x81294, data, tail9] - [0x8143c, .rodata, ov_SC07_001_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x815b4, data, tail9] + - [0x815b4, data, tail10] - [0x82DB4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x82DB7] # 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_SC07_002.yaml b/config/splat.ov_SC07_002.yaml index 637b40bad..d30c72918 100644 --- a/config/splat.ov_SC07_002.yaml +++ b/config/splat.ov_SC07_002.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC07_002] - [0x2b88, c, ov_SC07_002_jr_8012ACE0] + - [0xff88, c, ov_SC07_002_jr_801380E0] - [0x17e80, c, ov_SC07_002_jr_8013FFD8] - [0x1CA44, c, ov_SC07_002_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC07_002_after] @@ -107,20 +108,22 @@ segments: - [0x5e644, data, tail] - [0x71078, .rodata, ov_SC07_002_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x71144, data, tail2] + - [0x711f0, .rodata, ov_SC07_002_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x71254, data, tail3] - [0x71898, .rodata, ov_SC07_002_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x718cc, data, tail3] + - [0x718cc, data, tail4] - [0x71934, .rodata, ov_SC07_002_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x719a0, data, tail4] + - [0x719a0, data, tail5] - [0x71b34, .rodata, ov_SC07_002_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71b50, data, tail5] + - [0x71b50, data, tail6] - [0x71b54, .rodata, ov_SC07_002_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71b70, data, tail6] + - [0x71b70, data, tail7] - [0x71bc8, .rodata, ov_SC07_002_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71be8, data, tail7] + - [0x71be8, data, tail8] - [0x71c68, .rodata, ov_SC07_002_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71c7c, data, tail8] + - [0x71c7c, data, tail9] - [0x71e24, .rodata, ov_SC07_002_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x71f9c, data, tail9] + - [0x71f9c, data, tail10] - [0x77F7C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x77F7F] # 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_SC07_008.yaml b/config/splat.ov_SC07_008.yaml index 19a607c33..74caad082 100644 --- a/config/splat.ov_SC07_008.yaml +++ b/config/splat.ov_SC07_008.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC07_008] - [0x2b88, c, ov_SC07_008_jr_8012ACE0] + - [0xff88, c, ov_SC07_008_jr_801380E0] - [0x17e80, c, ov_SC07_008_jr_8013FFD8] - [0x1CA44, c, ov_SC07_008_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC07_008_after] @@ -107,20 +108,22 @@ segments: - [0x5515c, data, tail] - [0x6c0c8, .rodata, ov_SC07_008_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x6c194, data, tail2] + - [0x6c240, .rodata, ov_SC07_008_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x6c2a4, data, tail3] - [0x6c8e8, .rodata, ov_SC07_008_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c91c, data, tail3] + - [0x6c91c, data, tail4] - [0x6c984, .rodata, ov_SC07_008_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6c9f0, data, tail4] + - [0x6c9f0, data, tail5] - [0x6cb84, .rodata, ov_SC07_008_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cba0, data, tail5] + - [0x6cba0, data, tail6] - [0x6cba4, .rodata, ov_SC07_008_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cbc0, data, tail6] + - [0x6cbc0, data, tail7] - [0x6cc18, .rodata, ov_SC07_008_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cc38, data, tail7] + - [0x6cc38, data, tail8] - [0x6ccb8, .rodata, ov_SC07_008_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cccc, data, tail8] + - [0x6cccc, data, tail9] - [0x6ce74, .rodata, ov_SC07_008_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x6cfec, data, tail9] + - [0x6cfec, data, tail10] - [0x6E5EC, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x6E5EF] # 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_SC07_009.yaml b/config/splat.ov_SC07_009.yaml index 8e6b48e66..fd30a9777 100644 --- a/config/splat.ov_SC07_009.yaml +++ b/config/splat.ov_SC07_009.yaml @@ -95,6 +95,7 @@ segments: # - [0x0, rodata, head] - [0x0, c, ov_SC07_009] - [0x2b88, c, ov_SC07_009_jr_8012ACE0] + - [0xff88, c, ov_SC07_009_jr_801380E0] - [0x17e80, c, ov_SC07_009_jr_8013FFD8] - [0x1CA44, c, ov_SC07_009_o0b] # -O0 whale func_80144B9C (0x1CA44..0x1D64C) - [0x1d64c, c, ov_SC07_009_after] @@ -107,20 +108,22 @@ segments: - [0x55c00, data, tail] - [0x79754, .rodata, ov_SC07_009_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0x79820, data, tail2] + - [0x798cc, .rodata, ov_SC07_009_jr_801380E0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0x79930, data, tail3] - [0x79f74, .rodata, ov_SC07_009_jr_8013FFD8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x79fa8, data, tail3] + - [0x79fa8, data, tail4] - [0x7a010, .rodata, ov_SC07_009_jr_8015444C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7a07c, data, tail4] + - [0x7a07c, data, tail5] - [0x7a210, .rodata, ov_SC07_009_jr_8015A3C8] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7a22c, data, tail5] + - [0x7a22c, data, tail6] - [0x7a230, .rodata, ov_SC07_009_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7a24c, data, tail6] + - [0x7a24c, data, tail7] - [0x7a2a4, .rodata, ov_SC07_009_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7a2c4, data, tail7] + - [0x7a2c4, data, tail8] - [0x7a344, .rodata, ov_SC07_009_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7a358, data, tail8] + - [0x7a358, data, tail9] - [0x7a500, .rodata, ov_SC07_009_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0x7a678, data, tail9] + - [0x7a678, data, tail10] - [0x7BC7C, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0x7BC7F] # EOF marker = the 0.4.dec byte length # @TRAILING@ (above) is replaced by tools/new_overlay.sh: for a non-4-aligned overlay it becomes diff --git a/src/ov_SC01_000/ov_SC01_000_jr_8012ACE0.c b/src/ov_SC01_000/ov_SC01_000_jr_8012ACE0.c index 5b6cbfdd2..d0ddbfcf0 100644 --- a/src/ov_SC01_000/ov_SC01_000_jr_8012ACE0.c +++ b/src/ov_SC01_000/ov_SC01_000_jr_8012ACE0.c @@ -2822,1332 +2822,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F20C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F20C[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F250; -extern u8 D_8017F294; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F250; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F294 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F2D8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F314[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F314; - if (((s16)a1) < 0xC00) { - tbl = D_8017F2D8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F350, D_8017F352, D_8017F354, D_8017F356, D_8017F358, D_8017F35A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F352 < ang)) goto outer_else; - if (!(ang < D_8017F358)) goto inner_else; - if (ang < D_8017F354) { *(s16 *)L = D_8017F354; goto done; } - if (D_8017F356 < ang) { *(s16 *)L = D_8017F356; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F350) { *(s16 *)L = D_8017F350; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F35A < ang) { *(s16 *)L = D_8017F35A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A44C0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A44C0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A44C0; -extern s8 D_801A44C4; -extern s8 D_801A44C5; - -void func_8013C9C4(void * arg0) -{ - D_801A44C0 = arg0; - D_801A44C4 = 0; - D_801A44C5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A44C0; -extern s8 D_801A44C4; -extern s8 D_801A44C5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A44C0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A44C5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A44C4)) * 2) + D_801A44C0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A44C5 = (unsigned char) p[1]; - D_801A44C4 = D_801A44C4 + 1; - if (D_801A44C5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A44C4 = 0; - *base = 0; - } - } - else - { - D_801A44C5 = c - 1; - } - } - return; -} - - - -extern s32 D_801A44E4; -extern s32 D_801A44D8; -extern s32 D_801A44DC; -extern s32 D_801A44E8; - -void func_8013CABC(void) { - D_801A44E4 = 1; - D_801A44D8 = 1; - D_801A44DC = 0; - D_801A44E8 = 1; -} - - - -extern s32 D_801A44D8; -extern s32 D_801A44DC; -extern s32 D_801A44E0; -extern s32 D_801A44E4; -extern s32 D_801A44E8; - -void func_8013CAE8(void) { - D_801A44D8 = 1; - D_801A44E4 = 0; - D_801A44DC = 0; - D_801A44E0 = -1; - D_801A44E8 = 0; -} - - - -extern s32 D_801A44E4; -extern s32 D_801A44E8; -extern s32 D_801A4510; -extern s32 D_801A4514; - -void func_8013CB20(void) -{ - D_801A4510 = D_801A44E8; - D_801A4514 = D_801A44E4; - D_801A44E8 = 1; - D_801A44E4 = 0; -} - - - -extern s32 D_801A4510; -extern s32 D_801A4514; -extern s32 D_801A44E8; -extern s32 D_801A44E4; - -void func_8013CB5C(void) { - D_801A44E8 = D_801A4510; - D_801A44E4 = D_801A4514; -} - - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A5790; - extern u8 D_801A5791; - extern u8 D_801A5792; - extern u8 D_801A5793; - extern u8 D_801A5794; - extern u8 D_801A5795; - extern u8 D_801A5796; - extern u8 D_801A5797; - extern u8 D_801A5798; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A5790; t1 = D_801A5791; t2 = D_801A5792; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A5793; t1 = D_801A5794; t2 = D_801A5795; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A5796; t1 = D_801A5797; t2 = D_801A5798; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A44F0; -extern s32 D_801A44D8; -extern s32 D_801A44F4; -extern s32 D_801A44E4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A44F0 != 0) { - if (D_801A44F0 != 2) { - if (((D_801A44F0 < 3) && (D_801A44F0 == 1)) && - (D_801A44F4 = D_801A44F4 + 1, 0x23a < D_801A44F4)) { - D_801A44D8 = D_801A44F0; - D_801A44F0 = 2; - } - } else { - D_801A44D8 = D_801A44D8 + -1; - if (D_801A44D8 == 0) { - D_801A44D8 = D_801A44F0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A44E4 == 0) { - D_801A44F0 = D_801A44F0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A44E4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A44E4; -} - - -extern s32 D_801A44F0; - -void func_8013D164(void) { - D_801A44F0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A5872; -extern u8 D_801A58E6; -extern u8 D_801A579A; -extern u8 D_801A5854; -extern u8 D_801A5778; -extern u8 D_801A5799; -extern s32 D_801A5858; - -void func_8013D330(void) { - if ((D_801A5872 & 0xff) != D_801A58E6) { - D_801A5872 = ((D_801A5872 & 0xff) < D_801A58E6) ? (D_801A5872 + 1) : (D_801A5872 - 1); - } - if ((D_801A579A & 0xff) != D_801A5854) { - D_801A579A = ((D_801A579A & 0xff) < D_801A5854) ? (D_801A579A + 1) : (D_801A579A - 1); - } - if ((D_801A5778 & 0xff) != D_801A5799) { - D_801A5778 = ((D_801A5778 & 0xff) < D_801A5799) ? (D_801A5778 + 1) : (D_801A5778 - 1); - } - D_801A5858 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A44C8; -extern void *D_801A44CC; -extern void *D_801A44D0; -extern s32 D_801A44F8; -extern s32 D_801A44FC; -extern s32 D_801A4500; -extern s32 D_801A57CC[]; - -extern u8 D_8017F448[]; -extern u8 D_8017F4F0[]; -extern u8 D_8017F3A0[]; -extern u8 D_8017F49C[]; -extern u8 D_8017F51C[]; -extern u8 D_8017F3F4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A44F8 = param_2; - D_801A44FC = (param_2 >> 2) & 3; - D_801A4500 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A44C8 = D_8017F448; - D_801A44CC = D_8017F4F0; - D_801A44D0 = D_8017F3A0; - } else { - D_801A44C8 = D_8017F49C; - D_801A44CC = D_8017F51C; - D_801A44D0 = D_8017F3F4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A4500 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A44F8 & 2) != 0) { - D_801A57CC[0] = 0x140; - D_801A57CC[3] = 0x80; - if (p[0x37] == 4) { - D_801A57CC[0] = 0x140; - D_801A57CC[3] = 0; - } - if (p[0x37] == 0) { - D_801A57CC[0] = 0x140; - D_801A57CC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A44D0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A44D0; -extern s16 *D_801A44D4; -extern s32 D_801A44E4; -extern s32 D_801A4504; -extern s32 D_801A4508; -extern s32 D_801A450C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A44D4 != 0) { - D_801A44E4 = 0; - p = (int *)(param_1 * 12 + (int)D_801A44D0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A4504 != x) { - flag = 1; - if (D_801A4504 < x) { - if (x - D_801A4504 < 5) { - D_801A4504 = x; - } else { - D_801A4504 = D_801A4504 + 4; - } - } else { - if (D_801A4504 - x < 5) { - D_801A4504 = x; - } else { - D_801A4504 = D_801A4504 - 4; - } - } - } - if (D_801A4508 != y) { - flag = 1; - if (D_801A4508 < y) { - if (y - D_801A4508 < 5) { - D_801A4508 = y; - } else { - D_801A4508 = D_801A4508 + 4; - } - } else { - if (D_801A4508 - y < 5) { - D_801A4508 = y; - } else { - D_801A4508 = D_801A4508 - 4; - } - } - } - if (D_801A450C != z) { - flag = 1; - if (D_801A450C < z) { - if (z - D_801A450C < 5) { - D_801A450C = z; - } else { - D_801A450C = D_801A450C + 4; - } - } else { - if (D_801A450C - z < 5) { - D_801A450C = z; - } else { - D_801A450C = D_801A450C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A44E4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F5AC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A44D4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A4504); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A4508); - uVar5 = (*(int*)&D_801A450C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F5AC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - -extern s32 D_801A44EC; - -s32 func_8013E054(void) { - return D_801A44EC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FFA8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FF80; -extern s16 D_8017FF82; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FFA8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FF80 = 2; - D_8017FF82 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FF82 = 0; - D_8017FF80 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A4520; - extern void * D_801A4524; - extern unsigned char D_8017FC20; - extern unsigned char D_8017FC38; - extern unsigned char D_8017FCAC; - extern unsigned char D_8017FCB4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A4520 = &D_8017FC20; - D_801A4524 = &D_8017FCAC; - } else { - D_801A4520 = &D_8017FC38; - D_801A4524 = &D_8017FCB4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FFA8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FFA8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FFA8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FF84; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FF84)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FF84)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FF80; -extern s16 D_8017FF82; -extern unsigned char D_8017FF84; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FF82` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FF80` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FF82; - if (*r < 3) { - *r = *r + 1; - } - D_8017FF80 = (u16)D_8017FF80 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF84); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FF84; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF84); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_000/ov_SC01_000_jr_801380E0.c b/src/ov_SC01_000/ov_SC01_000_jr_801380E0.c new file mode 100644 index 000000000..75e08fecd --- /dev/null +++ b/src/ov_SC01_000/ov_SC01_000_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A3234; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017EEA0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A43DC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A5878; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A3234; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EBDC)(); +extern s16 (*D_8017EBE0)(); +extern M2C_UNK (*D_8017EBE8)(); +extern s32 (*D_8017EBEC)(); +extern s32 D_801A43D8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A3238; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017EF34; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(void *arg0, s32 arg1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(void *arg0, s32 arg1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182418; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017EF4C; +extern M2C_UNK D_8017EF54; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017EF5C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EF78[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EF84[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EF98[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EFE8[]; +extern s16 D_8017F018[]; +extern s16 D_8017F078[]; +extern s16 D_8017F080[]; +extern s16 D_8017F0A0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F0D8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F130[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F178[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F180[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F188[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F190[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F138; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F158; +extern void func_801321B0(int param_1); +extern int D_8017F168; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A4448; +extern s32 D_801A444C[]; +extern int D_801A4450; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F19C; +extern u8 D_8017F198; +extern s16 *D_8017F1A0; +extern u8 D_8017F1A4; +extern int D_801A4448; +extern u16 D_801A4458; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F1A0; /* holds a pointer value (*(u16**)&D_8017F1A0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F1B4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F208; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F20C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F20C[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F250; +extern u8 D_8017F294; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F250; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F294 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F2D8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F314[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F314; + if (((s16)a1) < 0xC00) { + tbl = D_8017F2D8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F350, D_8017F352, D_8017F354, D_8017F356, D_8017F358, D_8017F35A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F352 < ang)) goto outer_else; + if (!(ang < D_8017F358)) goto inner_else; + if (ang < D_8017F354) { *(s16 *)L = D_8017F354; goto done; } + if (D_8017F356 < ang) { *(s16 *)L = D_8017F356; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F350) { *(s16 *)L = D_8017F350; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F35A < ang) { *(s16 *)L = D_8017F35A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A44C0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A44C0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A44C0; +extern s8 D_801A44C4; +extern s8 D_801A44C5; + +void func_8013C9C4(void * arg0) +{ + D_801A44C0 = arg0; + D_801A44C4 = 0; + D_801A44C5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A44C0; +extern s8 D_801A44C4; +extern s8 D_801A44C5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A44C0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A44C5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A44C4)) * 2) + D_801A44C0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A44C5 = (unsigned char) p[1]; + D_801A44C4 = D_801A44C4 + 1; + if (D_801A44C5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A44C4 = 0; + *base = 0; + } + } + else + { + D_801A44C5 = c - 1; + } + } + return; +} + + + +extern s32 D_801A44E4; +extern s32 D_801A44D8; +extern s32 D_801A44DC; +extern s32 D_801A44E8; + +void func_8013CABC(void) { + D_801A44E4 = 1; + D_801A44D8 = 1; + D_801A44DC = 0; + D_801A44E8 = 1; +} + + + +extern s32 D_801A44D8; +extern s32 D_801A44DC; +extern s32 D_801A44E0; +extern s32 D_801A44E4; +extern s32 D_801A44E8; + +void func_8013CAE8(void) { + D_801A44D8 = 1; + D_801A44E4 = 0; + D_801A44DC = 0; + D_801A44E0 = -1; + D_801A44E8 = 0; +} + + + +extern s32 D_801A44E4; +extern s32 D_801A44E8; +extern s32 D_801A4510; +extern s32 D_801A4514; + +void func_8013CB20(void) +{ + D_801A4510 = D_801A44E8; + D_801A4514 = D_801A44E4; + D_801A44E8 = 1; + D_801A44E4 = 0; +} + + + +extern s32 D_801A4510; +extern s32 D_801A4514; +extern s32 D_801A44E8; +extern s32 D_801A44E4; + +void func_8013CB5C(void) { + D_801A44E8 = D_801A4510; + D_801A44E4 = D_801A4514; +} + + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A5790; + extern u8 D_801A5791; + extern u8 D_801A5792; + extern u8 D_801A5793; + extern u8 D_801A5794; + extern u8 D_801A5795; + extern u8 D_801A5796; + extern u8 D_801A5797; + extern u8 D_801A5798; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A5790; t1 = D_801A5791; t2 = D_801A5792; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A5793; t1 = D_801A5794; t2 = D_801A5795; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A5796; t1 = D_801A5797; t2 = D_801A5798; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A44F0; +extern s32 D_801A44D8; +extern s32 D_801A44F4; +extern s32 D_801A44E4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A44F0 != 0) { + if (D_801A44F0 != 2) { + if (((D_801A44F0 < 3) && (D_801A44F0 == 1)) && + (D_801A44F4 = D_801A44F4 + 1, 0x23a < D_801A44F4)) { + D_801A44D8 = D_801A44F0; + D_801A44F0 = 2; + } + } else { + D_801A44D8 = D_801A44D8 + -1; + if (D_801A44D8 == 0) { + D_801A44D8 = D_801A44F0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A44E4 == 0) { + D_801A44F0 = D_801A44F0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A44E4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A44E4; +} + + +extern s32 D_801A44F0; + +void func_8013D164(void) { + D_801A44F0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A5872; +extern u8 D_801A58E6; +extern u8 D_801A579A; +extern u8 D_801A5854; +extern u8 D_801A5778; +extern u8 D_801A5799; +extern s32 D_801A5858; + +void func_8013D330(void) { + if ((D_801A5872 & 0xff) != D_801A58E6) { + D_801A5872 = ((D_801A5872 & 0xff) < D_801A58E6) ? (D_801A5872 + 1) : (D_801A5872 - 1); + } + if ((D_801A579A & 0xff) != D_801A5854) { + D_801A579A = ((D_801A579A & 0xff) < D_801A5854) ? (D_801A579A + 1) : (D_801A579A - 1); + } + if ((D_801A5778 & 0xff) != D_801A5799) { + D_801A5778 = ((D_801A5778 & 0xff) < D_801A5799) ? (D_801A5778 + 1) : (D_801A5778 - 1); + } + D_801A5858 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A44C8; +extern void *D_801A44CC; +extern void *D_801A44D0; +extern s32 D_801A44F8; +extern s32 D_801A44FC; +extern s32 D_801A4500; +extern s32 D_801A57CC[]; + +extern u8 D_8017F448[]; +extern u8 D_8017F4F0[]; +extern u8 D_8017F3A0[]; +extern u8 D_8017F49C[]; +extern u8 D_8017F51C[]; +extern u8 D_8017F3F4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A44F8 = param_2; + D_801A44FC = (param_2 >> 2) & 3; + D_801A4500 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A44C8 = D_8017F448; + D_801A44CC = D_8017F4F0; + D_801A44D0 = D_8017F3A0; + } else { + D_801A44C8 = D_8017F49C; + D_801A44CC = D_8017F51C; + D_801A44D0 = D_8017F3F4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A4500 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A44F8 & 2) != 0) { + D_801A57CC[0] = 0x140; + D_801A57CC[3] = 0x80; + if (p[0x37] == 4) { + D_801A57CC[0] = 0x140; + D_801A57CC[3] = 0; + } + if (p[0x37] == 0) { + D_801A57CC[0] = 0x140; + D_801A57CC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A44D0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A44D0; +extern s16 *D_801A44D4; +extern s32 D_801A44E4; +extern s32 D_801A4504; +extern s32 D_801A4508; +extern s32 D_801A450C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A44D4 != 0) { + D_801A44E4 = 0; + p = (int *)(param_1 * 12 + (int)D_801A44D0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A4504 != x) { + flag = 1; + if (D_801A4504 < x) { + if (x - D_801A4504 < 5) { + D_801A4504 = x; + } else { + D_801A4504 = D_801A4504 + 4; + } + } else { + if (D_801A4504 - x < 5) { + D_801A4504 = x; + } else { + D_801A4504 = D_801A4504 - 4; + } + } + } + if (D_801A4508 != y) { + flag = 1; + if (D_801A4508 < y) { + if (y - D_801A4508 < 5) { + D_801A4508 = y; + } else { + D_801A4508 = D_801A4508 + 4; + } + } else { + if (D_801A4508 - y < 5) { + D_801A4508 = y; + } else { + D_801A4508 = D_801A4508 - 4; + } + } + } + if (D_801A450C != z) { + flag = 1; + if (D_801A450C < z) { + if (z - D_801A450C < 5) { + D_801A450C = z; + } else { + D_801A450C = D_801A450C + 4; + } + } else { + if (D_801A450C - z < 5) { + D_801A450C = z; + } else { + D_801A450C = D_801A450C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A44E4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F5AC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A44D4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A4504); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A4508); + uVar5 = (*(int*)&D_801A450C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F5AC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + +extern s32 D_801A44EC; + +s32 func_8013E054(void) { + return D_801A44EC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FFA8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FF80; +extern s16 D_8017FF82; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FFA8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FF80 = 2; + D_8017FF82 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FF82 = 0; + D_8017FF80 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A4520; + extern void * D_801A4524; + extern unsigned char D_8017FC20; + extern unsigned char D_8017FC38; + extern unsigned char D_8017FCAC; + extern unsigned char D_8017FCB4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A4520 = &D_8017FC20; + D_801A4524 = &D_8017FCAC; + } else { + D_801A4520 = &D_8017FC38; + D_801A4524 = &D_8017FCB4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FFA8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FFA8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FFA8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FF84; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FF84)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FF84)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FF80; +extern s16 D_8017FF82; +extern unsigned char D_8017FF84; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FF82` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FF80` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FF82; + if (*r < 3) { + *r = *r + 1; + } + D_8017FF80 = (u16)D_8017FF80 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF84); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FF84; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF84); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_001/ov_SC01_001_jr_8012ACE0.c b/src/ov_SC01_001/ov_SC01_001_jr_8012ACE0.c index 0baa87df1..f532e9e94 100644 --- a/src/ov_SC01_001/ov_SC01_001_jr_8012ACE0.c +++ b/src/ov_SC01_001/ov_SC01_001_jr_8012ACE0.c @@ -2823,1333 +2823,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80183E5C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80183E5C[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80183EA0; -extern u8 D_80183EE4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80183EA0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183EE4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183F28[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183F64[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183F64; - if (((s16)a1) < 0xC00) { - tbl = D_80183F28; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80183FA0, D_80183FA2, D_80183FA4, D_80183FA6, D_80183FA8, D_80183FAA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80183FA2 < ang)) goto outer_else; - if (!(ang < D_80183FA8)) goto inner_else; - if (ang < D_80183FA4) { *(s16 *)L = D_80183FA4; goto done; } - if (D_80183FA6 < ang) { *(s16 *)L = D_80183FA6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80183FA0) { *(s16 *)L = D_80183FA0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80183FAA < ang) { *(s16 *)L = D_80183FAA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801EC750; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801EC750, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801EC750; -extern s8 D_801EC754; -extern s8 D_801EC755; - -void func_8013C9C4(void * arg0) -{ - D_801EC750 = arg0; - D_801EC754 = 0; - D_801EC755 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801EC750; -extern s8 D_801EC754; -extern s8 D_801EC755; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801EC750; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801EC755; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801EC754)) * 2) + D_801EC750); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801EC755 = (unsigned char) p[1]; - D_801EC754 = D_801EC754 + 1; - if (D_801EC755 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801EC754 = 0; - *base = 0; - } - } - else - { - D_801EC755 = c - 1; - } - } - return; -} - - - -extern s32 D_801EC774; -extern s32 D_801EC768; -extern s32 D_801EC76C; -extern s32 D_801EC778; - -void func_8013CABC(void) { - D_801EC774 = 1; - D_801EC768 = 1; - D_801EC76C = 0; - D_801EC778 = 1; -} - - - -extern s32 D_801EC768; -extern s32 D_801EC76C; -extern s32 D_801EC770; -extern s32 D_801EC774; -extern s32 D_801EC778; - -void func_8013CAE8(void) { - D_801EC768 = 1; - D_801EC774 = 0; - D_801EC76C = 0; - D_801EC770 = -1; - D_801EC778 = 0; -} - - - -extern s32 D_801EC774; -extern s32 D_801EC778; -extern s32 D_801EC7A0; -extern s32 D_801EC7A4; - -void func_8013CB20(void) -{ - D_801EC7A0 = D_801EC778; - D_801EC7A4 = D_801EC774; - D_801EC778 = 1; - D_801EC774 = 0; -} - - - -extern s32 D_801EC7A0; -extern s32 D_801EC7A4; -extern s32 D_801EC778; -extern s32 D_801EC774; - -void func_8013CB5C(void) { - D_801EC778 = D_801EC7A0; - D_801EC774 = D_801EC7A4; -} - - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801F3070; - extern u8 D_801F3071; - extern u8 D_801F3072; - extern u8 D_801F3073; - extern u8 D_801F3074; - extern u8 D_801F3075; - extern u8 D_801F3076; - extern u8 D_801F3077; - extern u8 D_801F3078; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801F3070; t1 = D_801F3071; t2 = D_801F3072; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801F3073; t1 = D_801F3074; t2 = D_801F3075; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801F3076; t1 = D_801F3077; t2 = D_801F3078; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801EC780; -extern s32 D_801EC768; -extern s32 D_801EC784; -extern s32 D_801EC774; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801EC780 != 0) { - if (D_801EC780 != 2) { - if (((D_801EC780 < 3) && (D_801EC780 == 1)) && - (D_801EC784 = D_801EC784 + 1, 0x23a < D_801EC784)) { - D_801EC768 = D_801EC780; - D_801EC780 = 2; - } - } else { - D_801EC768 = D_801EC768 + -1; - if (D_801EC768 == 0) { - D_801EC768 = D_801EC780; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801EC774 == 0) { - D_801EC780 = D_801EC780 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801EC774; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801EC774; -} - - -extern s32 D_801EC780; - -void func_8013D164(void) { - D_801EC780 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801F3152; -extern u8 D_801F31C6; -extern u8 D_801F307A; -extern u8 D_801F3134; -extern u8 D_801F3058; -extern u8 D_801F3079; -extern s32 D_801F3138; - -void func_8013D330(void) { - if ((D_801F3152 & 0xff) != D_801F31C6) { - D_801F3152 = ((D_801F3152 & 0xff) < D_801F31C6) ? (D_801F3152 + 1) : (D_801F3152 - 1); - } - if ((D_801F307A & 0xff) != D_801F3134) { - D_801F307A = ((D_801F307A & 0xff) < D_801F3134) ? (D_801F307A + 1) : (D_801F307A - 1); - } - if ((D_801F3058 & 0xff) != D_801F3079) { - D_801F3058 = ((D_801F3058 & 0xff) < D_801F3079) ? (D_801F3058 + 1) : (D_801F3058 - 1); - } - D_801F3138 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801EC758; -extern void *D_801EC75C; -extern void *D_801EC760; -extern s32 D_801EC788; -extern s32 D_801EC78C; -extern s32 D_801EC790; -extern s32 D_801F30AC[]; - -extern u8 D_80184098[]; -extern u8 D_80184140[]; -extern u8 D_80183FF0[]; -extern u8 D_801840EC[]; -extern u8 D_8018416C[]; -extern u8 D_80184044[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801EC788 = param_2; - D_801EC78C = (param_2 >> 2) & 3; - D_801EC790 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801EC758 = D_80184098; - D_801EC75C = D_80184140; - D_801EC760 = D_80183FF0; - } else { - D_801EC758 = D_801840EC; - D_801EC75C = D_8018416C; - D_801EC760 = D_80184044; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801EC790 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801EC788 & 2) != 0) { - D_801F30AC[0] = 0x140; - D_801F30AC[3] = 0x80; - if (p[0x37] == 4) { - D_801F30AC[0] = 0x140; - D_801F30AC[3] = 0; - } - if (p[0x37] == 0) { - D_801F30AC[0] = 0x140; - D_801F30AC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801EC760)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801EC760; -extern s16 *D_801EC764; -extern s32 D_801EC774; -extern s32 D_801EC794; -extern s32 D_801EC798; -extern s32 D_801EC79C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801EC764 != 0) { - D_801EC774 = 0; - p = (int *)(param_1 * 12 + (int)D_801EC760); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801EC794 != x) { - flag = 1; - if (D_801EC794 < x) { - if (x - D_801EC794 < 5) { - D_801EC794 = x; - } else { - D_801EC794 = D_801EC794 + 4; - } - } else { - if (D_801EC794 - x < 5) { - D_801EC794 = x; - } else { - D_801EC794 = D_801EC794 - 4; - } - } - } - if (D_801EC798 != y) { - flag = 1; - if (D_801EC798 < y) { - if (y - D_801EC798 < 5) { - D_801EC798 = y; - } else { - D_801EC798 = D_801EC798 + 4; - } - } else { - if (D_801EC798 - y < 5) { - D_801EC798 = y; - } else { - D_801EC798 = D_801EC798 - 4; - } - } - } - if (D_801EC79C != z) { - flag = 1; - if (D_801EC79C < z) { - if (z - D_801EC79C < 5) { - D_801EC79C = z; - } else { - D_801EC79C = D_801EC79C + 4; - } - } else { - if (D_801EC79C - z < 5) { - D_801EC79C = z; - } else { - D_801EC79C = D_801EC79C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801EC774 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801841FC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801EC764); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EC794); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EC798); - uVar5 = (*(int*)&D_801EC79C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801841FC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801EC77C; - -s32 func_8013E054(void) { - return D_801EC77C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80184BF8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80184BD0; -extern s16 D_80184BD2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80184BF8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80184BD0 = 2; - D_80184BD2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80184BD2 = 0; - D_80184BD0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801EC7B0; - extern void * D_801EC7B4; - extern unsigned char D_80184870; - extern unsigned char D_80184888; - extern unsigned char D_801848FC; - extern unsigned char D_80184904; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801EC7B0 = &D_80184870; - D_801EC7B4 = &D_801848FC; - } else { - D_801EC7B0 = &D_80184888; - D_801EC7B4 = &D_80184904; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80184BF8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184BF8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80184BF8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80184BD4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184BD4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184BD4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80184BD0; -extern s16 D_80184BD2; -extern unsigned char D_80184BD4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80184BD2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80184BD0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80184BD2; - if (*r < 3) { - *r = *r + 1; - } - D_80184BD0 = (u16)D_80184BD0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184BD4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80184BD4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184BD4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_001/ov_SC01_001_jr_801380E0.c b/src/ov_SC01_001/ov_SC01_001_jr_801380E0.c new file mode 100644 index 000000000..d8fe77533 --- /dev/null +++ b/src/ov_SC01_001/ov_SC01_001_jr_801380E0.c @@ -0,0 +1,2386 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801EB30C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80183AF0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801EC66C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801F3158; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801EB30C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018382C)(); +extern s16 (*D_80183830)(); +extern M2C_UNK (*D_80183838)(); +extern s32 (*D_8018383C)(); +extern s32 D_801EC668; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801EB310; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80183B84; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187068; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80183B9C; +extern M2C_UNK D_80183BA4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80183BAC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80183BC8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80183BD4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80183BE8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183C38[]; +extern s16 D_80183C68[]; +extern s16 D_80183CC8[]; +extern s16 D_80183CD0[]; +extern s16 D_80183CF0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80183D28[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80183D80[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80183DC8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80183DD0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80183DD8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80183DE0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80183D88; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80183DA8; +extern void func_801321B0(int param_1); +extern int D_80183DB8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801EC6D8; +extern s32 D_801EC6DC[]; +extern int D_801EC6E0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80183DEC; +extern u8 D_80183DE8; +extern s16 *D_80183DF0; +extern u8 D_80183DF4; +extern int D_801EC6D8; +extern u16 D_801EC6E8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80183DF0; /* holds a pointer value (*(u16**)&D_80183DF0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80183E04[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80183E58; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80183E5C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80183E5C[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80183EA0; +extern u8 D_80183EE4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80183EA0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183EE4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183F28[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183F64[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183F64; + if (((s16)a1) < 0xC00) { + tbl = D_80183F28; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80183FA0, D_80183FA2, D_80183FA4, D_80183FA6, D_80183FA8, D_80183FAA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183FA2 < ang)) goto outer_else; + if (!(ang < D_80183FA8)) goto inner_else; + if (ang < D_80183FA4) { *(s16 *)L = D_80183FA4; goto done; } + if (D_80183FA6 < ang) { *(s16 *)L = D_80183FA6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183FA0) { *(s16 *)L = D_80183FA0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183FAA < ang) { *(s16 *)L = D_80183FAA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801EC750; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801EC750, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801EC750; +extern s8 D_801EC754; +extern s8 D_801EC755; + +void func_8013C9C4(void * arg0) +{ + D_801EC750 = arg0; + D_801EC754 = 0; + D_801EC755 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801EC750; +extern s8 D_801EC754; +extern s8 D_801EC755; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801EC750; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801EC755; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801EC754)) * 2) + D_801EC750); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801EC755 = (unsigned char) p[1]; + D_801EC754 = D_801EC754 + 1; + if (D_801EC755 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801EC754 = 0; + *base = 0; + } + } + else + { + D_801EC755 = c - 1; + } + } + return; +} + + + +extern s32 D_801EC774; +extern s32 D_801EC768; +extern s32 D_801EC76C; +extern s32 D_801EC778; + +void func_8013CABC(void) { + D_801EC774 = 1; + D_801EC768 = 1; + D_801EC76C = 0; + D_801EC778 = 1; +} + + + +extern s32 D_801EC768; +extern s32 D_801EC76C; +extern s32 D_801EC770; +extern s32 D_801EC774; +extern s32 D_801EC778; + +void func_8013CAE8(void) { + D_801EC768 = 1; + D_801EC774 = 0; + D_801EC76C = 0; + D_801EC770 = -1; + D_801EC778 = 0; +} + + + +extern s32 D_801EC774; +extern s32 D_801EC778; +extern s32 D_801EC7A0; +extern s32 D_801EC7A4; + +void func_8013CB20(void) +{ + D_801EC7A0 = D_801EC778; + D_801EC7A4 = D_801EC774; + D_801EC778 = 1; + D_801EC774 = 0; +} + + + +extern s32 D_801EC7A0; +extern s32 D_801EC7A4; +extern s32 D_801EC778; +extern s32 D_801EC774; + +void func_8013CB5C(void) { + D_801EC778 = D_801EC7A0; + D_801EC774 = D_801EC7A4; +} + + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801F3070; + extern u8 D_801F3071; + extern u8 D_801F3072; + extern u8 D_801F3073; + extern u8 D_801F3074; + extern u8 D_801F3075; + extern u8 D_801F3076; + extern u8 D_801F3077; + extern u8 D_801F3078; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801F3070; t1 = D_801F3071; t2 = D_801F3072; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801F3073; t1 = D_801F3074; t2 = D_801F3075; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801F3076; t1 = D_801F3077; t2 = D_801F3078; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801EC780; +extern s32 D_801EC768; +extern s32 D_801EC784; +extern s32 D_801EC774; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801EC780 != 0) { + if (D_801EC780 != 2) { + if (((D_801EC780 < 3) && (D_801EC780 == 1)) && + (D_801EC784 = D_801EC784 + 1, 0x23a < D_801EC784)) { + D_801EC768 = D_801EC780; + D_801EC780 = 2; + } + } else { + D_801EC768 = D_801EC768 + -1; + if (D_801EC768 == 0) { + D_801EC768 = D_801EC780; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801EC774 == 0) { + D_801EC780 = D_801EC780 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801EC774; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801EC774; +} + + +extern s32 D_801EC780; + +void func_8013D164(void) { + D_801EC780 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801F3152; +extern u8 D_801F31C6; +extern u8 D_801F307A; +extern u8 D_801F3134; +extern u8 D_801F3058; +extern u8 D_801F3079; +extern s32 D_801F3138; + +void func_8013D330(void) { + if ((D_801F3152 & 0xff) != D_801F31C6) { + D_801F3152 = ((D_801F3152 & 0xff) < D_801F31C6) ? (D_801F3152 + 1) : (D_801F3152 - 1); + } + if ((D_801F307A & 0xff) != D_801F3134) { + D_801F307A = ((D_801F307A & 0xff) < D_801F3134) ? (D_801F307A + 1) : (D_801F307A - 1); + } + if ((D_801F3058 & 0xff) != D_801F3079) { + D_801F3058 = ((D_801F3058 & 0xff) < D_801F3079) ? (D_801F3058 + 1) : (D_801F3058 - 1); + } + D_801F3138 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801EC758; +extern void *D_801EC75C; +extern void *D_801EC760; +extern s32 D_801EC788; +extern s32 D_801EC78C; +extern s32 D_801EC790; +extern s32 D_801F30AC[]; + +extern u8 D_80184098[]; +extern u8 D_80184140[]; +extern u8 D_80183FF0[]; +extern u8 D_801840EC[]; +extern u8 D_8018416C[]; +extern u8 D_80184044[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801EC788 = param_2; + D_801EC78C = (param_2 >> 2) & 3; + D_801EC790 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801EC758 = D_80184098; + D_801EC75C = D_80184140; + D_801EC760 = D_80183FF0; + } else { + D_801EC758 = D_801840EC; + D_801EC75C = D_8018416C; + D_801EC760 = D_80184044; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801EC790 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801EC788 & 2) != 0) { + D_801F30AC[0] = 0x140; + D_801F30AC[3] = 0x80; + if (p[0x37] == 4) { + D_801F30AC[0] = 0x140; + D_801F30AC[3] = 0; + } + if (p[0x37] == 0) { + D_801F30AC[0] = 0x140; + D_801F30AC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801EC760)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801EC760; +extern s16 *D_801EC764; +extern s32 D_801EC774; +extern s32 D_801EC794; +extern s32 D_801EC798; +extern s32 D_801EC79C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801EC764 != 0) { + D_801EC774 = 0; + p = (int *)(param_1 * 12 + (int)D_801EC760); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801EC794 != x) { + flag = 1; + if (D_801EC794 < x) { + if (x - D_801EC794 < 5) { + D_801EC794 = x; + } else { + D_801EC794 = D_801EC794 + 4; + } + } else { + if (D_801EC794 - x < 5) { + D_801EC794 = x; + } else { + D_801EC794 = D_801EC794 - 4; + } + } + } + if (D_801EC798 != y) { + flag = 1; + if (D_801EC798 < y) { + if (y - D_801EC798 < 5) { + D_801EC798 = y; + } else { + D_801EC798 = D_801EC798 + 4; + } + } else { + if (D_801EC798 - y < 5) { + D_801EC798 = y; + } else { + D_801EC798 = D_801EC798 - 4; + } + } + } + if (D_801EC79C != z) { + flag = 1; + if (D_801EC79C < z) { + if (z - D_801EC79C < 5) { + D_801EC79C = z; + } else { + D_801EC79C = D_801EC79C + 4; + } + } else { + if (D_801EC79C - z < 5) { + D_801EC79C = z; + } else { + D_801EC79C = D_801EC79C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801EC774 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801841FC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801EC764); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EC794); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EC798); + uVar5 = (*(int*)&D_801EC79C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801841FC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801EC77C; + +s32 func_8013E054(void) { + return D_801EC77C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80184BF8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80184BD0; +extern s16 D_80184BD2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80184BF8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80184BD0 = 2; + D_80184BD2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80184BD2 = 0; + D_80184BD0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801EC7B0; + extern void * D_801EC7B4; + extern unsigned char D_80184870; + extern unsigned char D_80184888; + extern unsigned char D_801848FC; + extern unsigned char D_80184904; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801EC7B0 = &D_80184870; + D_801EC7B4 = &D_801848FC; + } else { + D_801EC7B0 = &D_80184888; + D_801EC7B4 = &D_80184904; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80184BF8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184BF8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80184BF8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80184BD4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184BD4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184BD4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80184BD0; +extern s16 D_80184BD2; +extern unsigned char D_80184BD4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80184BD2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80184BD0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80184BD2; + if (*r < 3) { + *r = *r + 1; + } + D_80184BD0 = (u16)D_80184BD0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184BD4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80184BD4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184BD4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_001/nonmatchings/ov_SC01_001_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_004/ov_SC01_004_jr_8012ACE0.c b/src/ov_SC01_004/ov_SC01_004_jr_8012ACE0.c index a10136452..22c5dfe41 100644 --- a/src/ov_SC01_004/ov_SC01_004_jr_8012ACE0.c +++ b/src/ov_SC01_004/ov_SC01_004_jr_8012ACE0.c @@ -2824,1342 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F820[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F820[*(short *)(p + 4)](); -} - - -void func_80138C30(void *a0) { - s16 v1 = *(s16 *)((u8 *)a0 + 4); - if (v1 == 4) { - *(s16 *)((u8 *)a0 + 4) = 2; - } else { - *(s32 *)((u8 *)a0 + 8) |= 0x800; - } -} - - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F864; -extern u8 D_8017F8A8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F864; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F8A8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F8EC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F928[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F928; - if (((s16)a1) < 0xC00) { - tbl = D_8017F8EC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F964, D_8017F966, D_8017F968, D_8017F96A, D_8017F96C, D_8017F96E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F966 < ang)) goto outer_else; - if (!(ang < D_8017F96C)) goto inner_else; - if (ang < D_8017F968) { *(s16 *)L = D_8017F968; goto done; } - if (D_8017F96A < ang) { *(s16 *)L = D_8017F96A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F964) { *(s16 *)L = D_8017F964; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F96E < ang) { *(s16 *)L = D_8017F96E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018EEB8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018EEB8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018EEB8; -extern s8 D_8018EEBC; -extern s8 D_8018EEBD; - -void func_8013C9C4(void * arg0) -{ - D_8018EEB8 = arg0; - D_8018EEBC = 0; - D_8018EEBD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018EEB8; -extern s8 D_8018EEBC; -extern s8 D_8018EEBD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018EEB8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018EEBD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018EEBC)) * 2) + D_8018EEB8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018EEBD = (unsigned char) p[1]; - D_8018EEBC = D_8018EEBC + 1; - if (D_8018EEBD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018EEBC = 0; - *base = 0; - } - } - else - { - D_8018EEBD = c - 1; - } - } - return; -} - - - -extern s32 D_8018EEDC; -extern s32 D_8018EED0; -extern s32 D_8018EED4; -extern s32 D_8018EEE0; - -void func_8013CABC(void) { - D_8018EEDC = 1; - D_8018EED0 = 1; - D_8018EED4 = 0; - D_8018EEE0 = 1; -} - - - -extern s32 D_8018EED0; -extern s32 D_8018EED4; -extern s32 D_8018EED8; -extern s32 D_8018EEDC; -extern s32 D_8018EEE0; - -void func_8013CAE8(void) { - D_8018EED0 = 1; - D_8018EEDC = 0; - D_8018EED4 = 0; - D_8018EED8 = -1; - D_8018EEE0 = 0; -} - - - -extern s32 D_8018EEDC; -extern s32 D_8018EEE0; -extern s32 D_8018EF08; -extern s32 D_8018EF0C; - -void func_8013CB20(void) -{ - D_8018EF08 = D_8018EEE0; - D_8018EF0C = D_8018EEDC; - D_8018EEE0 = 1; - D_8018EEDC = 0; -} - - - -extern s32 D_8018EF08; -extern s32 D_8018EF0C; -extern s32 D_8018EEE0; -extern s32 D_8018EEDC; - -void func_8013CB5C(void) { - D_8018EEE0 = D_8018EF08; - D_8018EEDC = D_8018EF0C; -} - - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80190278; - extern u8 D_80190279; - extern u8 D_8019027A; - extern u8 D_8019027B; - extern u8 D_8019027C; - extern u8 D_8019027D; - extern u8 D_8019027E; - extern u8 D_8019027F; - extern u8 D_80190280; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80190278; t1 = D_80190279; t2 = D_8019027A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019027B; t1 = D_8019027C; t2 = D_8019027D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019027E; t1 = D_8019027F; t2 = D_80190280; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018EEE8; -extern s32 D_8018EED0; -extern s32 D_8018EEEC; -extern s32 D_8018EEDC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018EEE8 != 0) { - if (D_8018EEE8 != 2) { - if (((D_8018EEE8 < 3) && (D_8018EEE8 == 1)) && - (D_8018EEEC = D_8018EEEC + 1, 0x23a < D_8018EEEC)) { - D_8018EED0 = D_8018EEE8; - D_8018EEE8 = 2; - } - } else { - D_8018EED0 = D_8018EED0 + -1; - if (D_8018EED0 == 0) { - D_8018EED0 = D_8018EEE8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018EEDC == 0) { - D_8018EEE8 = D_8018EEE8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018EEDC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018EEDC; -} - - - -extern s32 D_8018EEE8; - -void func_8013D164(void) { - D_8018EEE8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019035A; -extern u8 D_801903CE; -extern u8 D_80190282; -extern u8 D_8019033C; -extern u8 D_80190260; -extern u8 D_80190281; -extern s32 D_80190340; - -void func_8013D330(void) { - if ((D_8019035A & 0xff) != D_801903CE) { - D_8019035A = ((D_8019035A & 0xff) < D_801903CE) ? (D_8019035A + 1) : (D_8019035A - 1); - } - if ((D_80190282 & 0xff) != D_8019033C) { - D_80190282 = ((D_80190282 & 0xff) < D_8019033C) ? (D_80190282 + 1) : (D_80190282 - 1); - } - if ((D_80190260 & 0xff) != D_80190281) { - D_80190260 = ((D_80190260 & 0xff) < D_80190281) ? (D_80190260 + 1) : (D_80190260 - 1); - } - D_80190340 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018EEC0; -extern void *D_8018EEC4; -extern void *D_8018EEC8; -extern s32 D_8018EEF0; -extern s32 D_8018EEF4; -extern s32 D_8018EEF8; -extern s32 D_801902B4[]; - -extern u8 D_8017FA5C[]; -extern u8 D_8017FB04[]; -extern u8 D_8017F9B4[]; -extern u8 D_8017FAB0[]; -extern u8 D_8017FB30[]; -extern u8 D_8017FA08[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018EEF0 = param_2; - D_8018EEF4 = (param_2 >> 2) & 3; - D_8018EEF8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018EEC0 = D_8017FA5C; - D_8018EEC4 = D_8017FB04; - D_8018EEC8 = D_8017F9B4; - } else { - D_8018EEC0 = D_8017FAB0; - D_8018EEC4 = D_8017FB30; - D_8018EEC8 = D_8017FA08; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018EEF8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018EEF0 & 2) != 0) { - D_801902B4[0] = 0x140; - D_801902B4[3] = 0x80; - if (p[0x37] == 4) { - D_801902B4[0] = 0x140; - D_801902B4[3] = 0; - } - if (p[0x37] == 0) { - D_801902B4[0] = 0x140; - D_801902B4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018EEC8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018EEC8; -extern s16 *D_8018EECC; -extern s32 D_8018EEDC; -extern s32 D_8018EEFC; -extern s32 D_8018EF00; -extern s32 D_8018EF04; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018EECC != 0) { - D_8018EEDC = 0; - p = (int *)(param_1 * 12 + (int)D_8018EEC8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018EEFC != x) { - flag = 1; - if (D_8018EEFC < x) { - if (x - D_8018EEFC < 5) { - D_8018EEFC = x; - } else { - D_8018EEFC = D_8018EEFC + 4; - } - } else { - if (D_8018EEFC - x < 5) { - D_8018EEFC = x; - } else { - D_8018EEFC = D_8018EEFC - 4; - } - } - } - if (D_8018EF00 != y) { - flag = 1; - if (D_8018EF00 < y) { - if (y - D_8018EF00 < 5) { - D_8018EF00 = y; - } else { - D_8018EF00 = D_8018EF00 + 4; - } - } else { - if (D_8018EF00 - y < 5) { - D_8018EF00 = y; - } else { - D_8018EF00 = D_8018EF00 - 4; - } - } - } - if (D_8018EF04 != z) { - flag = 1; - if (D_8018EF04 < z) { - if (z - D_8018EF04 < 5) { - D_8018EF04 = z; - } else { - D_8018EF04 = D_8018EF04 + 4; - } - } else { - if (D_8018EF04 - z < 5) { - D_8018EF04 = z; - } else { - D_8018EF04 = D_8018EF04 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018EEDC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FBC0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018EECC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018EEFC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018EF00); - uVar5 = (*(int*)&D_8018EF04); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FBC0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018EEE4; - -s32 func_8013E054(void) { - return D_8018EEE4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801805BC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80180594; -extern s16 D_80180596; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801805BC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80180594 = 2; - D_80180596 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80180596 = 0; - D_80180594 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018EF18; - extern void * D_8018EF1C; - extern unsigned char D_80180234; - extern unsigned char D_8018024C; - extern unsigned char D_801802C0; - extern unsigned char D_801802C8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018EF18 = &D_80180234; - D_8018EF1C = &D_801802C0; - } else { - D_8018EF18 = &D_8018024C; - D_8018EF1C = &D_801802C8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801805BC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801805BC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801805BC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180598; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180598)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180598)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80180594; -extern s16 D_80180596; -extern unsigned char D_80180598; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180596` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80180594` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80180596; - if (*r < 3) { - *r = *r + 1; - } - D_80180594 = (u16)D_80180594 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180598); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180598; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180598); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_004/ov_SC01_004_jr_801380E0.c b/src/ov_SC01_004/ov_SC01_004_jr_801380E0.c new file mode 100644 index 000000000..d7ccc7965 --- /dev/null +++ b/src/ov_SC01_004/ov_SC01_004_jr_801380E0.c @@ -0,0 +1,2395 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D6EC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F4B4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018EDD4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80190360; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D6EC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F1F0)(); +extern s16 (*D_8017F1F4)(); +extern M2C_UNK (*D_8017F1FC)(); +extern s32 (*D_8017F200)(); +extern s32 D_8018EDD0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D6F0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F548; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182A2C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F560; +extern M2C_UNK D_8017F568; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F570; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F58C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F598[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F5AC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F5FC[]; +extern s16 D_8017F62C[]; +extern s16 D_8017F68C[]; +extern s16 D_8017F694[]; +extern s16 D_8017F6B4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F6EC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F744[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F78C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F794[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F79C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F7A4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F74C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F76C; +extern void func_801321B0(int param_1); +extern int D_8017F77C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018EE40; +extern s32 D_8018EE44[]; +extern int D_8018EE48; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F7B0; +extern u8 D_8017F7AC; +extern s16 *D_8017F7B4; +extern u8 D_8017F7B8; +extern int D_8018EE40; +extern u16 D_8018EE50; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F7B4; /* holds a pointer value (*(u16**)&D_8017F7B4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F7C8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F81C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F820[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F820[*(short *)(p + 4)](); +} + + +void func_80138C30(void *a0) { + s16 v1 = *(s16 *)((u8 *)a0 + 4); + if (v1 == 4) { + *(s16 *)((u8 *)a0 + 4) = 2; + } else { + *(s32 *)((u8 *)a0 + 8) |= 0x800; + } +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F864; +extern u8 D_8017F8A8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F864; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F8A8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F8EC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F928[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F928; + if (((s16)a1) < 0xC00) { + tbl = D_8017F8EC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F964, D_8017F966, D_8017F968, D_8017F96A, D_8017F96C, D_8017F96E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F966 < ang)) goto outer_else; + if (!(ang < D_8017F96C)) goto inner_else; + if (ang < D_8017F968) { *(s16 *)L = D_8017F968; goto done; } + if (D_8017F96A < ang) { *(s16 *)L = D_8017F96A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F964) { *(s16 *)L = D_8017F964; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F96E < ang) { *(s16 *)L = D_8017F96E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018EEB8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018EEB8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018EEB8; +extern s8 D_8018EEBC; +extern s8 D_8018EEBD; + +void func_8013C9C4(void * arg0) +{ + D_8018EEB8 = arg0; + D_8018EEBC = 0; + D_8018EEBD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018EEB8; +extern s8 D_8018EEBC; +extern s8 D_8018EEBD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018EEB8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018EEBD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018EEBC)) * 2) + D_8018EEB8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018EEBD = (unsigned char) p[1]; + D_8018EEBC = D_8018EEBC + 1; + if (D_8018EEBD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018EEBC = 0; + *base = 0; + } + } + else + { + D_8018EEBD = c - 1; + } + } + return; +} + + + +extern s32 D_8018EEDC; +extern s32 D_8018EED0; +extern s32 D_8018EED4; +extern s32 D_8018EEE0; + +void func_8013CABC(void) { + D_8018EEDC = 1; + D_8018EED0 = 1; + D_8018EED4 = 0; + D_8018EEE0 = 1; +} + + + +extern s32 D_8018EED0; +extern s32 D_8018EED4; +extern s32 D_8018EED8; +extern s32 D_8018EEDC; +extern s32 D_8018EEE0; + +void func_8013CAE8(void) { + D_8018EED0 = 1; + D_8018EEDC = 0; + D_8018EED4 = 0; + D_8018EED8 = -1; + D_8018EEE0 = 0; +} + + + +extern s32 D_8018EEDC; +extern s32 D_8018EEE0; +extern s32 D_8018EF08; +extern s32 D_8018EF0C; + +void func_8013CB20(void) +{ + D_8018EF08 = D_8018EEE0; + D_8018EF0C = D_8018EEDC; + D_8018EEE0 = 1; + D_8018EEDC = 0; +} + + + +extern s32 D_8018EF08; +extern s32 D_8018EF0C; +extern s32 D_8018EEE0; +extern s32 D_8018EEDC; + +void func_8013CB5C(void) { + D_8018EEE0 = D_8018EF08; + D_8018EEDC = D_8018EF0C; +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80190278; + extern u8 D_80190279; + extern u8 D_8019027A; + extern u8 D_8019027B; + extern u8 D_8019027C; + extern u8 D_8019027D; + extern u8 D_8019027E; + extern u8 D_8019027F; + extern u8 D_80190280; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80190278; t1 = D_80190279; t2 = D_8019027A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019027B; t1 = D_8019027C; t2 = D_8019027D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019027E; t1 = D_8019027F; t2 = D_80190280; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018EEE8; +extern s32 D_8018EED0; +extern s32 D_8018EEEC; +extern s32 D_8018EEDC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018EEE8 != 0) { + if (D_8018EEE8 != 2) { + if (((D_8018EEE8 < 3) && (D_8018EEE8 == 1)) && + (D_8018EEEC = D_8018EEEC + 1, 0x23a < D_8018EEEC)) { + D_8018EED0 = D_8018EEE8; + D_8018EEE8 = 2; + } + } else { + D_8018EED0 = D_8018EED0 + -1; + if (D_8018EED0 == 0) { + D_8018EED0 = D_8018EEE8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018EEDC == 0) { + D_8018EEE8 = D_8018EEE8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018EEDC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018EEDC; +} + + + +extern s32 D_8018EEE8; + +void func_8013D164(void) { + D_8018EEE8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019035A; +extern u8 D_801903CE; +extern u8 D_80190282; +extern u8 D_8019033C; +extern u8 D_80190260; +extern u8 D_80190281; +extern s32 D_80190340; + +void func_8013D330(void) { + if ((D_8019035A & 0xff) != D_801903CE) { + D_8019035A = ((D_8019035A & 0xff) < D_801903CE) ? (D_8019035A + 1) : (D_8019035A - 1); + } + if ((D_80190282 & 0xff) != D_8019033C) { + D_80190282 = ((D_80190282 & 0xff) < D_8019033C) ? (D_80190282 + 1) : (D_80190282 - 1); + } + if ((D_80190260 & 0xff) != D_80190281) { + D_80190260 = ((D_80190260 & 0xff) < D_80190281) ? (D_80190260 + 1) : (D_80190260 - 1); + } + D_80190340 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018EEC0; +extern void *D_8018EEC4; +extern void *D_8018EEC8; +extern s32 D_8018EEF0; +extern s32 D_8018EEF4; +extern s32 D_8018EEF8; +extern s32 D_801902B4[]; + +extern u8 D_8017FA5C[]; +extern u8 D_8017FB04[]; +extern u8 D_8017F9B4[]; +extern u8 D_8017FAB0[]; +extern u8 D_8017FB30[]; +extern u8 D_8017FA08[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018EEF0 = param_2; + D_8018EEF4 = (param_2 >> 2) & 3; + D_8018EEF8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018EEC0 = D_8017FA5C; + D_8018EEC4 = D_8017FB04; + D_8018EEC8 = D_8017F9B4; + } else { + D_8018EEC0 = D_8017FAB0; + D_8018EEC4 = D_8017FB30; + D_8018EEC8 = D_8017FA08; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018EEF8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018EEF0 & 2) != 0) { + D_801902B4[0] = 0x140; + D_801902B4[3] = 0x80; + if (p[0x37] == 4) { + D_801902B4[0] = 0x140; + D_801902B4[3] = 0; + } + if (p[0x37] == 0) { + D_801902B4[0] = 0x140; + D_801902B4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018EEC8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018EEC8; +extern s16 *D_8018EECC; +extern s32 D_8018EEDC; +extern s32 D_8018EEFC; +extern s32 D_8018EF00; +extern s32 D_8018EF04; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018EECC != 0) { + D_8018EEDC = 0; + p = (int *)(param_1 * 12 + (int)D_8018EEC8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018EEFC != x) { + flag = 1; + if (D_8018EEFC < x) { + if (x - D_8018EEFC < 5) { + D_8018EEFC = x; + } else { + D_8018EEFC = D_8018EEFC + 4; + } + } else { + if (D_8018EEFC - x < 5) { + D_8018EEFC = x; + } else { + D_8018EEFC = D_8018EEFC - 4; + } + } + } + if (D_8018EF00 != y) { + flag = 1; + if (D_8018EF00 < y) { + if (y - D_8018EF00 < 5) { + D_8018EF00 = y; + } else { + D_8018EF00 = D_8018EF00 + 4; + } + } else { + if (D_8018EF00 - y < 5) { + D_8018EF00 = y; + } else { + D_8018EF00 = D_8018EF00 - 4; + } + } + } + if (D_8018EF04 != z) { + flag = 1; + if (D_8018EF04 < z) { + if (z - D_8018EF04 < 5) { + D_8018EF04 = z; + } else { + D_8018EF04 = D_8018EF04 + 4; + } + } else { + if (D_8018EF04 - z < 5) { + D_8018EF04 = z; + } else { + D_8018EF04 = D_8018EF04 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018EEDC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FBC0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018EECC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018EEFC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018EF00); + uVar5 = (*(int*)&D_8018EF04); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FBC0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018EEE4; + +s32 func_8013E054(void) { + return D_8018EEE4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801805BC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80180594; +extern s16 D_80180596; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801805BC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80180594 = 2; + D_80180596 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80180596 = 0; + D_80180594 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018EF18; + extern void * D_8018EF1C; + extern unsigned char D_80180234; + extern unsigned char D_8018024C; + extern unsigned char D_801802C0; + extern unsigned char D_801802C8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018EF18 = &D_80180234; + D_8018EF1C = &D_801802C0; + } else { + D_8018EF18 = &D_8018024C; + D_8018EF1C = &D_801802C8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801805BC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801805BC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801805BC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180598; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180598)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180598)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80180594; +extern s16 D_80180596; +extern unsigned char D_80180598; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180596` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80180594` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80180596; + if (*r < 3) { + *r = *r + 1; + } + D_80180594 = (u16)D_80180594 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180598); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180598; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180598); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_004/nonmatchings/ov_SC01_004_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_005/ov_SC01_005_jr_8012ACE0.c b/src/ov_SC01_005/ov_SC01_005_jr_8012ACE0.c index a31590dfa..3542caac1 100644 --- a/src/ov_SC01_005/ov_SC01_005_jr_8012ACE0.c +++ b/src/ov_SC01_005/ov_SC01_005_jr_8012ACE0.c @@ -2815,1333 +2815,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801829B4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801829B4[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801829F8; -extern u8 D_80182A3C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801829F8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182A3C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182A80[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182ABC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182ABC; - if (((s16)a1) < 0xC00) { - tbl = D_80182A80; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182AF8, D_80182AFA, D_80182AFC, D_80182AFE, D_80182B00, D_80182B02; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182AFA < ang)) goto outer_else; - if (!(ang < D_80182B00)) goto inner_else; - if (ang < D_80182AFC) { *(s16 *)L = D_80182AFC; goto done; } - if (D_80182AFE < ang) { *(s16 *)L = D_80182AFE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182AF8) { *(s16 *)L = D_80182AF8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80182B02 < ang) { *(s16 *)L = D_80182B02; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CC618; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CC618, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CC618; -extern s8 D_801CC61C; -extern s8 D_801CC61D; - -void func_8013C9C4(void * arg0) -{ - D_801CC618 = arg0; - D_801CC61C = 0; - D_801CC61D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CC618; -extern s8 D_801CC61C; -extern s8 D_801CC61D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CC618; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CC61D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CC61C)) * 2) + D_801CC618); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CC61D = (unsigned char) p[1]; - D_801CC61C = D_801CC61C + 1; - if (D_801CC61D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CC61C = 0; - *base = 0; - } - } - else - { - D_801CC61D = c - 1; - } - } - return; -} - - - -extern s32 D_801CC63C; -extern s32 D_801CC630; -extern s32 D_801CC634; -extern s32 D_801CC640; - -void func_8013CABC(void) { - D_801CC63C = 1; - D_801CC630 = 1; - D_801CC634 = 0; - D_801CC640 = 1; -} - - - -extern s32 D_801CC630; -extern s32 D_801CC634; -extern s32 D_801CC638; -extern s32 D_801CC63C; -extern s32 D_801CC640; - -void func_8013CAE8(void) { - D_801CC630 = 1; - D_801CC63C = 0; - D_801CC634 = 0; - D_801CC638 = -1; - D_801CC640 = 0; -} - - -extern s32 D_801CC640; - extern s32 D_801CC63C; - extern s32 D_801CC668; - extern s32 D_801CC66C; - void func_8013CB20(void) { - s32 temp_v0 = D_801CC640; - s32 temp_a0 = D_801CC63C; - D_801CC640 = 1; - D_801CC63C = 0; - D_801CC668 = temp_v0; - D_801CC66C = temp_a0; - } - - - -extern s32 D_801CC668; -extern s32 D_801CC66C; -extern s32 D_801CC640; -extern s32 D_801CC63C; - -void func_8013CB5C(void) { - D_801CC640 = D_801CC668; - D_801CC63C = D_801CC66C; -} - - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801CDED8; - extern u8 D_801CDED9; - extern u8 D_801CDEDA; - extern u8 D_801CDEDB; - extern u8 D_801CDEDC; - extern u8 D_801CDEDD; - extern u8 D_801CDEDE; - extern u8 D_801CDEDF; - extern u8 D_801CDEE0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801CDED8; t1 = D_801CDED9; t2 = D_801CDEDA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801CDEDB; t1 = D_801CDEDC; t2 = D_801CDEDD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801CDEDE; t1 = D_801CDEDF; t2 = D_801CDEE0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CC648; -extern s32 D_801CC630; -extern s32 D_801CC64C; -extern s32 D_801CC63C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CC648 != 0) { - if (D_801CC648 != 2) { - if (((D_801CC648 < 3) && (D_801CC648 == 1)) && - (D_801CC64C = D_801CC64C + 1, 0x23a < D_801CC64C)) { - D_801CC630 = D_801CC648; - D_801CC648 = 2; - } - } else { - D_801CC630 = D_801CC630 + -1; - if (D_801CC630 == 0) { - D_801CC630 = D_801CC648; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CC63C == 0) { - D_801CC648 = D_801CC648 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CC63C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CC63C; -} - - - -extern s32 D_801CC648; - -void func_8013D164(void) { - D_801CC648 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801CDFBA; -extern u8 D_801CE060; -extern u8 D_801CDEE2; -extern u8 D_801CDF9C; -extern u8 D_801CDEC0; -extern u8 D_801CDEE1; -extern s32 D_801CDFA0; - -void func_8013D330(void) { - if ((D_801CDFBA & 0xff) != D_801CE060) { - D_801CDFBA = ((D_801CDFBA & 0xff) < D_801CE060) ? (D_801CDFBA + 1) : (D_801CDFBA - 1); - } - if ((D_801CDEE2 & 0xff) != D_801CDF9C) { - D_801CDEE2 = ((D_801CDEE2 & 0xff) < D_801CDF9C) ? (D_801CDEE2 + 1) : (D_801CDEE2 - 1); - } - if ((D_801CDEC0 & 0xff) != D_801CDEE1) { - D_801CDEC0 = ((D_801CDEC0 & 0xff) < D_801CDEE1) ? (D_801CDEC0 + 1) : (D_801CDEC0 - 1); - } - D_801CDFA0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CC620; -extern void *D_801CC624; -extern void *D_801CC628; -extern s32 D_801CC650; -extern s32 D_801CC654; -extern s32 D_801CC658; -extern s32 D_801CDF14[]; - -extern u8 D_80182BF0[]; -extern u8 D_80182C98[]; -extern u8 D_80182B48[]; -extern u8 D_80182C44[]; -extern u8 D_80182CC4[]; -extern u8 D_80182B9C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CC650 = param_2; - D_801CC654 = (param_2 >> 2) & 3; - D_801CC658 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CC620 = D_80182BF0; - D_801CC624 = D_80182C98; - D_801CC628 = D_80182B48; - } else { - D_801CC620 = D_80182C44; - D_801CC624 = D_80182CC4; - D_801CC628 = D_80182B9C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CC658 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CC650 & 2) != 0) { - D_801CDF14[0] = 0x140; - D_801CDF14[3] = 0x80; - if (p[0x37] == 4) { - D_801CDF14[0] = 0x140; - D_801CDF14[3] = 0; - } - if (p[0x37] == 0) { - D_801CDF14[0] = 0x140; - D_801CDF14[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CC628)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CC628; -extern s16 *D_801CC62C; -extern s32 D_801CC63C; -extern s32 D_801CC65C; -extern s32 D_801CC660; -extern s32 D_801CC664; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CC62C != 0) { - D_801CC63C = 0; - p = (int *)(param_1 * 12 + (int)D_801CC628); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CC65C != x) { - flag = 1; - if (D_801CC65C < x) { - if (x - D_801CC65C < 5) { - D_801CC65C = x; - } else { - D_801CC65C = D_801CC65C + 4; - } - } else { - if (D_801CC65C - x < 5) { - D_801CC65C = x; - } else { - D_801CC65C = D_801CC65C - 4; - } - } - } - if (D_801CC660 != y) { - flag = 1; - if (D_801CC660 < y) { - if (y - D_801CC660 < 5) { - D_801CC660 = y; - } else { - D_801CC660 = D_801CC660 + 4; - } - } else { - if (D_801CC660 - y < 5) { - D_801CC660 = y; - } else { - D_801CC660 = D_801CC660 - 4; - } - } - } - if (D_801CC664 != z) { - flag = 1; - if (D_801CC664 < z) { - if (z - D_801CC664 < 5) { - D_801CC664 = z; - } else { - D_801CC664 = D_801CC664 + 4; - } - } else { - if (D_801CC664 - z < 5) { - D_801CC664 = z; - } else { - D_801CC664 = D_801CC664 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CC63C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182D54[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CC62C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CC65C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CC660); - uVar5 = (*(int*)&D_801CC664); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182D54); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CC644; - -s32 func_8013E054(void) { - return D_801CC644; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183750; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183728; -extern s16 D_8018372A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183750; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183728 = 2; - D_8018372A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018372A = 0; - D_80183728 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CC678; - extern void * D_801CC67C; - extern unsigned char D_801833C8; - extern unsigned char D_801833E0; - extern unsigned char D_80183454; - extern unsigned char D_8018345C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CC678 = &D_801833C8; - D_801CC67C = &D_80183454; - } else { - D_801CC678 = &D_801833E0; - D_801CC67C = &D_8018345C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183750/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183750 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183750)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018372C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018372C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018372C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183728; -extern s16 D_8018372A; -extern unsigned char D_8018372C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018372A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183728` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018372A; - if (*r < 3) { - *r = *r + 1; - } - D_80183728 = (u16)D_80183728 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018372C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_005/ov_SC01_005_jr_801380E0.c b/src/ov_SC01_005/ov_SC01_005_jr_801380E0.c new file mode 100644 index 000000000..1b320089c --- /dev/null +++ b/src/ov_SC01_005/ov_SC01_005_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" +#include "../shared/ov_setters.h" /* dedup share across the SC01/005 ≡ 006 pair (cookbook §11) */ + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CAE4C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182648[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CC534; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801CDFC0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CAE4C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182384)(); +extern s16 (*D_80182388)(); +extern M2C_UNK (*D_80182390)(); +extern s32 (*D_80182394)(); +extern s32 D_801CC530; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CAE50; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801826DC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(void *p, s16 v); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(void *p, s32 v); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185BC0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801826F4; +extern M2C_UNK D_801826FC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182704; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80182720[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018272C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182740[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182790[]; +extern s16 D_801827C0[]; +extern s16 D_80182820[]; +extern s16 D_80182828[]; +extern s16 D_80182848[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182880[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801828D8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182920[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182928[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182930[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182938[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801828E0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182900; +extern void func_801321B0(int param_1); +extern int D_80182910; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CC5A0; +extern s32 D_801CC5A4[]; +extern int D_801CC5A8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182944; +extern u8 D_80182940; +extern s16 *D_80182948; +extern u8 D_8018294C; +extern int D_801CC5A0; +extern u16 D_801CC5B0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182948; /* holds a pointer value (*(u16**)&D_80182948) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018295C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801829B0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801829B4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801829B4[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801829F8; +extern u8 D_80182A3C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801829F8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182A3C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182A80[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182ABC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182ABC; + if (((s16)a1) < 0xC00) { + tbl = D_80182A80; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182AF8, D_80182AFA, D_80182AFC, D_80182AFE, D_80182B00, D_80182B02; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182AFA < ang)) goto outer_else; + if (!(ang < D_80182B00)) goto inner_else; + if (ang < D_80182AFC) { *(s16 *)L = D_80182AFC; goto done; } + if (D_80182AFE < ang) { *(s16 *)L = D_80182AFE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182AF8) { *(s16 *)L = D_80182AF8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182B02 < ang) { *(s16 *)L = D_80182B02; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CC618; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CC618, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CC618; +extern s8 D_801CC61C; +extern s8 D_801CC61D; + +void func_8013C9C4(void * arg0) +{ + D_801CC618 = arg0; + D_801CC61C = 0; + D_801CC61D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CC618; +extern s8 D_801CC61C; +extern s8 D_801CC61D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CC618; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CC61D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CC61C)) * 2) + D_801CC618); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CC61D = (unsigned char) p[1]; + D_801CC61C = D_801CC61C + 1; + if (D_801CC61D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CC61C = 0; + *base = 0; + } + } + else + { + D_801CC61D = c - 1; + } + } + return; +} + + + +extern s32 D_801CC63C; +extern s32 D_801CC630; +extern s32 D_801CC634; +extern s32 D_801CC640; + +void func_8013CABC(void) { + D_801CC63C = 1; + D_801CC630 = 1; + D_801CC634 = 0; + D_801CC640 = 1; +} + + + +extern s32 D_801CC630; +extern s32 D_801CC634; +extern s32 D_801CC638; +extern s32 D_801CC63C; +extern s32 D_801CC640; + +void func_8013CAE8(void) { + D_801CC630 = 1; + D_801CC63C = 0; + D_801CC634 = 0; + D_801CC638 = -1; + D_801CC640 = 0; +} + + +extern s32 D_801CC640; + extern s32 D_801CC63C; + extern s32 D_801CC668; + extern s32 D_801CC66C; + void func_8013CB20(void) { + s32 temp_v0 = D_801CC640; + s32 temp_a0 = D_801CC63C; + D_801CC640 = 1; + D_801CC63C = 0; + D_801CC668 = temp_v0; + D_801CC66C = temp_a0; + } + + + +extern s32 D_801CC668; +extern s32 D_801CC66C; +extern s32 D_801CC640; +extern s32 D_801CC63C; + +void func_8013CB5C(void) { + D_801CC640 = D_801CC668; + D_801CC63C = D_801CC66C; +} + + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801CDED8; + extern u8 D_801CDED9; + extern u8 D_801CDEDA; + extern u8 D_801CDEDB; + extern u8 D_801CDEDC; + extern u8 D_801CDEDD; + extern u8 D_801CDEDE; + extern u8 D_801CDEDF; + extern u8 D_801CDEE0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801CDED8; t1 = D_801CDED9; t2 = D_801CDEDA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801CDEDB; t1 = D_801CDEDC; t2 = D_801CDEDD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801CDEDE; t1 = D_801CDEDF; t2 = D_801CDEE0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CC648; +extern s32 D_801CC630; +extern s32 D_801CC64C; +extern s32 D_801CC63C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CC648 != 0) { + if (D_801CC648 != 2) { + if (((D_801CC648 < 3) && (D_801CC648 == 1)) && + (D_801CC64C = D_801CC64C + 1, 0x23a < D_801CC64C)) { + D_801CC630 = D_801CC648; + D_801CC648 = 2; + } + } else { + D_801CC630 = D_801CC630 + -1; + if (D_801CC630 == 0) { + D_801CC630 = D_801CC648; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CC63C == 0) { + D_801CC648 = D_801CC648 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CC63C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CC63C; +} + + + +extern s32 D_801CC648; + +void func_8013D164(void) { + D_801CC648 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801CDFBA; +extern u8 D_801CE060; +extern u8 D_801CDEE2; +extern u8 D_801CDF9C; +extern u8 D_801CDEC0; +extern u8 D_801CDEE1; +extern s32 D_801CDFA0; + +void func_8013D330(void) { + if ((D_801CDFBA & 0xff) != D_801CE060) { + D_801CDFBA = ((D_801CDFBA & 0xff) < D_801CE060) ? (D_801CDFBA + 1) : (D_801CDFBA - 1); + } + if ((D_801CDEE2 & 0xff) != D_801CDF9C) { + D_801CDEE2 = ((D_801CDEE2 & 0xff) < D_801CDF9C) ? (D_801CDEE2 + 1) : (D_801CDEE2 - 1); + } + if ((D_801CDEC0 & 0xff) != D_801CDEE1) { + D_801CDEC0 = ((D_801CDEC0 & 0xff) < D_801CDEE1) ? (D_801CDEC0 + 1) : (D_801CDEC0 - 1); + } + D_801CDFA0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CC620; +extern void *D_801CC624; +extern void *D_801CC628; +extern s32 D_801CC650; +extern s32 D_801CC654; +extern s32 D_801CC658; +extern s32 D_801CDF14[]; + +extern u8 D_80182BF0[]; +extern u8 D_80182C98[]; +extern u8 D_80182B48[]; +extern u8 D_80182C44[]; +extern u8 D_80182CC4[]; +extern u8 D_80182B9C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CC650 = param_2; + D_801CC654 = (param_2 >> 2) & 3; + D_801CC658 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CC620 = D_80182BF0; + D_801CC624 = D_80182C98; + D_801CC628 = D_80182B48; + } else { + D_801CC620 = D_80182C44; + D_801CC624 = D_80182CC4; + D_801CC628 = D_80182B9C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CC658 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CC650 & 2) != 0) { + D_801CDF14[0] = 0x140; + D_801CDF14[3] = 0x80; + if (p[0x37] == 4) { + D_801CDF14[0] = 0x140; + D_801CDF14[3] = 0; + } + if (p[0x37] == 0) { + D_801CDF14[0] = 0x140; + D_801CDF14[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CC628)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CC628; +extern s16 *D_801CC62C; +extern s32 D_801CC63C; +extern s32 D_801CC65C; +extern s32 D_801CC660; +extern s32 D_801CC664; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CC62C != 0) { + D_801CC63C = 0; + p = (int *)(param_1 * 12 + (int)D_801CC628); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CC65C != x) { + flag = 1; + if (D_801CC65C < x) { + if (x - D_801CC65C < 5) { + D_801CC65C = x; + } else { + D_801CC65C = D_801CC65C + 4; + } + } else { + if (D_801CC65C - x < 5) { + D_801CC65C = x; + } else { + D_801CC65C = D_801CC65C - 4; + } + } + } + if (D_801CC660 != y) { + flag = 1; + if (D_801CC660 < y) { + if (y - D_801CC660 < 5) { + D_801CC660 = y; + } else { + D_801CC660 = D_801CC660 + 4; + } + } else { + if (D_801CC660 - y < 5) { + D_801CC660 = y; + } else { + D_801CC660 = D_801CC660 - 4; + } + } + } + if (D_801CC664 != z) { + flag = 1; + if (D_801CC664 < z) { + if (z - D_801CC664 < 5) { + D_801CC664 = z; + } else { + D_801CC664 = D_801CC664 + 4; + } + } else { + if (D_801CC664 - z < 5) { + D_801CC664 = z; + } else { + D_801CC664 = D_801CC664 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CC63C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182D54[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CC62C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CC65C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CC660); + uVar5 = (*(int*)&D_801CC664); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182D54); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CC644; + +s32 func_8013E054(void) { + return D_801CC644; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183750; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183728; +extern s16 D_8018372A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183750; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183728 = 2; + D_8018372A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018372A = 0; + D_80183728 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CC678; + extern void * D_801CC67C; + extern unsigned char D_801833C8; + extern unsigned char D_801833E0; + extern unsigned char D_80183454; + extern unsigned char D_8018345C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CC678 = &D_801833C8; + D_801CC67C = &D_80183454; + } else { + D_801CC678 = &D_801833E0; + D_801CC67C = &D_8018345C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183750/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183750 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183750)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018372C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018372C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018372C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183728; +extern s16 D_8018372A; +extern unsigned char D_8018372C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018372A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183728` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018372A; + if (*r < 3) { + *r = *r + 1; + } + D_80183728 = (u16)D_80183728 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018372C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_006/ov_SC01_006_jr_8012ACE0.c b/src/ov_SC01_006/ov_SC01_006_jr_8012ACE0.c index a205ac83d..516c29daf 100644 --- a/src/ov_SC01_006/ov_SC01_006_jr_8012ACE0.c +++ b/src/ov_SC01_006/ov_SC01_006_jr_8012ACE0.c @@ -2815,1333 +2815,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801829B4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801829B4[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801829F8; -extern u8 D_80182A3C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801829F8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182A3C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182A80[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182ABC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182ABC; - if (((s16)a1) < 0xC00) { - tbl = D_80182A80; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182AF8, D_80182AFA, D_80182AFC, D_80182AFE, D_80182B00, D_80182B02; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182AFA < ang)) goto outer_else; - if (!(ang < D_80182B00)) goto inner_else; - if (ang < D_80182AFC) { *(s16 *)L = D_80182AFC; goto done; } - if (D_80182AFE < ang) { *(s16 *)L = D_80182AFE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182AF8) { *(s16 *)L = D_80182AF8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80182B02 < ang) { *(s16 *)L = D_80182B02; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CC618; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CC618, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CC618; -extern s8 D_801CC61C; -extern s8 D_801CC61D; - -void func_8013C9C4(void * arg0) -{ - D_801CC618 = arg0; - D_801CC61C = 0; - D_801CC61D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CC618; -extern s8 D_801CC61C; -extern s8 D_801CC61D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CC618; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CC61D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CC61C)) * 2) + D_801CC618); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CC61D = (unsigned char) p[1]; - D_801CC61C = D_801CC61C + 1; - if (D_801CC61D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CC61C = 0; - *base = 0; - } - } - else - { - D_801CC61D = c - 1; - } - } - return; -} - - - -extern s32 D_801CC63C; -extern s32 D_801CC630; -extern s32 D_801CC634; -extern s32 D_801CC640; - -void func_8013CABC(void) { - D_801CC63C = 1; - D_801CC630 = 1; - D_801CC634 = 0; - D_801CC640 = 1; -} - - - -extern s32 D_801CC630; -extern s32 D_801CC634; -extern s32 D_801CC638; -extern s32 D_801CC63C; -extern s32 D_801CC640; - -void func_8013CAE8(void) { - D_801CC630 = 1; - D_801CC63C = 0; - D_801CC634 = 0; - D_801CC638 = -1; - D_801CC640 = 0; -} - - -extern s32 D_801CC640; - extern s32 D_801CC63C; - extern s32 D_801CC668; - extern s32 D_801CC66C; - void func_8013CB20(void) { - s32 temp_v0 = D_801CC640; - s32 temp_a0 = D_801CC63C; - D_801CC640 = 1; - D_801CC63C = 0; - D_801CC668 = temp_v0; - D_801CC66C = temp_a0; - } - - - -extern s32 D_801CC668; -extern s32 D_801CC66C; -extern s32 D_801CC640; -extern s32 D_801CC63C; - -void func_8013CB5C(void) { - D_801CC640 = D_801CC668; - D_801CC63C = D_801CC66C; -} - - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801CDED8; - extern u8 D_801CDED9; - extern u8 D_801CDEDA; - extern u8 D_801CDEDB; - extern u8 D_801CDEDC; - extern u8 D_801CDEDD; - extern u8 D_801CDEDE; - extern u8 D_801CDEDF; - extern u8 D_801CDEE0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801CDED8; t1 = D_801CDED9; t2 = D_801CDEDA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801CDEDB; t1 = D_801CDEDC; t2 = D_801CDEDD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801CDEDE; t1 = D_801CDEDF; t2 = D_801CDEE0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CC648; -extern s32 D_801CC630; -extern s32 D_801CC64C; -extern s32 D_801CC63C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CC648 != 0) { - if (D_801CC648 != 2) { - if (((D_801CC648 < 3) && (D_801CC648 == 1)) && - (D_801CC64C = D_801CC64C + 1, 0x23a < D_801CC64C)) { - D_801CC630 = D_801CC648; - D_801CC648 = 2; - } - } else { - D_801CC630 = D_801CC630 + -1; - if (D_801CC630 == 0) { - D_801CC630 = D_801CC648; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CC63C == 0) { - D_801CC648 = D_801CC648 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CC63C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CC63C; -} - - - -extern s32 D_801CC648; - -void func_8013D164(void) { - D_801CC648 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801CDFBA; -extern u8 D_801CE060; -extern u8 D_801CDEE2; -extern u8 D_801CDF9C; -extern u8 D_801CDEC0; -extern u8 D_801CDEE1; -extern s32 D_801CDFA0; - -void func_8013D330(void) { - if ((D_801CDFBA & 0xff) != D_801CE060) { - D_801CDFBA = ((D_801CDFBA & 0xff) < D_801CE060) ? (D_801CDFBA + 1) : (D_801CDFBA - 1); - } - if ((D_801CDEE2 & 0xff) != D_801CDF9C) { - D_801CDEE2 = ((D_801CDEE2 & 0xff) < D_801CDF9C) ? (D_801CDEE2 + 1) : (D_801CDEE2 - 1); - } - if ((D_801CDEC0 & 0xff) != D_801CDEE1) { - D_801CDEC0 = ((D_801CDEC0 & 0xff) < D_801CDEE1) ? (D_801CDEC0 + 1) : (D_801CDEC0 - 1); - } - D_801CDFA0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CC620; -extern void *D_801CC624; -extern void *D_801CC628; -extern s32 D_801CC650; -extern s32 D_801CC654; -extern s32 D_801CC658; -extern s32 D_801CDF14[]; - -extern u8 D_80182BF0[]; -extern u8 D_80182C98[]; -extern u8 D_80182B48[]; -extern u8 D_80182C44[]; -extern u8 D_80182CC4[]; -extern u8 D_80182B9C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CC650 = param_2; - D_801CC654 = (param_2 >> 2) & 3; - D_801CC658 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CC620 = D_80182BF0; - D_801CC624 = D_80182C98; - D_801CC628 = D_80182B48; - } else { - D_801CC620 = D_80182C44; - D_801CC624 = D_80182CC4; - D_801CC628 = D_80182B9C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CC658 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CC650 & 2) != 0) { - D_801CDF14[0] = 0x140; - D_801CDF14[3] = 0x80; - if (p[0x37] == 4) { - D_801CDF14[0] = 0x140; - D_801CDF14[3] = 0; - } - if (p[0x37] == 0) { - D_801CDF14[0] = 0x140; - D_801CDF14[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CC628)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CC628; -extern s16 *D_801CC62C; -extern s32 D_801CC63C; -extern s32 D_801CC65C; -extern s32 D_801CC660; -extern s32 D_801CC664; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CC62C != 0) { - D_801CC63C = 0; - p = (int *)(param_1 * 12 + (int)D_801CC628); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CC65C != x) { - flag = 1; - if (D_801CC65C < x) { - if (x - D_801CC65C < 5) { - D_801CC65C = x; - } else { - D_801CC65C = D_801CC65C + 4; - } - } else { - if (D_801CC65C - x < 5) { - D_801CC65C = x; - } else { - D_801CC65C = D_801CC65C - 4; - } - } - } - if (D_801CC660 != y) { - flag = 1; - if (D_801CC660 < y) { - if (y - D_801CC660 < 5) { - D_801CC660 = y; - } else { - D_801CC660 = D_801CC660 + 4; - } - } else { - if (D_801CC660 - y < 5) { - D_801CC660 = y; - } else { - D_801CC660 = D_801CC660 - 4; - } - } - } - if (D_801CC664 != z) { - flag = 1; - if (D_801CC664 < z) { - if (z - D_801CC664 < 5) { - D_801CC664 = z; - } else { - D_801CC664 = D_801CC664 + 4; - } - } else { - if (D_801CC664 - z < 5) { - D_801CC664 = z; - } else { - D_801CC664 = D_801CC664 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CC63C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182D54[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CC62C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CC65C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CC660); - uVar5 = (*(int*)&D_801CC664); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182D54); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CC644; - -s32 func_8013E054(void) { - return D_801CC644; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183750; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183728; -extern s16 D_8018372A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183750; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183728 = 2; - D_8018372A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018372A = 0; - D_80183728 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CC678; - extern void * D_801CC67C; - extern unsigned char D_801833C8; - extern unsigned char D_801833E0; - extern unsigned char D_80183454; - extern unsigned char D_8018345C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CC678 = &D_801833C8; - D_801CC67C = &D_80183454; - } else { - D_801CC678 = &D_801833E0; - D_801CC67C = &D_8018345C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183750/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183750 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183750)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018372C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018372C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018372C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183728; -extern s16 D_8018372A; -extern unsigned char D_8018372C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018372A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183728` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018372A; - if (*r < 3) { - *r = *r + 1; - } - D_80183728 = (u16)D_80183728 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018372C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_006/ov_SC01_006_jr_801380E0.c b/src/ov_SC01_006/ov_SC01_006_jr_801380E0.c new file mode 100644 index 000000000..703a1ea34 --- /dev/null +++ b/src/ov_SC01_006/ov_SC01_006_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" +#include "../shared/ov_setters.h" /* dedup share across the SC01/005 ≡ 006 pair (cookbook §11) */ + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CAE4C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182648[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CC534; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801CDFC0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CAE4C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182384)(); +extern s16 (*D_80182388)(); +extern M2C_UNK (*D_80182390)(); +extern s32 (*D_80182394)(); +extern s32 D_801CC530; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CAE50; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801826DC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(void *p, s16 v); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(void *p, s32 v); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185BC0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801826F4; +extern M2C_UNK D_801826FC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182704; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80182720[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018272C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182740[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182790[]; +extern s16 D_801827C0[]; +extern s16 D_80182820[]; +extern s16 D_80182828[]; +extern s16 D_80182848[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182880[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801828D8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182920[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182928[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182930[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182938[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801828E0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182900; +extern void func_801321B0(int param_1); +extern int D_80182910; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CC5A0; +extern s32 D_801CC5A4[]; +extern int D_801CC5A8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182944; +extern u8 D_80182940; +extern s16 *D_80182948; +extern u8 D_8018294C; +extern int D_801CC5A0; +extern u16 D_801CC5B0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182948; /* holds a pointer value (*(u16**)&D_80182948) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018295C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801829B0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801829B4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801829B4[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801829F8; +extern u8 D_80182A3C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801829F8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182A3C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182A80[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182ABC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182ABC; + if (((s16)a1) < 0xC00) { + tbl = D_80182A80; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182AF8, D_80182AFA, D_80182AFC, D_80182AFE, D_80182B00, D_80182B02; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182AFA < ang)) goto outer_else; + if (!(ang < D_80182B00)) goto inner_else; + if (ang < D_80182AFC) { *(s16 *)L = D_80182AFC; goto done; } + if (D_80182AFE < ang) { *(s16 *)L = D_80182AFE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182AF8) { *(s16 *)L = D_80182AF8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182B02 < ang) { *(s16 *)L = D_80182B02; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CC618; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CC618, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CC618; +extern s8 D_801CC61C; +extern s8 D_801CC61D; + +void func_8013C9C4(void * arg0) +{ + D_801CC618 = arg0; + D_801CC61C = 0; + D_801CC61D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CC618; +extern s8 D_801CC61C; +extern s8 D_801CC61D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CC618; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CC61D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CC61C)) * 2) + D_801CC618); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CC61D = (unsigned char) p[1]; + D_801CC61C = D_801CC61C + 1; + if (D_801CC61D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CC61C = 0; + *base = 0; + } + } + else + { + D_801CC61D = c - 1; + } + } + return; +} + + + +extern s32 D_801CC63C; +extern s32 D_801CC630; +extern s32 D_801CC634; +extern s32 D_801CC640; + +void func_8013CABC(void) { + D_801CC63C = 1; + D_801CC630 = 1; + D_801CC634 = 0; + D_801CC640 = 1; +} + + + +extern s32 D_801CC630; +extern s32 D_801CC634; +extern s32 D_801CC638; +extern s32 D_801CC63C; +extern s32 D_801CC640; + +void func_8013CAE8(void) { + D_801CC630 = 1; + D_801CC63C = 0; + D_801CC634 = 0; + D_801CC638 = -1; + D_801CC640 = 0; +} + + +extern s32 D_801CC640; + extern s32 D_801CC63C; + extern s32 D_801CC668; + extern s32 D_801CC66C; + void func_8013CB20(void) { + s32 temp_v0 = D_801CC640; + s32 temp_a0 = D_801CC63C; + D_801CC640 = 1; + D_801CC63C = 0; + D_801CC668 = temp_v0; + D_801CC66C = temp_a0; + } + + + +extern s32 D_801CC668; +extern s32 D_801CC66C; +extern s32 D_801CC640; +extern s32 D_801CC63C; + +void func_8013CB5C(void) { + D_801CC640 = D_801CC668; + D_801CC63C = D_801CC66C; +} + + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801CDED8; + extern u8 D_801CDED9; + extern u8 D_801CDEDA; + extern u8 D_801CDEDB; + extern u8 D_801CDEDC; + extern u8 D_801CDEDD; + extern u8 D_801CDEDE; + extern u8 D_801CDEDF; + extern u8 D_801CDEE0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801CDED8; t1 = D_801CDED9; t2 = D_801CDEDA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801CDEDB; t1 = D_801CDEDC; t2 = D_801CDEDD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801CDEDE; t1 = D_801CDEDF; t2 = D_801CDEE0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CC648; +extern s32 D_801CC630; +extern s32 D_801CC64C; +extern s32 D_801CC63C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CC648 != 0) { + if (D_801CC648 != 2) { + if (((D_801CC648 < 3) && (D_801CC648 == 1)) && + (D_801CC64C = D_801CC64C + 1, 0x23a < D_801CC64C)) { + D_801CC630 = D_801CC648; + D_801CC648 = 2; + } + } else { + D_801CC630 = D_801CC630 + -1; + if (D_801CC630 == 0) { + D_801CC630 = D_801CC648; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CC63C == 0) { + D_801CC648 = D_801CC648 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CC63C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CC63C; +} + + + +extern s32 D_801CC648; + +void func_8013D164(void) { + D_801CC648 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801CDFBA; +extern u8 D_801CE060; +extern u8 D_801CDEE2; +extern u8 D_801CDF9C; +extern u8 D_801CDEC0; +extern u8 D_801CDEE1; +extern s32 D_801CDFA0; + +void func_8013D330(void) { + if ((D_801CDFBA & 0xff) != D_801CE060) { + D_801CDFBA = ((D_801CDFBA & 0xff) < D_801CE060) ? (D_801CDFBA + 1) : (D_801CDFBA - 1); + } + if ((D_801CDEE2 & 0xff) != D_801CDF9C) { + D_801CDEE2 = ((D_801CDEE2 & 0xff) < D_801CDF9C) ? (D_801CDEE2 + 1) : (D_801CDEE2 - 1); + } + if ((D_801CDEC0 & 0xff) != D_801CDEE1) { + D_801CDEC0 = ((D_801CDEC0 & 0xff) < D_801CDEE1) ? (D_801CDEC0 + 1) : (D_801CDEC0 - 1); + } + D_801CDFA0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CC620; +extern void *D_801CC624; +extern void *D_801CC628; +extern s32 D_801CC650; +extern s32 D_801CC654; +extern s32 D_801CC658; +extern s32 D_801CDF14[]; + +extern u8 D_80182BF0[]; +extern u8 D_80182C98[]; +extern u8 D_80182B48[]; +extern u8 D_80182C44[]; +extern u8 D_80182CC4[]; +extern u8 D_80182B9C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CC650 = param_2; + D_801CC654 = (param_2 >> 2) & 3; + D_801CC658 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CC620 = D_80182BF0; + D_801CC624 = D_80182C98; + D_801CC628 = D_80182B48; + } else { + D_801CC620 = D_80182C44; + D_801CC624 = D_80182CC4; + D_801CC628 = D_80182B9C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CC658 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CC650 & 2) != 0) { + D_801CDF14[0] = 0x140; + D_801CDF14[3] = 0x80; + if (p[0x37] == 4) { + D_801CDF14[0] = 0x140; + D_801CDF14[3] = 0; + } + if (p[0x37] == 0) { + D_801CDF14[0] = 0x140; + D_801CDF14[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CC628)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CC628; +extern s16 *D_801CC62C; +extern s32 D_801CC63C; +extern s32 D_801CC65C; +extern s32 D_801CC660; +extern s32 D_801CC664; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CC62C != 0) { + D_801CC63C = 0; + p = (int *)(param_1 * 12 + (int)D_801CC628); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CC65C != x) { + flag = 1; + if (D_801CC65C < x) { + if (x - D_801CC65C < 5) { + D_801CC65C = x; + } else { + D_801CC65C = D_801CC65C + 4; + } + } else { + if (D_801CC65C - x < 5) { + D_801CC65C = x; + } else { + D_801CC65C = D_801CC65C - 4; + } + } + } + if (D_801CC660 != y) { + flag = 1; + if (D_801CC660 < y) { + if (y - D_801CC660 < 5) { + D_801CC660 = y; + } else { + D_801CC660 = D_801CC660 + 4; + } + } else { + if (D_801CC660 - y < 5) { + D_801CC660 = y; + } else { + D_801CC660 = D_801CC660 - 4; + } + } + } + if (D_801CC664 != z) { + flag = 1; + if (D_801CC664 < z) { + if (z - D_801CC664 < 5) { + D_801CC664 = z; + } else { + D_801CC664 = D_801CC664 + 4; + } + } else { + if (D_801CC664 - z < 5) { + D_801CC664 = z; + } else { + D_801CC664 = D_801CC664 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CC63C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182D54[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CC62C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CC65C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CC660); + uVar5 = (*(int*)&D_801CC664); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182D54); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CC644; + +s32 func_8013E054(void) { + return D_801CC644; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183750; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183728; +extern s16 D_8018372A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183750; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183728 = 2; + D_8018372A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018372A = 0; + D_80183728 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CC678; + extern void * D_801CC67C; + extern unsigned char D_801833C8; + extern unsigned char D_801833E0; + extern unsigned char D_80183454; + extern unsigned char D_8018345C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CC678 = &D_801833C8; + D_801CC67C = &D_80183454; + } else { + D_801CC678 = &D_801833E0; + D_801CC67C = &D_8018345C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183750/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183750 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183750)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018372C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018372C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018372C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183728; +extern s16 D_8018372A; +extern unsigned char D_8018372C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018372A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183728` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018372A; + if (*r < 3) { + *r = *r + 1; + } + D_80183728 = (u16)D_80183728 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018372C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018372C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_006/nonmatchings/ov_SC01_006_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_008/ov_SC01_008_jr_8012ACE0.c b/src/ov_SC01_008/ov_SC01_008_jr_8012ACE0.c index d81652f37..ed4f92341 100644 --- a/src/ov_SC01_008/ov_SC01_008_jr_8012ACE0.c +++ b/src/ov_SC01_008/ov_SC01_008_jr_8012ACE0.c @@ -2824,1342 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017FD94[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017FD94[*(short *)(p + 4)](); -} - - -void func_80138C30(void *a0) { - s16 v1 = *(s16 *)((u8 *)a0 + 4); - if (v1 == 4) { - *(s16 *)((u8 *)a0 + 4) = 2; - } else { - *(s32 *)((u8 *)a0 + 8) |= 0x800; - } -} - - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017FDD8; -extern u8 D_8017FE1C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017FDD8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017FE1C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017FE60[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017FE9C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017FE9C; - if (((s16)a1) < 0xC00) { - tbl = D_8017FE60; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017FED8, D_8017FEDA, D_8017FEDC, D_8017FEDE, D_8017FEE0, D_8017FEE2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017FEDA < ang)) goto outer_else; - if (!(ang < D_8017FEE0)) goto inner_else; - if (ang < D_8017FEDC) { *(s16 *)L = D_8017FEDC; goto done; } - if (D_8017FEDE < ang) { *(s16 *)L = D_8017FEDE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017FED8) { *(s16 *)L = D_8017FED8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017FEE2 < ang) { *(s16 *)L = D_8017FEE2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A20C8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A20C8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A20C8; -extern s8 D_801A20CC; -extern s8 D_801A20CD; - -void func_8013C9C4(void * arg0) -{ - D_801A20C8 = arg0; - D_801A20CC = 0; - D_801A20CD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A20C8; -extern s8 D_801A20CC; -extern s8 D_801A20CD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A20C8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A20CD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A20CC)) * 2) + D_801A20C8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A20CD = (unsigned char) p[1]; - D_801A20CC = D_801A20CC + 1; - if (D_801A20CD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A20CC = 0; - *base = 0; - } - } - else - { - D_801A20CD = c - 1; - } - } - return; -} - - - -extern s32 D_801A20EC; -extern s32 D_801A20E0; -extern s32 D_801A20E4; -extern s32 D_801A20F0; - -void func_8013CABC(void) { - D_801A20EC = 1; - D_801A20E0 = 1; - D_801A20E4 = 0; - D_801A20F0 = 1; -} - - - -extern s32 D_801A20E0; -extern s32 D_801A20E4; -extern s32 D_801A20E8; -extern s32 D_801A20EC; -extern s32 D_801A20F0; - -void func_8013CAE8(void) { - D_801A20E0 = 1; - D_801A20EC = 0; - D_801A20E4 = 0; - D_801A20E8 = -1; - D_801A20F0 = 0; -} - - - -extern s32 D_801A20EC; -extern s32 D_801A20F0; -extern s32 D_801A2118; -extern s32 D_801A211C; - -void func_8013CB20(void) -{ - D_801A2118 = D_801A20F0; - D_801A211C = D_801A20EC; - D_801A20F0 = 1; - D_801A20EC = 0; -} - - - -extern s32 D_801A2118; -extern s32 D_801A211C; -extern s32 D_801A20F0; -extern s32 D_801A20EC; - -void func_8013CB5C(void) { - D_801A20F0 = D_801A2118; - D_801A20EC = D_801A211C; -} - - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A3488; - extern u8 D_801A3489; - extern u8 D_801A348A; - extern u8 D_801A348B; - extern u8 D_801A348C; - extern u8 D_801A348D; - extern u8 D_801A348E; - extern u8 D_801A348F; - extern u8 D_801A3490; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A3488; t1 = D_801A3489; t2 = D_801A348A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A348B; t1 = D_801A348C; t2 = D_801A348D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A348E; t1 = D_801A348F; t2 = D_801A3490; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A20F8; -extern s32 D_801A20E0; -extern s32 D_801A20FC; -extern s32 D_801A20EC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A20F8 != 0) { - if (D_801A20F8 != 2) { - if (((D_801A20F8 < 3) && (D_801A20F8 == 1)) && - (D_801A20FC = D_801A20FC + 1, 0x23a < D_801A20FC)) { - D_801A20E0 = D_801A20F8; - D_801A20F8 = 2; - } - } else { - D_801A20E0 = D_801A20E0 + -1; - if (D_801A20E0 == 0) { - D_801A20E0 = D_801A20F8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A20EC == 0) { - D_801A20F8 = D_801A20F8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A20EC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A20EC; -} - - - -extern s32 D_801A20F8; - -void func_8013D164(void) { - D_801A20F8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A356A; -extern u8 D_801A35DE; -extern u8 D_801A3492; -extern u8 D_801A354C; -extern u8 D_801A3470; -extern u8 D_801A3491; -extern s32 D_801A3550; - -void func_8013D330(void) { - if ((D_801A356A & 0xff) != D_801A35DE) { - D_801A356A = ((D_801A356A & 0xff) < D_801A35DE) ? (D_801A356A + 1) : (D_801A356A - 1); - } - if ((D_801A3492 & 0xff) != D_801A354C) { - D_801A3492 = ((D_801A3492 & 0xff) < D_801A354C) ? (D_801A3492 + 1) : (D_801A3492 - 1); - } - if ((D_801A3470 & 0xff) != D_801A3491) { - D_801A3470 = ((D_801A3470 & 0xff) < D_801A3491) ? (D_801A3470 + 1) : (D_801A3470 - 1); - } - D_801A3550 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A20D0; -extern void *D_801A20D4; -extern void *D_801A20D8; -extern s32 D_801A2100; -extern s32 D_801A2104; -extern s32 D_801A2108; -extern s32 D_801A34C4[]; - -extern u8 D_8017FFD0[]; -extern u8 D_80180078[]; -extern u8 D_8017FF28[]; -extern u8 D_80180024[]; -extern u8 D_801800A4[]; -extern u8 D_8017FF7C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A2100 = param_2; - D_801A2104 = (param_2 >> 2) & 3; - D_801A2108 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A20D0 = D_8017FFD0; - D_801A20D4 = D_80180078; - D_801A20D8 = D_8017FF28; - } else { - D_801A20D0 = D_80180024; - D_801A20D4 = D_801800A4; - D_801A20D8 = D_8017FF7C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A2108 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A2100 & 2) != 0) { - D_801A34C4[0] = 0x140; - D_801A34C4[3] = 0x80; - if (p[0x37] == 4) { - D_801A34C4[0] = 0x140; - D_801A34C4[3] = 0; - } - if (p[0x37] == 0) { - D_801A34C4[0] = 0x140; - D_801A34C4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A20D8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A20D8; -extern s16 *D_801A20DC; -extern s32 D_801A20EC; -extern s32 D_801A210C; -extern s32 D_801A2110; -extern s32 D_801A2114; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A20DC != 0) { - D_801A20EC = 0; - p = (int *)(param_1 * 12 + (int)D_801A20D8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A210C != x) { - flag = 1; - if (D_801A210C < x) { - if (x - D_801A210C < 5) { - D_801A210C = x; - } else { - D_801A210C = D_801A210C + 4; - } - } else { - if (D_801A210C - x < 5) { - D_801A210C = x; - } else { - D_801A210C = D_801A210C - 4; - } - } - } - if (D_801A2110 != y) { - flag = 1; - if (D_801A2110 < y) { - if (y - D_801A2110 < 5) { - D_801A2110 = y; - } else { - D_801A2110 = D_801A2110 + 4; - } - } else { - if (D_801A2110 - y < 5) { - D_801A2110 = y; - } else { - D_801A2110 = D_801A2110 - 4; - } - } - } - if (D_801A2114 != z) { - flag = 1; - if (D_801A2114 < z) { - if (z - D_801A2114 < 5) { - D_801A2114 = z; - } else { - D_801A2114 = D_801A2114 + 4; - } - } else { - if (D_801A2114 - z < 5) { - D_801A2114 = z; - } else { - D_801A2114 = D_801A2114 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A20EC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80180134[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A20DC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A210C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A2110); - uVar5 = (*(int*)&D_801A2114); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80180134); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A20F4; - -s32 func_8013E054(void) { - return D_801A20F4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180B30; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80180B08; -extern s16 D_80180B0A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180B30; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80180B08 = 2; - D_80180B0A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80180B0A = 0; - D_80180B08 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A2128; - extern void * D_801A212C; - extern unsigned char D_801807A8; - extern unsigned char D_801807C0; - extern unsigned char D_80180834; - extern unsigned char D_8018083C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A2128 = &D_801807A8; - D_801A212C = &D_80180834; - } else { - D_801A2128 = &D_801807C0; - D_801A212C = &D_8018083C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180B30/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180B30 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180B30)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180B0C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180B0C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180B0C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80180B08; -extern s16 D_80180B0A; -extern unsigned char D_80180B0C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180B0A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80180B08` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80180B0A; - if (*r < 3) { - *r = *r + 1; - } - D_80180B08 = (u16)D_80180B08 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180B0C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180B0C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180B0C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_008/ov_SC01_008_jr_801380E0.c b/src/ov_SC01_008/ov_SC01_008_jr_801380E0.c new file mode 100644 index 000000000..3d6ab516a --- /dev/null +++ b/src/ov_SC01_008/ov_SC01_008_jr_801380E0.c @@ -0,0 +1,2395 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A08FC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017FA28[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A1FE4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A3570; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A08FC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F764)(); +extern s16 (*D_8017F768)(); +extern M2C_UNK (*D_8017F770)(); +extern s32 (*D_8017F774)(); +extern s32 D_801A1FE0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A0900; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017FABC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182FA0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017FAD4; +extern M2C_UNK D_8017FADC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017FAE4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017FB00[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017FB0C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017FB20[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017FB70[]; +extern s16 D_8017FBA0[]; +extern s16 D_8017FC00[]; +extern s16 D_8017FC08[]; +extern s16 D_8017FC28[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017FC60[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017FCB8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017FD00[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017FD08[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017FD10[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017FD18[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017FCC0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017FCE0; +extern void func_801321B0(int param_1); +extern int D_8017FCF0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A2050; +extern s32 D_801A2054[]; +extern int D_801A2058; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017FD24; +extern u8 D_8017FD20; +extern s16 *D_8017FD28; +extern u8 D_8017FD2C; +extern int D_801A2050; +extern u16 D_801A2060; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017FD28; /* holds a pointer value (*(u16**)&D_8017FD28) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017FD3C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017FD90; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017FD94[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017FD94[*(short *)(p + 4)](); +} + + +void func_80138C30(void *a0) { + s16 v1 = *(s16 *)((u8 *)a0 + 4); + if (v1 == 4) { + *(s16 *)((u8 *)a0 + 4) = 2; + } else { + *(s32 *)((u8 *)a0 + 8) |= 0x800; + } +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017FDD8; +extern u8 D_8017FE1C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017FDD8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017FE1C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017FE60[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017FE9C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017FE9C; + if (((s16)a1) < 0xC00) { + tbl = D_8017FE60; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017FED8, D_8017FEDA, D_8017FEDC, D_8017FEDE, D_8017FEE0, D_8017FEE2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017FEDA < ang)) goto outer_else; + if (!(ang < D_8017FEE0)) goto inner_else; + if (ang < D_8017FEDC) { *(s16 *)L = D_8017FEDC; goto done; } + if (D_8017FEDE < ang) { *(s16 *)L = D_8017FEDE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017FED8) { *(s16 *)L = D_8017FED8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017FEE2 < ang) { *(s16 *)L = D_8017FEE2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A20C8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A20C8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A20C8; +extern s8 D_801A20CC; +extern s8 D_801A20CD; + +void func_8013C9C4(void * arg0) +{ + D_801A20C8 = arg0; + D_801A20CC = 0; + D_801A20CD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A20C8; +extern s8 D_801A20CC; +extern s8 D_801A20CD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A20C8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A20CD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A20CC)) * 2) + D_801A20C8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A20CD = (unsigned char) p[1]; + D_801A20CC = D_801A20CC + 1; + if (D_801A20CD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A20CC = 0; + *base = 0; + } + } + else + { + D_801A20CD = c - 1; + } + } + return; +} + + + +extern s32 D_801A20EC; +extern s32 D_801A20E0; +extern s32 D_801A20E4; +extern s32 D_801A20F0; + +void func_8013CABC(void) { + D_801A20EC = 1; + D_801A20E0 = 1; + D_801A20E4 = 0; + D_801A20F0 = 1; +} + + + +extern s32 D_801A20E0; +extern s32 D_801A20E4; +extern s32 D_801A20E8; +extern s32 D_801A20EC; +extern s32 D_801A20F0; + +void func_8013CAE8(void) { + D_801A20E0 = 1; + D_801A20EC = 0; + D_801A20E4 = 0; + D_801A20E8 = -1; + D_801A20F0 = 0; +} + + + +extern s32 D_801A20EC; +extern s32 D_801A20F0; +extern s32 D_801A2118; +extern s32 D_801A211C; + +void func_8013CB20(void) +{ + D_801A2118 = D_801A20F0; + D_801A211C = D_801A20EC; + D_801A20F0 = 1; + D_801A20EC = 0; +} + + + +extern s32 D_801A2118; +extern s32 D_801A211C; +extern s32 D_801A20F0; +extern s32 D_801A20EC; + +void func_8013CB5C(void) { + D_801A20F0 = D_801A2118; + D_801A20EC = D_801A211C; +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A3488; + extern u8 D_801A3489; + extern u8 D_801A348A; + extern u8 D_801A348B; + extern u8 D_801A348C; + extern u8 D_801A348D; + extern u8 D_801A348E; + extern u8 D_801A348F; + extern u8 D_801A3490; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A3488; t1 = D_801A3489; t2 = D_801A348A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A348B; t1 = D_801A348C; t2 = D_801A348D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A348E; t1 = D_801A348F; t2 = D_801A3490; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A20F8; +extern s32 D_801A20E0; +extern s32 D_801A20FC; +extern s32 D_801A20EC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A20F8 != 0) { + if (D_801A20F8 != 2) { + if (((D_801A20F8 < 3) && (D_801A20F8 == 1)) && + (D_801A20FC = D_801A20FC + 1, 0x23a < D_801A20FC)) { + D_801A20E0 = D_801A20F8; + D_801A20F8 = 2; + } + } else { + D_801A20E0 = D_801A20E0 + -1; + if (D_801A20E0 == 0) { + D_801A20E0 = D_801A20F8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A20EC == 0) { + D_801A20F8 = D_801A20F8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A20EC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A20EC; +} + + + +extern s32 D_801A20F8; + +void func_8013D164(void) { + D_801A20F8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A356A; +extern u8 D_801A35DE; +extern u8 D_801A3492; +extern u8 D_801A354C; +extern u8 D_801A3470; +extern u8 D_801A3491; +extern s32 D_801A3550; + +void func_8013D330(void) { + if ((D_801A356A & 0xff) != D_801A35DE) { + D_801A356A = ((D_801A356A & 0xff) < D_801A35DE) ? (D_801A356A + 1) : (D_801A356A - 1); + } + if ((D_801A3492 & 0xff) != D_801A354C) { + D_801A3492 = ((D_801A3492 & 0xff) < D_801A354C) ? (D_801A3492 + 1) : (D_801A3492 - 1); + } + if ((D_801A3470 & 0xff) != D_801A3491) { + D_801A3470 = ((D_801A3470 & 0xff) < D_801A3491) ? (D_801A3470 + 1) : (D_801A3470 - 1); + } + D_801A3550 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A20D0; +extern void *D_801A20D4; +extern void *D_801A20D8; +extern s32 D_801A2100; +extern s32 D_801A2104; +extern s32 D_801A2108; +extern s32 D_801A34C4[]; + +extern u8 D_8017FFD0[]; +extern u8 D_80180078[]; +extern u8 D_8017FF28[]; +extern u8 D_80180024[]; +extern u8 D_801800A4[]; +extern u8 D_8017FF7C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A2100 = param_2; + D_801A2104 = (param_2 >> 2) & 3; + D_801A2108 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A20D0 = D_8017FFD0; + D_801A20D4 = D_80180078; + D_801A20D8 = D_8017FF28; + } else { + D_801A20D0 = D_80180024; + D_801A20D4 = D_801800A4; + D_801A20D8 = D_8017FF7C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A2108 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A2100 & 2) != 0) { + D_801A34C4[0] = 0x140; + D_801A34C4[3] = 0x80; + if (p[0x37] == 4) { + D_801A34C4[0] = 0x140; + D_801A34C4[3] = 0; + } + if (p[0x37] == 0) { + D_801A34C4[0] = 0x140; + D_801A34C4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A20D8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A20D8; +extern s16 *D_801A20DC; +extern s32 D_801A20EC; +extern s32 D_801A210C; +extern s32 D_801A2110; +extern s32 D_801A2114; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A20DC != 0) { + D_801A20EC = 0; + p = (int *)(param_1 * 12 + (int)D_801A20D8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A210C != x) { + flag = 1; + if (D_801A210C < x) { + if (x - D_801A210C < 5) { + D_801A210C = x; + } else { + D_801A210C = D_801A210C + 4; + } + } else { + if (D_801A210C - x < 5) { + D_801A210C = x; + } else { + D_801A210C = D_801A210C - 4; + } + } + } + if (D_801A2110 != y) { + flag = 1; + if (D_801A2110 < y) { + if (y - D_801A2110 < 5) { + D_801A2110 = y; + } else { + D_801A2110 = D_801A2110 + 4; + } + } else { + if (D_801A2110 - y < 5) { + D_801A2110 = y; + } else { + D_801A2110 = D_801A2110 - 4; + } + } + } + if (D_801A2114 != z) { + flag = 1; + if (D_801A2114 < z) { + if (z - D_801A2114 < 5) { + D_801A2114 = z; + } else { + D_801A2114 = D_801A2114 + 4; + } + } else { + if (D_801A2114 - z < 5) { + D_801A2114 = z; + } else { + D_801A2114 = D_801A2114 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A20EC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80180134[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A20DC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A210C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A2110); + uVar5 = (*(int*)&D_801A2114); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80180134); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A20F4; + +s32 func_8013E054(void) { + return D_801A20F4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180B30; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80180B08; +extern s16 D_80180B0A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180B30; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80180B08 = 2; + D_80180B0A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80180B0A = 0; + D_80180B08 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A2128; + extern void * D_801A212C; + extern unsigned char D_801807A8; + extern unsigned char D_801807C0; + extern unsigned char D_80180834; + extern unsigned char D_8018083C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A2128 = &D_801807A8; + D_801A212C = &D_80180834; + } else { + D_801A2128 = &D_801807C0; + D_801A212C = &D_8018083C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180B30/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180B30 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180B30)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180B0C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180B0C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180B0C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80180B08; +extern s16 D_80180B0A; +extern unsigned char D_80180B0C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180B0A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80180B08` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80180B0A; + if (*r < 3) { + *r = *r + 1; + } + D_80180B08 = (u16)D_80180B08 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180B0C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180B0C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180B0C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_009/ov_SC01_009_jr_8012ACE0.c b/src/ov_SC01_009/ov_SC01_009_jr_8012ACE0.c index 35d4e7930..fa17954ac 100644 --- a/src/ov_SC01_009/ov_SC01_009_jr_8012ACE0.c +++ b/src/ov_SC01_009/ov_SC01_009_jr_8012ACE0.c @@ -2824,1342 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182F7C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182F7C[*(short *)(p + 4)](); -} - - -void func_80138C30(void *a0) { - s16 v1 = *(s16 *)((u8 *)a0 + 4); - if (v1 == 4) { - *(s16 *)((u8 *)a0 + 4) = 2; - } else { - *(s32 *)((u8 *)a0 + 8) |= 0x800; - } -} - - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182FC0; -extern u8 D_80183004; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182FC0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183004 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183048[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183084[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183084; - if (((s16)a1) < 0xC00) { - tbl = D_80183048; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801830C0, D_801830C2, D_801830C4, D_801830C6, D_801830C8, D_801830CA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801830C2 < ang)) goto outer_else; - if (!(ang < D_801830C8)) goto inner_else; - if (ang < D_801830C4) { *(s16 *)L = D_801830C4; goto done; } - if (D_801830C6 < ang) { *(s16 *)L = D_801830C6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801830C0) { *(s16 *)L = D_801830C0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801830CA < ang) { *(s16 *)L = D_801830CA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801F1F28; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801F1F28, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801F1F28; -extern s8 D_801F1F2C; -extern s8 D_801F1F2D; - -void func_8013C9C4(void * arg0) -{ - D_801F1F28 = arg0; - D_801F1F2C = 0; - D_801F1F2D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801F1F28; -extern s8 D_801F1F2C; -extern s8 D_801F1F2D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801F1F28; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801F1F2D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801F1F2C)) * 2) + D_801F1F28); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801F1F2D = (unsigned char) p[1]; - D_801F1F2C = D_801F1F2C + 1; - if (D_801F1F2D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801F1F2C = 0; - *base = 0; - } - } - else - { - D_801F1F2D = c - 1; - } - } - return; -} - - - -extern s32 D_801F1F4C; -extern s32 D_801F1F40; -extern s32 D_801F1F44; -extern s32 D_801F1F50; - -void func_8013CABC(void) { - D_801F1F4C = 1; - D_801F1F40 = 1; - D_801F1F44 = 0; - D_801F1F50 = 1; -} - - - -extern s32 D_801F1F40; -extern s32 D_801F1F44; -extern s32 D_801F1F48; -extern s32 D_801F1F4C; -extern s32 D_801F1F50; - -void func_8013CAE8(void) { - D_801F1F40 = 1; - D_801F1F4C = 0; - D_801F1F44 = 0; - D_801F1F48 = -1; - D_801F1F50 = 0; -} - - - -extern s32 D_801F1F4C; -extern s32 D_801F1F50; -extern s32 D_801F1F78; -extern s32 D_801F1F7C; - -void func_8013CB20(void) -{ - D_801F1F78 = D_801F1F50; - D_801F1F7C = D_801F1F4C; - D_801F1F50 = 1; - D_801F1F4C = 0; -} - - - -extern s32 D_801F1F78; -extern s32 D_801F1F7C; -extern s32 D_801F1F50; -extern s32 D_801F1F4C; - -void func_8013CB5C(void) { - D_801F1F50 = D_801F1F78; - D_801F1F4C = D_801F1F7C; -} - - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801F3308; - extern u8 D_801F3309; - extern u8 D_801F330A; - extern u8 D_801F330B; - extern u8 D_801F330C; - extern u8 D_801F330D; - extern u8 D_801F330E; - extern u8 D_801F330F; - extern u8 D_801F3310; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801F3308; t1 = D_801F3309; t2 = D_801F330A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801F330B; t1 = D_801F330C; t2 = D_801F330D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801F330E; t1 = D_801F330F; t2 = D_801F3310; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801F1F58; -extern s32 D_801F1F40; -extern s32 D_801F1F5C; -extern s32 D_801F1F4C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801F1F58 != 0) { - if (D_801F1F58 != 2) { - if (((D_801F1F58 < 3) && (D_801F1F58 == 1)) && - (D_801F1F5C = D_801F1F5C + 1, 0x23a < D_801F1F5C)) { - D_801F1F40 = D_801F1F58; - D_801F1F58 = 2; - } - } else { - D_801F1F40 = D_801F1F40 + -1; - if (D_801F1F40 == 0) { - D_801F1F40 = D_801F1F58; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801F1F4C == 0) { - D_801F1F58 = D_801F1F58 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801F1F4C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801F1F4C; -} - - - -extern s32 D_801F1F58; - -void func_8013D164(void) { - D_801F1F58 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801F33EA; -extern u8 D_801F345E; -extern u8 D_801F3312; -extern u8 D_801F33CC; -extern u8 D_801F32F0; -extern u8 D_801F3311; -extern s32 D_801F33D0; - -void func_8013D330(void) { - if ((D_801F33EA & 0xff) != D_801F345E) { - D_801F33EA = ((D_801F33EA & 0xff) < D_801F345E) ? (D_801F33EA + 1) : (D_801F33EA - 1); - } - if ((D_801F3312 & 0xff) != D_801F33CC) { - D_801F3312 = ((D_801F3312 & 0xff) < D_801F33CC) ? (D_801F3312 + 1) : (D_801F3312 - 1); - } - if ((D_801F32F0 & 0xff) != D_801F3311) { - D_801F32F0 = ((D_801F32F0 & 0xff) < D_801F3311) ? (D_801F32F0 + 1) : (D_801F32F0 - 1); - } - D_801F33D0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801F1F30; -extern void *D_801F1F34; -extern void *D_801F1F38; -extern s32 D_801F1F60; -extern s32 D_801F1F64; -extern s32 D_801F1F68; -extern s32 D_801F3344[]; - -extern u8 D_801831B8[]; -extern u8 D_80183260[]; -extern u8 D_80183110[]; -extern u8 D_8018320C[]; -extern u8 D_8018328C[]; -extern u8 D_80183164[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801F1F60 = param_2; - D_801F1F64 = (param_2 >> 2) & 3; - D_801F1F68 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801F1F30 = D_801831B8; - D_801F1F34 = D_80183260; - D_801F1F38 = D_80183110; - } else { - D_801F1F30 = D_8018320C; - D_801F1F34 = D_8018328C; - D_801F1F38 = D_80183164; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801F1F68 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801F1F60 & 2) != 0) { - D_801F3344[0] = 0x140; - D_801F3344[3] = 0x80; - if (p[0x37] == 4) { - D_801F3344[0] = 0x140; - D_801F3344[3] = 0; - } - if (p[0x37] == 0) { - D_801F3344[0] = 0x140; - D_801F3344[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801F1F38)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801F1F38; -extern s16 *D_801F1F3C; -extern s32 D_801F1F4C; -extern s32 D_801F1F6C; -extern s32 D_801F1F70; -extern s32 D_801F1F74; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801F1F3C != 0) { - D_801F1F4C = 0; - p = (int *)(param_1 * 12 + (int)D_801F1F38); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801F1F6C != x) { - flag = 1; - if (D_801F1F6C < x) { - if (x - D_801F1F6C < 5) { - D_801F1F6C = x; - } else { - D_801F1F6C = D_801F1F6C + 4; - } - } else { - if (D_801F1F6C - x < 5) { - D_801F1F6C = x; - } else { - D_801F1F6C = D_801F1F6C - 4; - } - } - } - if (D_801F1F70 != y) { - flag = 1; - if (D_801F1F70 < y) { - if (y - D_801F1F70 < 5) { - D_801F1F70 = y; - } else { - D_801F1F70 = D_801F1F70 + 4; - } - } else { - if (D_801F1F70 - y < 5) { - D_801F1F70 = y; - } else { - D_801F1F70 = D_801F1F70 - 4; - } - } - } - if (D_801F1F74 != z) { - flag = 1; - if (D_801F1F74 < z) { - if (z - D_801F1F74 < 5) { - D_801F1F74 = z; - } else { - D_801F1F74 = D_801F1F74 + 4; - } - } else { - if (D_801F1F74 - z < 5) { - D_801F1F74 = z; - } else { - D_801F1F74 = D_801F1F74 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801F1F4C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018331C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801F1F3C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801F1F6C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801F1F70); - uVar5 = (*(int*)&D_801F1F74); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018331C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801F1F54; - -s32 func_8013E054(void) { - return D_801F1F54; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183D18; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183CF0; -extern s16 D_80183CF2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183D18; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183CF0 = 2; - D_80183CF2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80183CF2 = 0; - D_80183CF0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801F1F88; - extern void * D_801F1F8C; - extern unsigned char D_80183990; - extern unsigned char D_801839A8; - extern unsigned char D_80183A1C; - extern unsigned char D_80183A24; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801F1F88 = &D_80183990; - D_801F1F8C = &D_80183A1C; - } else { - D_801F1F88 = &D_801839A8; - D_801F1F8C = &D_80183A24; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183D18/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183D18 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183D18)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80183CF4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183CF4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183CF4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183CF0; -extern s16 D_80183CF2; -extern unsigned char D_80183CF4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183CF2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183CF0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80183CF2; - if (*r < 3) { - *r = *r + 1; - } - D_80183CF0 = (u16)D_80183CF0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183CF4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80183CF4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183CF4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_009/ov_SC01_009_jr_801380E0.c b/src/ov_SC01_009/ov_SC01_009_jr_801380E0.c new file mode 100644 index 000000000..43588e3cf --- /dev/null +++ b/src/ov_SC01_009/ov_SC01_009_jr_801380E0.c @@ -0,0 +1,2395 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801F06C0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182C10[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801F1E44; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801F33F0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801F06C0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018294C)(); +extern s16 (*D_80182950)(); +extern M2C_UNK (*D_80182958)(); +extern s32 (*D_8018295C)(); +extern s32 D_801F1E40; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801F06C4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182CA4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80186188; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80182CBC; +extern M2C_UNK D_80182CC4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182CCC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80182CE8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80182CF4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182D08[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182D58[]; +extern s16 D_80182D88[]; +extern s16 D_80182DE8[]; +extern s16 D_80182DF0[]; +extern s16 D_80182E10[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182E48[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182EA0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182EE8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182EF0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182EF8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182F00[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182EA8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182EC8; +extern void func_801321B0(int param_1); +extern int D_80182ED8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801F1EB0; +extern s32 D_801F1EB4[]; +extern int D_801F1EB8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182F0C; +extern u8 D_80182F08; +extern s16 *D_80182F10; +extern u8 D_80182F14; +extern int D_801F1EB0; +extern u16 D_801F1EC0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182F10; /* holds a pointer value (*(u16**)&D_80182F10) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182F24[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182F78; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182F7C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182F7C[*(short *)(p + 4)](); +} + + +void func_80138C30(void *a0) { + s16 v1 = *(s16 *)((u8 *)a0 + 4); + if (v1 == 4) { + *(s16 *)((u8 *)a0 + 4) = 2; + } else { + *(s32 *)((u8 *)a0 + 8) |= 0x800; + } +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182FC0; +extern u8 D_80183004; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182FC0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183004 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183048[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183084[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183084; + if (((s16)a1) < 0xC00) { + tbl = D_80183048; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801830C0, D_801830C2, D_801830C4, D_801830C6, D_801830C8, D_801830CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801830C2 < ang)) goto outer_else; + if (!(ang < D_801830C8)) goto inner_else; + if (ang < D_801830C4) { *(s16 *)L = D_801830C4; goto done; } + if (D_801830C6 < ang) { *(s16 *)L = D_801830C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801830C0) { *(s16 *)L = D_801830C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801830CA < ang) { *(s16 *)L = D_801830CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801F1F28; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801F1F28, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801F1F28; +extern s8 D_801F1F2C; +extern s8 D_801F1F2D; + +void func_8013C9C4(void * arg0) +{ + D_801F1F28 = arg0; + D_801F1F2C = 0; + D_801F1F2D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801F1F28; +extern s8 D_801F1F2C; +extern s8 D_801F1F2D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801F1F28; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801F1F2D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801F1F2C)) * 2) + D_801F1F28); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801F1F2D = (unsigned char) p[1]; + D_801F1F2C = D_801F1F2C + 1; + if (D_801F1F2D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801F1F2C = 0; + *base = 0; + } + } + else + { + D_801F1F2D = c - 1; + } + } + return; +} + + + +extern s32 D_801F1F4C; +extern s32 D_801F1F40; +extern s32 D_801F1F44; +extern s32 D_801F1F50; + +void func_8013CABC(void) { + D_801F1F4C = 1; + D_801F1F40 = 1; + D_801F1F44 = 0; + D_801F1F50 = 1; +} + + + +extern s32 D_801F1F40; +extern s32 D_801F1F44; +extern s32 D_801F1F48; +extern s32 D_801F1F4C; +extern s32 D_801F1F50; + +void func_8013CAE8(void) { + D_801F1F40 = 1; + D_801F1F4C = 0; + D_801F1F44 = 0; + D_801F1F48 = -1; + D_801F1F50 = 0; +} + + + +extern s32 D_801F1F4C; +extern s32 D_801F1F50; +extern s32 D_801F1F78; +extern s32 D_801F1F7C; + +void func_8013CB20(void) +{ + D_801F1F78 = D_801F1F50; + D_801F1F7C = D_801F1F4C; + D_801F1F50 = 1; + D_801F1F4C = 0; +} + + + +extern s32 D_801F1F78; +extern s32 D_801F1F7C; +extern s32 D_801F1F50; +extern s32 D_801F1F4C; + +void func_8013CB5C(void) { + D_801F1F50 = D_801F1F78; + D_801F1F4C = D_801F1F7C; +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801F3308; + extern u8 D_801F3309; + extern u8 D_801F330A; + extern u8 D_801F330B; + extern u8 D_801F330C; + extern u8 D_801F330D; + extern u8 D_801F330E; + extern u8 D_801F330F; + extern u8 D_801F3310; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801F3308; t1 = D_801F3309; t2 = D_801F330A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801F330B; t1 = D_801F330C; t2 = D_801F330D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801F330E; t1 = D_801F330F; t2 = D_801F3310; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801F1F58; +extern s32 D_801F1F40; +extern s32 D_801F1F5C; +extern s32 D_801F1F4C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801F1F58 != 0) { + if (D_801F1F58 != 2) { + if (((D_801F1F58 < 3) && (D_801F1F58 == 1)) && + (D_801F1F5C = D_801F1F5C + 1, 0x23a < D_801F1F5C)) { + D_801F1F40 = D_801F1F58; + D_801F1F58 = 2; + } + } else { + D_801F1F40 = D_801F1F40 + -1; + if (D_801F1F40 == 0) { + D_801F1F40 = D_801F1F58; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801F1F4C == 0) { + D_801F1F58 = D_801F1F58 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801F1F4C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801F1F4C; +} + + + +extern s32 D_801F1F58; + +void func_8013D164(void) { + D_801F1F58 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801F33EA; +extern u8 D_801F345E; +extern u8 D_801F3312; +extern u8 D_801F33CC; +extern u8 D_801F32F0; +extern u8 D_801F3311; +extern s32 D_801F33D0; + +void func_8013D330(void) { + if ((D_801F33EA & 0xff) != D_801F345E) { + D_801F33EA = ((D_801F33EA & 0xff) < D_801F345E) ? (D_801F33EA + 1) : (D_801F33EA - 1); + } + if ((D_801F3312 & 0xff) != D_801F33CC) { + D_801F3312 = ((D_801F3312 & 0xff) < D_801F33CC) ? (D_801F3312 + 1) : (D_801F3312 - 1); + } + if ((D_801F32F0 & 0xff) != D_801F3311) { + D_801F32F0 = ((D_801F32F0 & 0xff) < D_801F3311) ? (D_801F32F0 + 1) : (D_801F32F0 - 1); + } + D_801F33D0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801F1F30; +extern void *D_801F1F34; +extern void *D_801F1F38; +extern s32 D_801F1F60; +extern s32 D_801F1F64; +extern s32 D_801F1F68; +extern s32 D_801F3344[]; + +extern u8 D_801831B8[]; +extern u8 D_80183260[]; +extern u8 D_80183110[]; +extern u8 D_8018320C[]; +extern u8 D_8018328C[]; +extern u8 D_80183164[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801F1F60 = param_2; + D_801F1F64 = (param_2 >> 2) & 3; + D_801F1F68 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801F1F30 = D_801831B8; + D_801F1F34 = D_80183260; + D_801F1F38 = D_80183110; + } else { + D_801F1F30 = D_8018320C; + D_801F1F34 = D_8018328C; + D_801F1F38 = D_80183164; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801F1F68 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801F1F60 & 2) != 0) { + D_801F3344[0] = 0x140; + D_801F3344[3] = 0x80; + if (p[0x37] == 4) { + D_801F3344[0] = 0x140; + D_801F3344[3] = 0; + } + if (p[0x37] == 0) { + D_801F3344[0] = 0x140; + D_801F3344[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801F1F38)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801F1F38; +extern s16 *D_801F1F3C; +extern s32 D_801F1F4C; +extern s32 D_801F1F6C; +extern s32 D_801F1F70; +extern s32 D_801F1F74; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801F1F3C != 0) { + D_801F1F4C = 0; + p = (int *)(param_1 * 12 + (int)D_801F1F38); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801F1F6C != x) { + flag = 1; + if (D_801F1F6C < x) { + if (x - D_801F1F6C < 5) { + D_801F1F6C = x; + } else { + D_801F1F6C = D_801F1F6C + 4; + } + } else { + if (D_801F1F6C - x < 5) { + D_801F1F6C = x; + } else { + D_801F1F6C = D_801F1F6C - 4; + } + } + } + if (D_801F1F70 != y) { + flag = 1; + if (D_801F1F70 < y) { + if (y - D_801F1F70 < 5) { + D_801F1F70 = y; + } else { + D_801F1F70 = D_801F1F70 + 4; + } + } else { + if (D_801F1F70 - y < 5) { + D_801F1F70 = y; + } else { + D_801F1F70 = D_801F1F70 - 4; + } + } + } + if (D_801F1F74 != z) { + flag = 1; + if (D_801F1F74 < z) { + if (z - D_801F1F74 < 5) { + D_801F1F74 = z; + } else { + D_801F1F74 = D_801F1F74 + 4; + } + } else { + if (D_801F1F74 - z < 5) { + D_801F1F74 = z; + } else { + D_801F1F74 = D_801F1F74 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801F1F4C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018331C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801F1F3C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801F1F6C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801F1F70); + uVar5 = (*(int*)&D_801F1F74); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018331C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801F1F54; + +s32 func_8013E054(void) { + return D_801F1F54; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183D18; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183CF0; +extern s16 D_80183CF2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183D18; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183CF0 = 2; + D_80183CF2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80183CF2 = 0; + D_80183CF0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801F1F88; + extern void * D_801F1F8C; + extern unsigned char D_80183990; + extern unsigned char D_801839A8; + extern unsigned char D_80183A1C; + extern unsigned char D_80183A24; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801F1F88 = &D_80183990; + D_801F1F8C = &D_80183A1C; + } else { + D_801F1F88 = &D_801839A8; + D_801F1F8C = &D_80183A24; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183D18/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183D18 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183D18)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80183CF4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183CF4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183CF4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183CF0; +extern s16 D_80183CF2; +extern unsigned char D_80183CF4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183CF2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183CF0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80183CF2; + if (*r < 3) { + *r = *r + 1; + } + D_80183CF0 = (u16)D_80183CF0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183CF4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80183CF4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183CF4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_074/ov_SC01_074_jr_8012ACE0.c b/src/ov_SC01_074/ov_SC01_074_jr_8012ACE0.c index 545a240fa..71debdae2 100644 --- a/src/ov_SC01_074/ov_SC01_074_jr_8012ACE0.c +++ b/src/ov_SC01_074/ov_SC01_074_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017EBFC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017EBFC[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017EC40; -extern u8 D_8017EC84; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017EC40; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017EC84 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017ECC8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017ED04[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017ED04; - if (((s16)a1) < 0xC00) { - tbl = D_8017ECC8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017ED40, D_8017ED42, D_8017ED44, D_8017ED46, D_8017ED48, D_8017ED4A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017ED42 < ang)) goto outer_else; - if (!(ang < D_8017ED48)) goto inner_else; - if (ang < D_8017ED44) { *(s16 *)L = D_8017ED44; goto done; } - if (D_8017ED46 < ang) { *(s16 *)L = D_8017ED46; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017ED40) { *(s16 *)L = D_8017ED40; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017ED4A < ang) { *(s16 *)L = D_8017ED4A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019A9A8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019A9A8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019A9A8; -extern s8 D_8019A9AC; -extern s8 D_8019A9AD; - -void func_8013C9C4(void * arg0) -{ - D_8019A9A8 = arg0; - D_8019A9AC = 0; - D_8019A9AD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019A9A8; -extern s8 D_8019A9AC; -extern s8 D_8019A9AD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019A9A8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019A9AD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019A9AC)) * 2) + D_8019A9A8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019A9AD = (unsigned char) p[1]; - D_8019A9AC = D_8019A9AC + 1; - if (D_8019A9AD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019A9AC = 0; - *base = 0; - } - } - else - { - D_8019A9AD = c - 1; - } - } - return; -} - - - -extern s32 D_8019A9CC; -extern s32 D_8019A9C0; -extern s32 D_8019A9C4; -extern s32 D_8019A9D0; - -void func_8013CABC(void) { - D_8019A9CC = 1; - D_8019A9C0 = 1; - D_8019A9C4 = 0; - D_8019A9D0 = 1; -} - - - -extern s32 D_8019A9C0; -extern s32 D_8019A9C4; -extern s32 D_8019A9C8; -extern s32 D_8019A9CC; -extern s32 D_8019A9D0; - -void func_8013CAE8(void) { - D_8019A9C0 = 1; - D_8019A9CC = 0; - D_8019A9C4 = 0; - D_8019A9C8 = -1; - D_8019A9D0 = 0; -} - - - -extern s32 D_8019A9CC; -extern s32 D_8019A9D0; -extern s32 D_8019A9F8; -extern s32 D_8019A9FC; - -void func_8013CB20(void) -{ - D_8019A9F8 = D_8019A9D0; - D_8019A9FC = D_8019A9CC; - D_8019A9D0 = 1; - D_8019A9CC = 0; -} - - - -extern s32 D_8019A9F8; -extern s32 D_8019A9FC; -extern s32 D_8019A9D0; -extern s32 D_8019A9CC; - -void func_8013CB5C(void) { - D_8019A9D0 = D_8019A9F8; - D_8019A9CC = D_8019A9FC; -} - - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019BC18; - extern u8 D_8019BC19; - extern u8 D_8019BC1A; - extern u8 D_8019BC1B; - extern u8 D_8019BC1C; - extern u8 D_8019BC1D; - extern u8 D_8019BC1E; - extern u8 D_8019BC1F; - extern u8 D_8019BC20; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019BC18; t1 = D_8019BC19; t2 = D_8019BC1A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019BC1B; t1 = D_8019BC1C; t2 = D_8019BC1D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019BC1E; t1 = D_8019BC1F; t2 = D_8019BC20; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019A9D8; -extern s32 D_8019A9C0; -extern s32 D_8019A9DC; -extern s32 D_8019A9CC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019A9D8 != 0) { - if (D_8019A9D8 != 2) { - if (((D_8019A9D8 < 3) && (D_8019A9D8 == 1)) && - (D_8019A9DC = D_8019A9DC + 1, 0x23a < D_8019A9DC)) { - D_8019A9C0 = D_8019A9D8; - D_8019A9D8 = 2; - } - } else { - D_8019A9C0 = D_8019A9C0 + -1; - if (D_8019A9C0 == 0) { - D_8019A9C0 = D_8019A9D8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019A9CC == 0) { - D_8019A9D8 = D_8019A9D8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019A9CC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019A9CC; -} - - - -extern s32 D_8019A9D8; - -void func_8013D164(void) { - D_8019A9D8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019BCFA; -extern u8 D_8019BD6E; -extern u8 D_8019BC22; -extern u8 D_8019BCDC; -extern u8 D_8019BC00; -extern u8 D_8019BC21; -extern s32 D_8019BCE0; - -void func_8013D330(void) { - if ((D_8019BCFA & 0xff) != D_8019BD6E) { - D_8019BCFA = ((D_8019BCFA & 0xff) < D_8019BD6E) ? (D_8019BCFA + 1) : (D_8019BCFA - 1); - } - if ((D_8019BC22 & 0xff) != D_8019BCDC) { - D_8019BC22 = ((D_8019BC22 & 0xff) < D_8019BCDC) ? (D_8019BC22 + 1) : (D_8019BC22 - 1); - } - if ((D_8019BC00 & 0xff) != D_8019BC21) { - D_8019BC00 = ((D_8019BC00 & 0xff) < D_8019BC21) ? (D_8019BC00 + 1) : (D_8019BC00 - 1); - } - D_8019BCE0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019A9B0; -extern void *D_8019A9B4; -extern void *D_8019A9B8; -extern s32 D_8019A9E0; -extern s32 D_8019A9E4; -extern s32 D_8019A9E8; -extern s32 D_8019BC54[]; - -extern u8 D_8017EE38[]; -extern u8 D_8017EEE0[]; -extern u8 D_8017ED90[]; -extern u8 D_8017EE8C[]; -extern u8 D_8017EF0C[]; -extern u8 D_8017EDE4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019A9E0 = param_2; - D_8019A9E4 = (param_2 >> 2) & 3; - D_8019A9E8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019A9B0 = D_8017EE38; - D_8019A9B4 = D_8017EEE0; - D_8019A9B8 = D_8017ED90; - } else { - D_8019A9B0 = D_8017EE8C; - D_8019A9B4 = D_8017EF0C; - D_8019A9B8 = D_8017EDE4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019A9E8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019A9E0 & 2) != 0) { - D_8019BC54[0] = 0x140; - D_8019BC54[3] = 0x80; - if (p[0x37] == 4) { - D_8019BC54[0] = 0x140; - D_8019BC54[3] = 0; - } - if (p[0x37] == 0) { - D_8019BC54[0] = 0x140; - D_8019BC54[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019A9B8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019A9B8; -extern s16 *D_8019A9BC; -extern s32 D_8019A9CC; -extern s32 D_8019A9EC; -extern s32 D_8019A9F0; -extern s32 D_8019A9F4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019A9BC != 0) { - D_8019A9CC = 0; - p = (int *)(param_1 * 12 + (int)D_8019A9B8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019A9EC != x) { - flag = 1; - if (D_8019A9EC < x) { - if (x - D_8019A9EC < 5) { - D_8019A9EC = x; - } else { - D_8019A9EC = D_8019A9EC + 4; - } - } else { - if (D_8019A9EC - x < 5) { - D_8019A9EC = x; - } else { - D_8019A9EC = D_8019A9EC - 4; - } - } - } - if (D_8019A9F0 != y) { - flag = 1; - if (D_8019A9F0 < y) { - if (y - D_8019A9F0 < 5) { - D_8019A9F0 = y; - } else { - D_8019A9F0 = D_8019A9F0 + 4; - } - } else { - if (D_8019A9F0 - y < 5) { - D_8019A9F0 = y; - } else { - D_8019A9F0 = D_8019A9F0 - 4; - } - } - } - if (D_8019A9F4 != z) { - flag = 1; - if (D_8019A9F4 < z) { - if (z - D_8019A9F4 < 5) { - D_8019A9F4 = z; - } else { - D_8019A9F4 = D_8019A9F4 + 4; - } - } else { - if (D_8019A9F4 - z < 5) { - D_8019A9F4 = z; - } else { - D_8019A9F4 = D_8019A9F4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019A9CC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017EF9C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019A9BC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019A9EC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019A9F0); - uVar5 = (*(int*)&D_8019A9F4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017EF9C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019A9D4; - -s32 func_8013E054(void) { - return D_8019A9D4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F998; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F970; -extern s16 D_8017F972; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F998; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F970 = 2; - D_8017F972 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F972 = 0; - D_8017F970 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019AA08; - extern void * D_8019AA0C; - extern unsigned char D_8017F610; - extern unsigned char D_8017F628; - extern unsigned char D_8017F69C; - extern unsigned char D_8017F6A4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019AA08 = &D_8017F610; - D_8019AA0C = &D_8017F69C; - } else { - D_8019AA08 = &D_8017F628; - D_8019AA0C = &D_8017F6A4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F998/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F998 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F998)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F974; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F974)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F974)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F970; -extern s16 D_8017F972; -extern unsigned char D_8017F974; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F972` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F970` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F972; - if (*r < 3) { - *r = *r + 1; - } - D_8017F970 = (u16)D_8017F970 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F974); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F974; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F974); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_074/ov_SC01_074_jr_801380E0.c b/src/ov_SC01_074/ov_SC01_074_jr_801380E0.c new file mode 100644 index 000000000..7fb2ebcb6 --- /dev/null +++ b/src/ov_SC01_074/ov_SC01_074_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80199750; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E890[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019A8C4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019BD00; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80199750; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E5CC)(); +extern s16 (*D_8017E5D0)(); +extern M2C_UNK (*D_8017E5D8)(); +extern s32 (*D_8017E5DC)(); +extern s32 D_8019A8C0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80199754; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E924; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181E08; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E93C; +extern M2C_UNK D_8017E944; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E94C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E968[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E974[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E988[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E9D8[]; +extern s16 D_8017EA08[]; +extern s16 D_8017EA68[]; +extern s16 D_8017EA70[]; +extern s16 D_8017EA90[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EAC8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017EB20[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017EB68[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017EB70[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017EB78[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017EB80[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017EB28; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017EB48; +extern void func_801321B0(int param_1); +extern int D_8017EB58; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019A930; +extern s32 D_8019A934[]; +extern int D_8019A938; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017EB8C; +extern u8 D_8017EB88; +extern s16 *D_8017EB90; +extern u8 D_8017EB94; +extern int D_8019A930; +extern u16 D_8019A940; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017EB90; /* holds a pointer value (*(u16**)&D_8017EB90) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017EBA4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017EBF8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017EBFC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017EBFC[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017EC40; +extern u8 D_8017EC84; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017EC40; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017EC84 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017ECC8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017ED04[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017ED04; + if (((s16)a1) < 0xC00) { + tbl = D_8017ECC8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017ED40, D_8017ED42, D_8017ED44, D_8017ED46, D_8017ED48, D_8017ED4A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017ED42 < ang)) goto outer_else; + if (!(ang < D_8017ED48)) goto inner_else; + if (ang < D_8017ED44) { *(s16 *)L = D_8017ED44; goto done; } + if (D_8017ED46 < ang) { *(s16 *)L = D_8017ED46; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017ED40) { *(s16 *)L = D_8017ED40; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017ED4A < ang) { *(s16 *)L = D_8017ED4A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019A9A8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019A9A8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019A9A8; +extern s8 D_8019A9AC; +extern s8 D_8019A9AD; + +void func_8013C9C4(void * arg0) +{ + D_8019A9A8 = arg0; + D_8019A9AC = 0; + D_8019A9AD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019A9A8; +extern s8 D_8019A9AC; +extern s8 D_8019A9AD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019A9A8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019A9AD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019A9AC)) * 2) + D_8019A9A8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019A9AD = (unsigned char) p[1]; + D_8019A9AC = D_8019A9AC + 1; + if (D_8019A9AD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019A9AC = 0; + *base = 0; + } + } + else + { + D_8019A9AD = c - 1; + } + } + return; +} + + + +extern s32 D_8019A9CC; +extern s32 D_8019A9C0; +extern s32 D_8019A9C4; +extern s32 D_8019A9D0; + +void func_8013CABC(void) { + D_8019A9CC = 1; + D_8019A9C0 = 1; + D_8019A9C4 = 0; + D_8019A9D0 = 1; +} + + + +extern s32 D_8019A9C0; +extern s32 D_8019A9C4; +extern s32 D_8019A9C8; +extern s32 D_8019A9CC; +extern s32 D_8019A9D0; + +void func_8013CAE8(void) { + D_8019A9C0 = 1; + D_8019A9CC = 0; + D_8019A9C4 = 0; + D_8019A9C8 = -1; + D_8019A9D0 = 0; +} + + + +extern s32 D_8019A9CC; +extern s32 D_8019A9D0; +extern s32 D_8019A9F8; +extern s32 D_8019A9FC; + +void func_8013CB20(void) +{ + D_8019A9F8 = D_8019A9D0; + D_8019A9FC = D_8019A9CC; + D_8019A9D0 = 1; + D_8019A9CC = 0; +} + + + +extern s32 D_8019A9F8; +extern s32 D_8019A9FC; +extern s32 D_8019A9D0; +extern s32 D_8019A9CC; + +void func_8013CB5C(void) { + D_8019A9D0 = D_8019A9F8; + D_8019A9CC = D_8019A9FC; +} + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019BC18; + extern u8 D_8019BC19; + extern u8 D_8019BC1A; + extern u8 D_8019BC1B; + extern u8 D_8019BC1C; + extern u8 D_8019BC1D; + extern u8 D_8019BC1E; + extern u8 D_8019BC1F; + extern u8 D_8019BC20; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019BC18; t1 = D_8019BC19; t2 = D_8019BC1A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019BC1B; t1 = D_8019BC1C; t2 = D_8019BC1D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019BC1E; t1 = D_8019BC1F; t2 = D_8019BC20; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019A9D8; +extern s32 D_8019A9C0; +extern s32 D_8019A9DC; +extern s32 D_8019A9CC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019A9D8 != 0) { + if (D_8019A9D8 != 2) { + if (((D_8019A9D8 < 3) && (D_8019A9D8 == 1)) && + (D_8019A9DC = D_8019A9DC + 1, 0x23a < D_8019A9DC)) { + D_8019A9C0 = D_8019A9D8; + D_8019A9D8 = 2; + } + } else { + D_8019A9C0 = D_8019A9C0 + -1; + if (D_8019A9C0 == 0) { + D_8019A9C0 = D_8019A9D8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019A9CC == 0) { + D_8019A9D8 = D_8019A9D8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019A9CC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019A9CC; +} + + + +extern s32 D_8019A9D8; + +void func_8013D164(void) { + D_8019A9D8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019BCFA; +extern u8 D_8019BD6E; +extern u8 D_8019BC22; +extern u8 D_8019BCDC; +extern u8 D_8019BC00; +extern u8 D_8019BC21; +extern s32 D_8019BCE0; + +void func_8013D330(void) { + if ((D_8019BCFA & 0xff) != D_8019BD6E) { + D_8019BCFA = ((D_8019BCFA & 0xff) < D_8019BD6E) ? (D_8019BCFA + 1) : (D_8019BCFA - 1); + } + if ((D_8019BC22 & 0xff) != D_8019BCDC) { + D_8019BC22 = ((D_8019BC22 & 0xff) < D_8019BCDC) ? (D_8019BC22 + 1) : (D_8019BC22 - 1); + } + if ((D_8019BC00 & 0xff) != D_8019BC21) { + D_8019BC00 = ((D_8019BC00 & 0xff) < D_8019BC21) ? (D_8019BC00 + 1) : (D_8019BC00 - 1); + } + D_8019BCE0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019A9B0; +extern void *D_8019A9B4; +extern void *D_8019A9B8; +extern s32 D_8019A9E0; +extern s32 D_8019A9E4; +extern s32 D_8019A9E8; +extern s32 D_8019BC54[]; + +extern u8 D_8017EE38[]; +extern u8 D_8017EEE0[]; +extern u8 D_8017ED90[]; +extern u8 D_8017EE8C[]; +extern u8 D_8017EF0C[]; +extern u8 D_8017EDE4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019A9E0 = param_2; + D_8019A9E4 = (param_2 >> 2) & 3; + D_8019A9E8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019A9B0 = D_8017EE38; + D_8019A9B4 = D_8017EEE0; + D_8019A9B8 = D_8017ED90; + } else { + D_8019A9B0 = D_8017EE8C; + D_8019A9B4 = D_8017EF0C; + D_8019A9B8 = D_8017EDE4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019A9E8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019A9E0 & 2) != 0) { + D_8019BC54[0] = 0x140; + D_8019BC54[3] = 0x80; + if (p[0x37] == 4) { + D_8019BC54[0] = 0x140; + D_8019BC54[3] = 0; + } + if (p[0x37] == 0) { + D_8019BC54[0] = 0x140; + D_8019BC54[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019A9B8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019A9B8; +extern s16 *D_8019A9BC; +extern s32 D_8019A9CC; +extern s32 D_8019A9EC; +extern s32 D_8019A9F0; +extern s32 D_8019A9F4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019A9BC != 0) { + D_8019A9CC = 0; + p = (int *)(param_1 * 12 + (int)D_8019A9B8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019A9EC != x) { + flag = 1; + if (D_8019A9EC < x) { + if (x - D_8019A9EC < 5) { + D_8019A9EC = x; + } else { + D_8019A9EC = D_8019A9EC + 4; + } + } else { + if (D_8019A9EC - x < 5) { + D_8019A9EC = x; + } else { + D_8019A9EC = D_8019A9EC - 4; + } + } + } + if (D_8019A9F0 != y) { + flag = 1; + if (D_8019A9F0 < y) { + if (y - D_8019A9F0 < 5) { + D_8019A9F0 = y; + } else { + D_8019A9F0 = D_8019A9F0 + 4; + } + } else { + if (D_8019A9F0 - y < 5) { + D_8019A9F0 = y; + } else { + D_8019A9F0 = D_8019A9F0 - 4; + } + } + } + if (D_8019A9F4 != z) { + flag = 1; + if (D_8019A9F4 < z) { + if (z - D_8019A9F4 < 5) { + D_8019A9F4 = z; + } else { + D_8019A9F4 = D_8019A9F4 + 4; + } + } else { + if (D_8019A9F4 - z < 5) { + D_8019A9F4 = z; + } else { + D_8019A9F4 = D_8019A9F4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019A9CC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017EF9C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019A9BC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019A9EC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019A9F0); + uVar5 = (*(int*)&D_8019A9F4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017EF9C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019A9D4; + +s32 func_8013E054(void) { + return D_8019A9D4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F998; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F970; +extern s16 D_8017F972; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F998; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F970 = 2; + D_8017F972 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F972 = 0; + D_8017F970 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019AA08; + extern void * D_8019AA0C; + extern unsigned char D_8017F610; + extern unsigned char D_8017F628; + extern unsigned char D_8017F69C; + extern unsigned char D_8017F6A4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019AA08 = &D_8017F610; + D_8019AA0C = &D_8017F69C; + } else { + D_8019AA08 = &D_8017F628; + D_8019AA0C = &D_8017F6A4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F998/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F998 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F998)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F974; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F974)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F974)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F970; +extern s16 D_8017F972; +extern unsigned char D_8017F974; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F972` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F970` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F972; + if (*r < 3) { + *r = *r + 1; + } + D_8017F970 = (u16)D_8017F970 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F974); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F974; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F974); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_074/nonmatchings/ov_SC01_074_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_080/ov_SC01_080_jr_8012ACE0.c b/src/ov_SC01_080/ov_SC01_080_jr_8012ACE0.c index 8ecf029bb..f1c84b272 100644 --- a/src/ov_SC01_080/ov_SC01_080_jr_8012ACE0.c +++ b/src/ov_SC01_080/ov_SC01_080_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80183B5C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80183B5C[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80183BA0; -extern u8 D_80183BE4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80183BA0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183BE4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183C28[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183C64[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183C64; - if (((s16)a1) < 0xC00) { - tbl = D_80183C28; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80183CA0, D_80183CA2, D_80183CA4, D_80183CA6, D_80183CA8, D_80183CAA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80183CA2 < ang)) goto outer_else; - if (!(ang < D_80183CA8)) goto inner_else; - if (ang < D_80183CA4) { *(s16 *)L = D_80183CA4; goto done; } - if (D_80183CA6 < ang) { *(s16 *)L = D_80183CA6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80183CA0) { *(s16 *)L = D_80183CA0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80183CAA < ang) { *(s16 *)L = D_80183CAA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C47D8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C47D8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C47D8; -extern s8 D_801C47DC; -extern s8 D_801C47DD; - -void func_8013C9C4(void * arg0) -{ - D_801C47D8 = arg0; - D_801C47DC = 0; - D_801C47DD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C47D8; -extern s8 D_801C47DC; -extern s8 D_801C47DD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C47D8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C47DD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C47DC)) * 2) + D_801C47D8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C47DD = (unsigned char) p[1]; - D_801C47DC = D_801C47DC + 1; - if (D_801C47DD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C47DC = 0; - *base = 0; - } - } - else - { - D_801C47DD = c - 1; - } - } - return; -} - - - -extern s32 D_801C47FC; -extern s32 D_801C47F0; -extern s32 D_801C47F4; -extern s32 D_801C4800; - -void func_8013CABC(void) { - D_801C47FC = 1; - D_801C47F0 = 1; - D_801C47F4 = 0; - D_801C4800 = 1; -} - - - -extern s32 D_801C47F0; -extern s32 D_801C47F4; -extern s32 D_801C47F8; -extern s32 D_801C47FC; -extern s32 D_801C4800; - -void func_8013CAE8(void) { - D_801C47F0 = 1; - D_801C47FC = 0; - D_801C47F4 = 0; - D_801C47F8 = -1; - D_801C4800 = 0; -} - - - -extern s32 D_801C47FC; -extern s32 D_801C4800; -extern s32 D_801C4828; -extern s32 D_801C482C; - -void func_8013CB20(void) -{ - D_801C4828 = D_801C4800; - D_801C482C = D_801C47FC; - D_801C4800 = 1; - D_801C47FC = 0; -} - - - -extern s32 D_801C4828; -extern s32 D_801C482C; -extern s32 D_801C4800; -extern s32 D_801C47FC; - -void func_8013CB5C(void) { - D_801C4800 = D_801C4828; - D_801C47FC = D_801C482C; -} - - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C75F0; - extern u8 D_801C75F1; - extern u8 D_801C75F2; - extern u8 D_801C75F3; - extern u8 D_801C75F4; - extern u8 D_801C75F5; - extern u8 D_801C75F6; - extern u8 D_801C75F7; - extern u8 D_801C75F8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C75F0; t1 = D_801C75F1; t2 = D_801C75F2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C75F3; t1 = D_801C75F4; t2 = D_801C75F5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C75F6; t1 = D_801C75F7; t2 = D_801C75F8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C4808; -extern s32 D_801C47F0; -extern s32 D_801C480C; -extern s32 D_801C47FC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C4808 != 0) { - if (D_801C4808 != 2) { - if (((D_801C4808 < 3) && (D_801C4808 == 1)) && - (D_801C480C = D_801C480C + 1, 0x23a < D_801C480C)) { - D_801C47F0 = D_801C4808; - D_801C4808 = 2; - } - } else { - D_801C47F0 = D_801C47F0 + -1; - if (D_801C47F0 == 0) { - D_801C47F0 = D_801C4808; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C47FC == 0) { - D_801C4808 = D_801C4808 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C47FC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C47FC; -} - - - -extern s32 D_801C4808; - -void func_8013D164(void) { - D_801C4808 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C7EDE; -extern u8 D_801C7F4E; -extern u8 D_801C7E00; -extern u8 D_801C7EBC; -extern u8 D_801C75D8; -extern u8 D_801C75F9; -extern s32 D_801C7EC4; - -void func_8013D330(void) { - if ((D_801C7EDE & 0xff) != D_801C7F4E) { - D_801C7EDE = ((D_801C7EDE & 0xff) < D_801C7F4E) ? (D_801C7EDE + 1) : (D_801C7EDE - 1); - } - if ((D_801C7E00 & 0xff) != D_801C7EBC) { - D_801C7E00 = ((D_801C7E00 & 0xff) < D_801C7EBC) ? (D_801C7E00 + 1) : (D_801C7E00 - 1); - } - if ((D_801C75D8 & 0xff) != D_801C75F9) { - D_801C75D8 = ((D_801C75D8 & 0xff) < D_801C75F9) ? (D_801C75D8 + 1) : (D_801C75D8 - 1); - } - D_801C7EC4 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C47E0; -extern void *D_801C47E4; -extern void *D_801C47E8; -extern s32 D_801C4810; -extern s32 D_801C4814; -extern s32 D_801C4818; -extern s32 D_801C7E34[]; - -extern u8 D_80183D98[]; -extern u8 D_80183E40[]; -extern u8 D_80183CF0[]; -extern u8 D_80183DEC[]; -extern u8 D_80183E6C[]; -extern u8 D_80183D44[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C4810 = param_2; - D_801C4814 = (param_2 >> 2) & 3; - D_801C4818 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C47E0 = D_80183D98; - D_801C47E4 = D_80183E40; - D_801C47E8 = D_80183CF0; - } else { - D_801C47E0 = D_80183DEC; - D_801C47E4 = D_80183E6C; - D_801C47E8 = D_80183D44; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C4818 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C4810 & 2) != 0) { - D_801C7E34[0] = 0x140; - D_801C7E34[3] = 0x80; - if (p[0x37] == 4) { - D_801C7E34[0] = 0x140; - D_801C7E34[3] = 0; - } - if (p[0x37] == 0) { - D_801C7E34[0] = 0x140; - D_801C7E34[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C47E8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C47E8; -extern s16 *D_801C47EC; -extern s32 D_801C47FC; -extern s32 D_801C481C; -extern s32 D_801C4820; -extern s32 D_801C4824; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C47EC != 0) { - D_801C47FC = 0; - p = (int *)(param_1 * 12 + (int)D_801C47E8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C481C != x) { - flag = 1; - if (D_801C481C < x) { - if (x - D_801C481C < 5) { - D_801C481C = x; - } else { - D_801C481C = D_801C481C + 4; - } - } else { - if (D_801C481C - x < 5) { - D_801C481C = x; - } else { - D_801C481C = D_801C481C - 4; - } - } - } - if (D_801C4820 != y) { - flag = 1; - if (D_801C4820 < y) { - if (y - D_801C4820 < 5) { - D_801C4820 = y; - } else { - D_801C4820 = D_801C4820 + 4; - } - } else { - if (D_801C4820 - y < 5) { - D_801C4820 = y; - } else { - D_801C4820 = D_801C4820 - 4; - } - } - } - if (D_801C4824 != z) { - flag = 1; - if (D_801C4824 < z) { - if (z - D_801C4824 < 5) { - D_801C4824 = z; - } else { - D_801C4824 = D_801C4824 + 4; - } - } else { - if (D_801C4824 - z < 5) { - D_801C4824 = z; - } else { - D_801C4824 = D_801C4824 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C47FC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183EFC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C47EC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C481C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C4820); - uVar5 = (*(int*)&D_801C4824); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183EFC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C4804; - -s32 func_8013E054(void) { - return D_801C4804; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801848F8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801848D0; -extern s16 D_801848D2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801848F8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801848D0 = 2; - D_801848D2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801848D2 = 0; - D_801848D0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C4838; - extern void * D_801C483C; - extern unsigned char D_80184570; - extern unsigned char D_80184588; - extern unsigned char D_801845FC; - extern unsigned char D_80184604; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C4838 = &D_80184570; - D_801C483C = &D_801845FC; - } else { - D_801C4838 = &D_80184588; - D_801C483C = &D_80184604; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801848F8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801848F8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801848F8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801848D4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801848D4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801848D4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801848D0; -extern s16 D_801848D2; -extern unsigned char D_801848D4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801848D2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801848D0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801848D2; - if (*r < 3) { - *r = *r + 1; - } - D_801848D0 = (u16)D_801848D0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801848D4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801848D4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801848D4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_080/ov_SC01_080_jr_801380E0.c b/src/ov_SC01_080/ov_SC01_080_jr_801380E0.c new file mode 100644 index 000000000..8a92b63db --- /dev/null +++ b/src/ov_SC01_080/ov_SC01_080_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C3570; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801837F0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C46F4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C7EE0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C3570; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018352C)(); +extern s16 (*D_80183530)(); +extern M2C_UNK (*D_80183538)(); +extern s32 (*D_8018353C)(); +extern s32 D_801C46F0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C3574; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80183884; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80186D68; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018389C; +extern M2C_UNK D_801838A4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801838AC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801838C8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801838D4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801838E8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183938[]; +extern s16 D_80183968[]; +extern s16 D_801839C8[]; +extern s16 D_801839D0[]; +extern s16 D_801839F0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80183A28[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80183A80[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80183AC8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80183AD0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80183AD8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80183AE0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80183A88; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80183AA8; +extern void func_801321B0(int param_1); +extern int D_80183AB8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C4760; +extern s32 D_801C4764[]; +extern int D_801C4768; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80183AEC; +extern u8 D_80183AE8; +extern s16 *D_80183AF0; +extern u8 D_80183AF4; +extern int D_801C4760; +extern u16 D_801C4770; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80183AF0; /* holds a pointer value (*(u16**)&D_80183AF0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80183B04[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80183B58; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80183B5C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80183B5C[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80183BA0; +extern u8 D_80183BE4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80183BA0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183BE4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183C28[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183C64[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183C64; + if (((s16)a1) < 0xC00) { + tbl = D_80183C28; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80183CA0, D_80183CA2, D_80183CA4, D_80183CA6, D_80183CA8, D_80183CAA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183CA2 < ang)) goto outer_else; + if (!(ang < D_80183CA8)) goto inner_else; + if (ang < D_80183CA4) { *(s16 *)L = D_80183CA4; goto done; } + if (D_80183CA6 < ang) { *(s16 *)L = D_80183CA6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183CA0) { *(s16 *)L = D_80183CA0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183CAA < ang) { *(s16 *)L = D_80183CAA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C47D8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C47D8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C47D8; +extern s8 D_801C47DC; +extern s8 D_801C47DD; + +void func_8013C9C4(void * arg0) +{ + D_801C47D8 = arg0; + D_801C47DC = 0; + D_801C47DD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C47D8; +extern s8 D_801C47DC; +extern s8 D_801C47DD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C47D8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C47DD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C47DC)) * 2) + D_801C47D8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C47DD = (unsigned char) p[1]; + D_801C47DC = D_801C47DC + 1; + if (D_801C47DD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C47DC = 0; + *base = 0; + } + } + else + { + D_801C47DD = c - 1; + } + } + return; +} + + + +extern s32 D_801C47FC; +extern s32 D_801C47F0; +extern s32 D_801C47F4; +extern s32 D_801C4800; + +void func_8013CABC(void) { + D_801C47FC = 1; + D_801C47F0 = 1; + D_801C47F4 = 0; + D_801C4800 = 1; +} + + + +extern s32 D_801C47F0; +extern s32 D_801C47F4; +extern s32 D_801C47F8; +extern s32 D_801C47FC; +extern s32 D_801C4800; + +void func_8013CAE8(void) { + D_801C47F0 = 1; + D_801C47FC = 0; + D_801C47F4 = 0; + D_801C47F8 = -1; + D_801C4800 = 0; +} + + + +extern s32 D_801C47FC; +extern s32 D_801C4800; +extern s32 D_801C4828; +extern s32 D_801C482C; + +void func_8013CB20(void) +{ + D_801C4828 = D_801C4800; + D_801C482C = D_801C47FC; + D_801C4800 = 1; + D_801C47FC = 0; +} + + + +extern s32 D_801C4828; +extern s32 D_801C482C; +extern s32 D_801C4800; +extern s32 D_801C47FC; + +void func_8013CB5C(void) { + D_801C4800 = D_801C4828; + D_801C47FC = D_801C482C; +} + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C75F0; + extern u8 D_801C75F1; + extern u8 D_801C75F2; + extern u8 D_801C75F3; + extern u8 D_801C75F4; + extern u8 D_801C75F5; + extern u8 D_801C75F6; + extern u8 D_801C75F7; + extern u8 D_801C75F8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C75F0; t1 = D_801C75F1; t2 = D_801C75F2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C75F3; t1 = D_801C75F4; t2 = D_801C75F5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C75F6; t1 = D_801C75F7; t2 = D_801C75F8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C4808; +extern s32 D_801C47F0; +extern s32 D_801C480C; +extern s32 D_801C47FC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C4808 != 0) { + if (D_801C4808 != 2) { + if (((D_801C4808 < 3) && (D_801C4808 == 1)) && + (D_801C480C = D_801C480C + 1, 0x23a < D_801C480C)) { + D_801C47F0 = D_801C4808; + D_801C4808 = 2; + } + } else { + D_801C47F0 = D_801C47F0 + -1; + if (D_801C47F0 == 0) { + D_801C47F0 = D_801C4808; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C47FC == 0) { + D_801C4808 = D_801C4808 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C47FC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C47FC; +} + + + +extern s32 D_801C4808; + +void func_8013D164(void) { + D_801C4808 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C7EDE; +extern u8 D_801C7F4E; +extern u8 D_801C7E00; +extern u8 D_801C7EBC; +extern u8 D_801C75D8; +extern u8 D_801C75F9; +extern s32 D_801C7EC4; + +void func_8013D330(void) { + if ((D_801C7EDE & 0xff) != D_801C7F4E) { + D_801C7EDE = ((D_801C7EDE & 0xff) < D_801C7F4E) ? (D_801C7EDE + 1) : (D_801C7EDE - 1); + } + if ((D_801C7E00 & 0xff) != D_801C7EBC) { + D_801C7E00 = ((D_801C7E00 & 0xff) < D_801C7EBC) ? (D_801C7E00 + 1) : (D_801C7E00 - 1); + } + if ((D_801C75D8 & 0xff) != D_801C75F9) { + D_801C75D8 = ((D_801C75D8 & 0xff) < D_801C75F9) ? (D_801C75D8 + 1) : (D_801C75D8 - 1); + } + D_801C7EC4 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C47E0; +extern void *D_801C47E4; +extern void *D_801C47E8; +extern s32 D_801C4810; +extern s32 D_801C4814; +extern s32 D_801C4818; +extern s32 D_801C7E34[]; + +extern u8 D_80183D98[]; +extern u8 D_80183E40[]; +extern u8 D_80183CF0[]; +extern u8 D_80183DEC[]; +extern u8 D_80183E6C[]; +extern u8 D_80183D44[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C4810 = param_2; + D_801C4814 = (param_2 >> 2) & 3; + D_801C4818 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C47E0 = D_80183D98; + D_801C47E4 = D_80183E40; + D_801C47E8 = D_80183CF0; + } else { + D_801C47E0 = D_80183DEC; + D_801C47E4 = D_80183E6C; + D_801C47E8 = D_80183D44; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C4818 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C4810 & 2) != 0) { + D_801C7E34[0] = 0x140; + D_801C7E34[3] = 0x80; + if (p[0x37] == 4) { + D_801C7E34[0] = 0x140; + D_801C7E34[3] = 0; + } + if (p[0x37] == 0) { + D_801C7E34[0] = 0x140; + D_801C7E34[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C47E8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C47E8; +extern s16 *D_801C47EC; +extern s32 D_801C47FC; +extern s32 D_801C481C; +extern s32 D_801C4820; +extern s32 D_801C4824; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C47EC != 0) { + D_801C47FC = 0; + p = (int *)(param_1 * 12 + (int)D_801C47E8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C481C != x) { + flag = 1; + if (D_801C481C < x) { + if (x - D_801C481C < 5) { + D_801C481C = x; + } else { + D_801C481C = D_801C481C + 4; + } + } else { + if (D_801C481C - x < 5) { + D_801C481C = x; + } else { + D_801C481C = D_801C481C - 4; + } + } + } + if (D_801C4820 != y) { + flag = 1; + if (D_801C4820 < y) { + if (y - D_801C4820 < 5) { + D_801C4820 = y; + } else { + D_801C4820 = D_801C4820 + 4; + } + } else { + if (D_801C4820 - y < 5) { + D_801C4820 = y; + } else { + D_801C4820 = D_801C4820 - 4; + } + } + } + if (D_801C4824 != z) { + flag = 1; + if (D_801C4824 < z) { + if (z - D_801C4824 < 5) { + D_801C4824 = z; + } else { + D_801C4824 = D_801C4824 + 4; + } + } else { + if (D_801C4824 - z < 5) { + D_801C4824 = z; + } else { + D_801C4824 = D_801C4824 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C47FC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183EFC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C47EC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C481C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C4820); + uVar5 = (*(int*)&D_801C4824); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183EFC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C4804; + +s32 func_8013E054(void) { + return D_801C4804; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801848F8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801848D0; +extern s16 D_801848D2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801848F8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801848D0 = 2; + D_801848D2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801848D2 = 0; + D_801848D0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C4838; + extern void * D_801C483C; + extern unsigned char D_80184570; + extern unsigned char D_80184588; + extern unsigned char D_801845FC; + extern unsigned char D_80184604; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C4838 = &D_80184570; + D_801C483C = &D_801845FC; + } else { + D_801C4838 = &D_80184588; + D_801C483C = &D_80184604; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801848F8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801848F8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801848F8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801848D4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801848D4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801848D4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801848D0; +extern s16 D_801848D2; +extern unsigned char D_801848D4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801848D2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801848D0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801848D2; + if (*r < 3) { + *r = *r + 1; + } + D_801848D0 = (u16)D_801848D0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801848D4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801848D4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801848D4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC01_084/ov_SC01_084_jr_8012ACE0.c b/src/ov_SC01_084/ov_SC01_084_jr_8012ACE0.c index 2b4f6e0a1..aeed59f1c 100644 --- a/src/ov_SC01_084/ov_SC01_084_jr_8012ACE0.c +++ b/src/ov_SC01_084/ov_SC01_084_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186E50[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186E50[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80186E94; -extern u8 D_80186ED8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80186E94; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80186ED8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80186F1C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80186F58[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80186F58; - if (((s16)a1) < 0xC00) { - tbl = D_80186F1C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80186F94, D_80186F96, D_80186F98, D_80186F9A, D_80186F9C, D_80186F9E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80186F96 < ang)) goto outer_else; - if (!(ang < D_80186F9C)) goto inner_else; - if (ang < D_80186F98) { *(s16 *)L = D_80186F98; goto done; } - if (D_80186F9A < ang) { *(s16 *)L = D_80186F9A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80186F94) { *(s16 *)L = D_80186F94; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80186F9E < ang) { *(s16 *)L = D_80186F9E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C6280; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C6280, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C6280; -extern s8 D_801C6284; -extern s8 D_801C6285; - -void func_8013C9C4(void * arg0) -{ - D_801C6280 = arg0; - D_801C6284 = 0; - D_801C6285 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C6280; -extern s8 D_801C6284; -extern s8 D_801C6285; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C6280; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C6285; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C6284)) * 2) + D_801C6280); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C6285 = (unsigned char) p[1]; - D_801C6284 = D_801C6284 + 1; - if (D_801C6285 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C6284 = 0; - *base = 0; - } - } - else - { - D_801C6285 = c - 1; - } - } - return; -} - - - -extern s32 D_801C62A4; -extern s32 D_801C6298; -extern s32 D_801C629C; -extern s32 D_801C62A8; - -void func_8013CABC(void) { - D_801C62A4 = 1; - D_801C6298 = 1; - D_801C629C = 0; - D_801C62A8 = 1; -} - - - -extern s32 D_801C6298; -extern s32 D_801C629C; -extern s32 D_801C62A0; -extern s32 D_801C62A4; -extern s32 D_801C62A8; - -void func_8013CAE8(void) { - D_801C6298 = 1; - D_801C62A4 = 0; - D_801C629C = 0; - D_801C62A0 = -1; - D_801C62A8 = 0; -} - - - -extern s32 D_801C62A4; -extern s32 D_801C62A8; -extern s32 D_801C62D0; -extern s32 D_801C62D4; - -void func_8013CB20(void) -{ - D_801C62D0 = D_801C62A8; - D_801C62D4 = D_801C62A4; - D_801C62A8 = 1; - D_801C62A4 = 0; -} - - - -extern s32 D_801C62D0; -extern s32 D_801C62D4; -extern s32 D_801C62A8; -extern s32 D_801C62A4; - -void func_8013CB5C(void) { - D_801C62A8 = D_801C62D0; - D_801C62A4 = D_801C62D4; -} - - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C7758; - extern u8 D_801C7759; - extern u8 D_801C775A; - extern u8 D_801C775B; - extern u8 D_801C775C; - extern u8 D_801C775D; - extern u8 D_801C775E; - extern u8 D_801C775F; - extern u8 D_801C7760; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C7758; t1 = D_801C7759; t2 = D_801C775A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C775B; t1 = D_801C775C; t2 = D_801C775D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C775E; t1 = D_801C775F; t2 = D_801C7760; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C62B0; -extern s32 D_801C6298; -extern s32 D_801C62B4; -extern s32 D_801C62A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C62B0 != 0) { - if (D_801C62B0 != 2) { - if (((D_801C62B0 < 3) && (D_801C62B0 == 1)) && - (D_801C62B4 = D_801C62B4 + 1, 0x23a < D_801C62B4)) { - D_801C6298 = D_801C62B0; - D_801C62B0 = 2; - } - } else { - D_801C6298 = D_801C6298 + -1; - if (D_801C6298 == 0) { - D_801C6298 = D_801C62B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C62A4 == 0) { - D_801C62B0 = D_801C62B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C62A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C62A4; -} - - - -extern s32 D_801C62B0; - -void func_8013D164(void) { - D_801C62B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C7ABA; -extern u8 D_801C7BF6; -extern u8 D_801C7762; -extern u8 D_801C781C; -extern u8 D_801C7730; -extern u8 D_801C7761; -extern s32 D_801C7820; - -void func_8013D330(void) { - if ((D_801C7ABA & 0xff) != D_801C7BF6) { - D_801C7ABA = ((D_801C7ABA & 0xff) < D_801C7BF6) ? (D_801C7ABA + 1) : (D_801C7ABA - 1); - } - if ((D_801C7762 & 0xff) != D_801C781C) { - D_801C7762 = ((D_801C7762 & 0xff) < D_801C781C) ? (D_801C7762 + 1) : (D_801C7762 - 1); - } - if ((D_801C7730 & 0xff) != D_801C7761) { - D_801C7730 = ((D_801C7730 & 0xff) < D_801C7761) ? (D_801C7730 + 1) : (D_801C7730 - 1); - } - D_801C7820 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C6288; -extern void *D_801C628C; -extern void *D_801C6290; -extern s32 D_801C62B8; -extern s32 D_801C62BC; -extern s32 D_801C62C0; -extern s32 D_801C7794[]; - -extern u8 D_8018708C[]; -extern u8 D_80187134[]; -extern u8 D_80186FE4[]; -extern u8 D_801870E0[]; -extern u8 D_80187160[]; -extern u8 D_80187038[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C62B8 = param_2; - D_801C62BC = (param_2 >> 2) & 3; - D_801C62C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C6288 = D_8018708C; - D_801C628C = D_80187134; - D_801C6290 = D_80186FE4; - } else { - D_801C6288 = D_801870E0; - D_801C628C = D_80187160; - D_801C6290 = D_80187038; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C62C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C62B8 & 2) != 0) { - D_801C7794[0] = 0x140; - D_801C7794[3] = 0x80; - if (p[0x37] == 4) { - D_801C7794[0] = 0x140; - D_801C7794[3] = 0; - } - if (p[0x37] == 0) { - D_801C7794[0] = 0x140; - D_801C7794[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C6290)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C6290; -extern s16 *D_801C6294; -extern s32 D_801C62A4; -extern s32 D_801C62C4; -extern s32 D_801C62C8; -extern s32 D_801C62CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C6294 != 0) { - D_801C62A4 = 0; - p = (int *)(param_1 * 12 + (int)D_801C6290); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C62C4 != x) { - flag = 1; - if (D_801C62C4 < x) { - if (x - D_801C62C4 < 5) { - D_801C62C4 = x; - } else { - D_801C62C4 = D_801C62C4 + 4; - } - } else { - if (D_801C62C4 - x < 5) { - D_801C62C4 = x; - } else { - D_801C62C4 = D_801C62C4 - 4; - } - } - } - if (D_801C62C8 != y) { - flag = 1; - if (D_801C62C8 < y) { - if (y - D_801C62C8 < 5) { - D_801C62C8 = y; - } else { - D_801C62C8 = D_801C62C8 + 4; - } - } else { - if (D_801C62C8 - y < 5) { - D_801C62C8 = y; - } else { - D_801C62C8 = D_801C62C8 - 4; - } - } - } - if (D_801C62CC != z) { - flag = 1; - if (D_801C62CC < z) { - if (z - D_801C62CC < 5) { - D_801C62CC = z; - } else { - D_801C62CC = D_801C62CC + 4; - } - } else { - if (D_801C62CC - z < 5) { - D_801C62CC = z; - } else { - D_801C62CC = D_801C62CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C62A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801871F0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C6294); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C62C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C62C8); - uVar5 = (*(int*)&D_801C62CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801871F0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C62AC; - -s32 func_8013E054(void) { - return D_801C62AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187BEC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80187BC4; -extern s16 D_80187BC6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187BEC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80187BC4 = 2; - D_80187BC6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80187BC6 = 0; - D_80187BC4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C62E0; - extern void * D_801C62E4; - extern unsigned char D_80187864; - extern unsigned char D_8018787C; - extern unsigned char D_801878F0; - extern unsigned char D_801878F8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C62E0 = &D_80187864; - D_801C62E4 = &D_801878F0; - } else { - D_801C62E0 = &D_8018787C; - D_801C62E4 = &D_801878F8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187BEC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187BEC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187BEC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187BC8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187BC8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187BC8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80187BC4; -extern s16 D_80187BC6; -extern unsigned char D_80187BC8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187BC6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80187BC4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80187BC6; - if (*r < 3) { - *r = *r + 1; - } - D_80187BC4 = (u16)D_80187BC4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187BC8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187BC8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187BC8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC01_084/ov_SC01_084_jr_801380E0.c b/src/ov_SC01_084/ov_SC01_084_jr_801380E0.c new file mode 100644 index 000000000..24247b174 --- /dev/null +++ b/src/ov_SC01_084/ov_SC01_084_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C4F40; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186AE4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C619C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C7B88; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C4F40; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80186820)(); +extern s16 (*D_80186824)(); +extern M2C_UNK (*D_8018682C)(); +extern s32 (*D_80186830)(); +extern s32 D_801C6198; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C4F44; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186B78; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018A05C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80186B90; +extern M2C_UNK D_80186B98; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80186BA0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186BBC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186BC8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186BDC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186C2C[]; +extern s16 D_80186C5C[]; +extern s16 D_80186CBC[]; +extern s16 D_80186CC4[]; +extern s16 D_80186CE4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80186D1C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80186D74[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80186DBC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186DC4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186DCC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186DD4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80186D7C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80186D9C; +extern void func_801321B0(int param_1); +extern int D_80186DAC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C6208; +extern s32 D_801C620C[]; +extern int D_801C6210; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186DE0; +extern u8 D_80186DDC; +extern s16 *D_80186DE4; +extern u8 D_80186DE8; +extern int D_801C6208; +extern u16 D_801C6218; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186DE4; /* holds a pointer value (*(u16**)&D_80186DE4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186DF8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186E4C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186E50[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186E50[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80186E94; +extern u8 D_80186ED8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80186E94; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80186ED8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80186F1C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80186F58[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80186F58; + if (((s16)a1) < 0xC00) { + tbl = D_80186F1C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80186F94, D_80186F96, D_80186F98, D_80186F9A, D_80186F9C, D_80186F9E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186F96 < ang)) goto outer_else; + if (!(ang < D_80186F9C)) goto inner_else; + if (ang < D_80186F98) { *(s16 *)L = D_80186F98; goto done; } + if (D_80186F9A < ang) { *(s16 *)L = D_80186F9A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186F94) { *(s16 *)L = D_80186F94; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80186F9E < ang) { *(s16 *)L = D_80186F9E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C6280; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C6280, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C6280; +extern s8 D_801C6284; +extern s8 D_801C6285; + +void func_8013C9C4(void * arg0) +{ + D_801C6280 = arg0; + D_801C6284 = 0; + D_801C6285 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C6280; +extern s8 D_801C6284; +extern s8 D_801C6285; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C6280; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C6285; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C6284)) * 2) + D_801C6280); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C6285 = (unsigned char) p[1]; + D_801C6284 = D_801C6284 + 1; + if (D_801C6285 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C6284 = 0; + *base = 0; + } + } + else + { + D_801C6285 = c - 1; + } + } + return; +} + + + +extern s32 D_801C62A4; +extern s32 D_801C6298; +extern s32 D_801C629C; +extern s32 D_801C62A8; + +void func_8013CABC(void) { + D_801C62A4 = 1; + D_801C6298 = 1; + D_801C629C = 0; + D_801C62A8 = 1; +} + + + +extern s32 D_801C6298; +extern s32 D_801C629C; +extern s32 D_801C62A0; +extern s32 D_801C62A4; +extern s32 D_801C62A8; + +void func_8013CAE8(void) { + D_801C6298 = 1; + D_801C62A4 = 0; + D_801C629C = 0; + D_801C62A0 = -1; + D_801C62A8 = 0; +} + + + +extern s32 D_801C62A4; +extern s32 D_801C62A8; +extern s32 D_801C62D0; +extern s32 D_801C62D4; + +void func_8013CB20(void) +{ + D_801C62D0 = D_801C62A8; + D_801C62D4 = D_801C62A4; + D_801C62A8 = 1; + D_801C62A4 = 0; +} + + + +extern s32 D_801C62D0; +extern s32 D_801C62D4; +extern s32 D_801C62A8; +extern s32 D_801C62A4; + +void func_8013CB5C(void) { + D_801C62A8 = D_801C62D0; + D_801C62A4 = D_801C62D4; +} + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C7758; + extern u8 D_801C7759; + extern u8 D_801C775A; + extern u8 D_801C775B; + extern u8 D_801C775C; + extern u8 D_801C775D; + extern u8 D_801C775E; + extern u8 D_801C775F; + extern u8 D_801C7760; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C7758; t1 = D_801C7759; t2 = D_801C775A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C775B; t1 = D_801C775C; t2 = D_801C775D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C775E; t1 = D_801C775F; t2 = D_801C7760; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C62B0; +extern s32 D_801C6298; +extern s32 D_801C62B4; +extern s32 D_801C62A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C62B0 != 0) { + if (D_801C62B0 != 2) { + if (((D_801C62B0 < 3) && (D_801C62B0 == 1)) && + (D_801C62B4 = D_801C62B4 + 1, 0x23a < D_801C62B4)) { + D_801C6298 = D_801C62B0; + D_801C62B0 = 2; + } + } else { + D_801C6298 = D_801C6298 + -1; + if (D_801C6298 == 0) { + D_801C6298 = D_801C62B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C62A4 == 0) { + D_801C62B0 = D_801C62B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C62A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C62A4; +} + + + +extern s32 D_801C62B0; + +void func_8013D164(void) { + D_801C62B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C7ABA; +extern u8 D_801C7BF6; +extern u8 D_801C7762; +extern u8 D_801C781C; +extern u8 D_801C7730; +extern u8 D_801C7761; +extern s32 D_801C7820; + +void func_8013D330(void) { + if ((D_801C7ABA & 0xff) != D_801C7BF6) { + D_801C7ABA = ((D_801C7ABA & 0xff) < D_801C7BF6) ? (D_801C7ABA + 1) : (D_801C7ABA - 1); + } + if ((D_801C7762 & 0xff) != D_801C781C) { + D_801C7762 = ((D_801C7762 & 0xff) < D_801C781C) ? (D_801C7762 + 1) : (D_801C7762 - 1); + } + if ((D_801C7730 & 0xff) != D_801C7761) { + D_801C7730 = ((D_801C7730 & 0xff) < D_801C7761) ? (D_801C7730 + 1) : (D_801C7730 - 1); + } + D_801C7820 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C6288; +extern void *D_801C628C; +extern void *D_801C6290; +extern s32 D_801C62B8; +extern s32 D_801C62BC; +extern s32 D_801C62C0; +extern s32 D_801C7794[]; + +extern u8 D_8018708C[]; +extern u8 D_80187134[]; +extern u8 D_80186FE4[]; +extern u8 D_801870E0[]; +extern u8 D_80187160[]; +extern u8 D_80187038[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C62B8 = param_2; + D_801C62BC = (param_2 >> 2) & 3; + D_801C62C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C6288 = D_8018708C; + D_801C628C = D_80187134; + D_801C6290 = D_80186FE4; + } else { + D_801C6288 = D_801870E0; + D_801C628C = D_80187160; + D_801C6290 = D_80187038; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C62C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C62B8 & 2) != 0) { + D_801C7794[0] = 0x140; + D_801C7794[3] = 0x80; + if (p[0x37] == 4) { + D_801C7794[0] = 0x140; + D_801C7794[3] = 0; + } + if (p[0x37] == 0) { + D_801C7794[0] = 0x140; + D_801C7794[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C6290)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C6290; +extern s16 *D_801C6294; +extern s32 D_801C62A4; +extern s32 D_801C62C4; +extern s32 D_801C62C8; +extern s32 D_801C62CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C6294 != 0) { + D_801C62A4 = 0; + p = (int *)(param_1 * 12 + (int)D_801C6290); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C62C4 != x) { + flag = 1; + if (D_801C62C4 < x) { + if (x - D_801C62C4 < 5) { + D_801C62C4 = x; + } else { + D_801C62C4 = D_801C62C4 + 4; + } + } else { + if (D_801C62C4 - x < 5) { + D_801C62C4 = x; + } else { + D_801C62C4 = D_801C62C4 - 4; + } + } + } + if (D_801C62C8 != y) { + flag = 1; + if (D_801C62C8 < y) { + if (y - D_801C62C8 < 5) { + D_801C62C8 = y; + } else { + D_801C62C8 = D_801C62C8 + 4; + } + } else { + if (D_801C62C8 - y < 5) { + D_801C62C8 = y; + } else { + D_801C62C8 = D_801C62C8 - 4; + } + } + } + if (D_801C62CC != z) { + flag = 1; + if (D_801C62CC < z) { + if (z - D_801C62CC < 5) { + D_801C62CC = z; + } else { + D_801C62CC = D_801C62CC + 4; + } + } else { + if (D_801C62CC - z < 5) { + D_801C62CC = z; + } else { + D_801C62CC = D_801C62CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C62A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801871F0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C6294); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C62C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C62C8); + uVar5 = (*(int*)&D_801C62CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801871F0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C62AC; + +s32 func_8013E054(void) { + return D_801C62AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187BEC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80187BC4; +extern s16 D_80187BC6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187BEC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80187BC4 = 2; + D_80187BC6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80187BC6 = 0; + D_80187BC4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C62E0; + extern void * D_801C62E4; + extern unsigned char D_80187864; + extern unsigned char D_8018787C; + extern unsigned char D_801878F0; + extern unsigned char D_801878F8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C62E0 = &D_80187864; + D_801C62E4 = &D_801878F0; + } else { + D_801C62E0 = &D_8018787C; + D_801C62E4 = &D_801878F8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187BEC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187BEC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187BEC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187BC8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187BC8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187BC8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80187BC4; +extern s16 D_80187BC6; +extern unsigned char D_80187BC8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187BC6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80187BC4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80187BC6; + if (*r < 3) { + *r = *r + 1; + } + D_80187BC4 = (u16)D_80187BC4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187BC8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187BC8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187BC8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_000/ov_SC02_000_jr_8012ACE0.c b/src/ov_SC02_000/ov_SC02_000_jr_8012ACE0.c index 18a1225aa..f10c278d1 100644 --- a/src/ov_SC02_000/ov_SC02_000_jr_8012ACE0.c +++ b/src/ov_SC02_000/ov_SC02_000_jr_8012ACE0.c @@ -2823,1334 +2823,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018B200[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018B200[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018B244; -extern u8 D_8018B288; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018B244; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018B288 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018B2CC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018B308[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018B308; - if (((s16)a1) < 0xC00) { - tbl = D_8018B2CC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018B344, D_8018B346, D_8018B348, D_8018B34A, D_8018B34C, D_8018B34E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018B346 < ang)) goto outer_else; - if (!(ang < D_8018B34C)) goto inner_else; - if (ang < D_8018B348) { *(s16 *)L = D_8018B348; goto done; } - if (D_8018B34A < ang) { *(s16 *)L = D_8018B34A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018B344) { *(s16 *)L = D_8018B344; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018B34E < ang) { *(s16 *)L = D_8018B34E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E6DB0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E6DB0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E6DB0; -extern s8 D_801E6DB4; -extern s8 D_801E6DB5; - -void func_8013C9C4(void * arg0) -{ - D_801E6DB0 = arg0; - D_801E6DB4 = 0; - D_801E6DB5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E6DB0; -extern s8 D_801E6DB4; -extern s8 D_801E6DB5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E6DB0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E6DB5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E6DB4)) * 2) + D_801E6DB0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E6DB5 = (unsigned char) p[1]; - D_801E6DB4 = D_801E6DB4 + 1; - if (D_801E6DB5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E6DB4 = 0; - *base = 0; - } - } - else - { - D_801E6DB5 = c - 1; - } - } - return; -} - - - -extern s32 D_801E6DD4; -extern s32 D_801E6DC8; -extern s32 D_801E6DCC; -extern s32 D_801E6DD8; - -void func_8013CABC(void) { - D_801E6DD4 = 1; - D_801E6DC8 = 1; - D_801E6DCC = 0; - D_801E6DD8 = 1; -} - - - -extern s32 D_801E6DC8; -extern s32 D_801E6DCC; -extern s32 D_801E6DD0; -extern s32 D_801E6DD4; -extern s32 D_801E6DD8; - -void func_8013CAE8(void) { - D_801E6DC8 = 1; - D_801E6DD4 = 0; - D_801E6DCC = 0; - D_801E6DD0 = -1; - D_801E6DD8 = 0; -} - - - -extern s32 D_801E6DD4; -extern s32 D_801E6DD8; -extern s32 D_801E6E00; -extern s32 D_801E6E04; - -void func_8013CB20(void) -{ - D_801E6E00 = D_801E6DD8; - D_801E6E04 = D_801E6DD4; - D_801E6DD8 = 1; - D_801E6DD4 = 0; -} - - - -extern s32 D_801E6E00; -extern s32 D_801E6E04; -extern s32 D_801E6DD8; -extern s32 D_801E6DD4; - -void func_8013CB5C(void) { - D_801E6DD8 = D_801E6E00; - D_801E6DD4 = D_801E6E04; -} - - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E8688; - extern u8 D_801E8689; - extern u8 D_801E868A; - extern u8 D_801E868B; - extern u8 D_801E868C; - extern u8 D_801E868D; - extern u8 D_801E868E; - extern u8 D_801E868F; - extern u8 D_801E8690; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E8688; t1 = D_801E8689; t2 = D_801E868A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E868B; t1 = D_801E868C; t2 = D_801E868D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E868E; t1 = D_801E868F; t2 = D_801E8690; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E6DE0; -extern s32 D_801E6DC8; -extern s32 D_801E6DE4; -extern s32 D_801E6DD4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E6DE0 != 0) { - if (D_801E6DE0 != 2) { - if (((D_801E6DE0 < 3) && (D_801E6DE0 == 1)) && - (D_801E6DE4 = D_801E6DE4 + 1, 0x23a < D_801E6DE4)) { - D_801E6DC8 = D_801E6DE0; - D_801E6DE0 = 2; - } - } else { - D_801E6DC8 = D_801E6DC8 + -1; - if (D_801E6DC8 == 0) { - D_801E6DC8 = D_801E6DE0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E6DD4 == 0) { - D_801E6DE0 = D_801E6DE0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E6DD4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E6DD4; -} - - - -extern s32 D_801E6DE0; - -void func_8013D164(void) { - D_801E6DE0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E87BE; -extern u8 D_801E8866; -extern u8 D_801E8692; -extern u8 D_801E876C; -extern u8 D_801E8670; -extern u8 D_801E8691; -extern s32 D_801E8774; - -void func_8013D330(void) { - if ((D_801E87BE & 0xff) != D_801E8866) { - D_801E87BE = ((D_801E87BE & 0xff) < D_801E8866) ? (D_801E87BE + 1) : (D_801E87BE - 1); - } - if ((D_801E8692 & 0xff) != D_801E876C) { - D_801E8692 = ((D_801E8692 & 0xff) < D_801E876C) ? (D_801E8692 + 1) : (D_801E8692 - 1); - } - if ((D_801E8670 & 0xff) != D_801E8691) { - D_801E8670 = ((D_801E8670 & 0xff) < D_801E8691) ? (D_801E8670 + 1) : (D_801E8670 - 1); - } - D_801E8774 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E6DB8; -extern void *D_801E6DBC; -extern void *D_801E6DC0; -extern s32 D_801E6DE8; -extern s32 D_801E6DEC; -extern s32 D_801E6DF0; -extern s32 D_801E86D4[]; - -extern u8 D_8018B43C[]; -extern u8 D_8018B4E4[]; -extern u8 D_8018B394[]; -extern u8 D_8018B490[]; -extern u8 D_8018B510[]; -extern u8 D_8018B3E8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E6DE8 = param_2; - D_801E6DEC = (param_2 >> 2) & 3; - D_801E6DF0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E6DB8 = D_8018B43C; - D_801E6DBC = D_8018B4E4; - D_801E6DC0 = D_8018B394; - } else { - D_801E6DB8 = D_8018B490; - D_801E6DBC = D_8018B510; - D_801E6DC0 = D_8018B3E8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E6DF0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E6DE8 & 2) != 0) { - D_801E86D4[0] = 0x140; - D_801E86D4[3] = 0x80; - if (p[0x37] == 4) { - D_801E86D4[0] = 0x140; - D_801E86D4[3] = 0; - } - if (p[0x37] == 0) { - D_801E86D4[0] = 0x140; - D_801E86D4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E6DC0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E6DC0; -extern s16 *D_801E6DC4; -extern s32 D_801E6DD4; -extern s32 D_801E6DF4; -extern s32 D_801E6DF8; -extern s32 D_801E6DFC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E6DC4 != 0) { - D_801E6DD4 = 0; - p = (int *)(param_1 * 12 + (int)D_801E6DC0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E6DF4 != x) { - flag = 1; - if (D_801E6DF4 < x) { - if (x - D_801E6DF4 < 5) { - D_801E6DF4 = x; - } else { - D_801E6DF4 = D_801E6DF4 + 4; - } - } else { - if (D_801E6DF4 - x < 5) { - D_801E6DF4 = x; - } else { - D_801E6DF4 = D_801E6DF4 - 4; - } - } - } - if (D_801E6DF8 != y) { - flag = 1; - if (D_801E6DF8 < y) { - if (y - D_801E6DF8 < 5) { - D_801E6DF8 = y; - } else { - D_801E6DF8 = D_801E6DF8 + 4; - } - } else { - if (D_801E6DF8 - y < 5) { - D_801E6DF8 = y; - } else { - D_801E6DF8 = D_801E6DF8 - 4; - } - } - } - if (D_801E6DFC != z) { - flag = 1; - if (D_801E6DFC < z) { - if (z - D_801E6DFC < 5) { - D_801E6DFC = z; - } else { - D_801E6DFC = D_801E6DFC + 4; - } - } else { - if (D_801E6DFC - z < 5) { - D_801E6DFC = z; - } else { - D_801E6DFC = D_801E6DFC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E6DD4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018B5A0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E6DC4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E6DF4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E6DF8); - uVar5 = (*(int*)&D_801E6DFC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018B5A0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E6DDC; - -s32 func_8013E054(void) { - return D_801E6DDC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018BF9C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018BF74; -extern s16 D_8018BF76; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018BF9C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018BF74 = 2; - D_8018BF76 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018BF76 = 0; - D_8018BF74 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E6E10; - extern void * D_801E6E14; - extern unsigned char D_8018BC14; - extern unsigned char D_8018BC2C; - extern unsigned char D_8018BCA0; - extern unsigned char D_8018BCA8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E6E10 = &D_8018BC14; - D_801E6E14 = &D_8018BCA0; - } else { - D_801E6E10 = &D_8018BC2C; - D_801E6E14 = &D_8018BCA8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018BF9C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018BF9C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018BF9C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018BF78; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018BF78)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018BF78)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018BF74; -extern s16 D_8018BF76; -extern unsigned char D_8018BF78; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018BF76` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018BF74` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018BF76; - if (*r < 3) { - *r = *r + 1; - } - D_8018BF74 = (u16)D_8018BF74 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018BF78; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_000/ov_SC02_000_jr_801380E0.c b/src/ov_SC02_000/ov_SC02_000_jr_801380E0.c new file mode 100644 index 000000000..06bde7ab5 --- /dev/null +++ b/src/ov_SC02_000/ov_SC02_000_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E5794; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018AE94[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E6CCC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E87C0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E5794; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018ABD0)(); +extern s16 (*D_8018ABD4)(); +extern M2C_UNK (*D_8018ABDC)(); +extern s32 (*D_8018ABE0)(); +extern s32 D_801E6CC8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E5798; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018AF28; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018E40C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018AF40; +extern M2C_UNK D_8018AF48; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018AF50; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018AF6C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018AF78[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018AF8C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018AFDC[]; +extern s16 D_8018B00C[]; +extern s16 D_8018B06C[]; +extern s16 D_8018B074[]; +extern s16 D_8018B094[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018B0CC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018B124[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018B16C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018B174[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018B17C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018B184[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018B12C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018B14C; +extern void func_801321B0(int param_1); +extern int D_8018B15C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E6D38; +extern s32 D_801E6D3C[]; +extern int D_801E6D40; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018B190; +extern u8 D_8018B18C; +extern s16 *D_8018B194; +extern u8 D_8018B198; +extern int D_801E6D38; +extern u16 D_801E6D48; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018B194; /* holds a pointer value (*(u16**)&D_8018B194) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018B1A8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018B1FC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018B200[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018B200[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018B244; +extern u8 D_8018B288; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018B244; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018B288 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018B2CC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018B308[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018B308; + if (((s16)a1) < 0xC00) { + tbl = D_8018B2CC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018B344, D_8018B346, D_8018B348, D_8018B34A, D_8018B34C, D_8018B34E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B346 < ang)) goto outer_else; + if (!(ang < D_8018B34C)) goto inner_else; + if (ang < D_8018B348) { *(s16 *)L = D_8018B348; goto done; } + if (D_8018B34A < ang) { *(s16 *)L = D_8018B34A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B344) { *(s16 *)L = D_8018B344; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B34E < ang) { *(s16 *)L = D_8018B34E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E6DB0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E6DB0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E6DB0; +extern s8 D_801E6DB4; +extern s8 D_801E6DB5; + +void func_8013C9C4(void * arg0) +{ + D_801E6DB0 = arg0; + D_801E6DB4 = 0; + D_801E6DB5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E6DB0; +extern s8 D_801E6DB4; +extern s8 D_801E6DB5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E6DB0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E6DB5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E6DB4)) * 2) + D_801E6DB0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E6DB5 = (unsigned char) p[1]; + D_801E6DB4 = D_801E6DB4 + 1; + if (D_801E6DB5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E6DB4 = 0; + *base = 0; + } + } + else + { + D_801E6DB5 = c - 1; + } + } + return; +} + + + +extern s32 D_801E6DD4; +extern s32 D_801E6DC8; +extern s32 D_801E6DCC; +extern s32 D_801E6DD8; + +void func_8013CABC(void) { + D_801E6DD4 = 1; + D_801E6DC8 = 1; + D_801E6DCC = 0; + D_801E6DD8 = 1; +} + + + +extern s32 D_801E6DC8; +extern s32 D_801E6DCC; +extern s32 D_801E6DD0; +extern s32 D_801E6DD4; +extern s32 D_801E6DD8; + +void func_8013CAE8(void) { + D_801E6DC8 = 1; + D_801E6DD4 = 0; + D_801E6DCC = 0; + D_801E6DD0 = -1; + D_801E6DD8 = 0; +} + + + +extern s32 D_801E6DD4; +extern s32 D_801E6DD8; +extern s32 D_801E6E00; +extern s32 D_801E6E04; + +void func_8013CB20(void) +{ + D_801E6E00 = D_801E6DD8; + D_801E6E04 = D_801E6DD4; + D_801E6DD8 = 1; + D_801E6DD4 = 0; +} + + + +extern s32 D_801E6E00; +extern s32 D_801E6E04; +extern s32 D_801E6DD8; +extern s32 D_801E6DD4; + +void func_8013CB5C(void) { + D_801E6DD8 = D_801E6E00; + D_801E6DD4 = D_801E6E04; +} + + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E8688; + extern u8 D_801E8689; + extern u8 D_801E868A; + extern u8 D_801E868B; + extern u8 D_801E868C; + extern u8 D_801E868D; + extern u8 D_801E868E; + extern u8 D_801E868F; + extern u8 D_801E8690; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E8688; t1 = D_801E8689; t2 = D_801E868A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E868B; t1 = D_801E868C; t2 = D_801E868D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E868E; t1 = D_801E868F; t2 = D_801E8690; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E6DE0; +extern s32 D_801E6DC8; +extern s32 D_801E6DE4; +extern s32 D_801E6DD4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E6DE0 != 0) { + if (D_801E6DE0 != 2) { + if (((D_801E6DE0 < 3) && (D_801E6DE0 == 1)) && + (D_801E6DE4 = D_801E6DE4 + 1, 0x23a < D_801E6DE4)) { + D_801E6DC8 = D_801E6DE0; + D_801E6DE0 = 2; + } + } else { + D_801E6DC8 = D_801E6DC8 + -1; + if (D_801E6DC8 == 0) { + D_801E6DC8 = D_801E6DE0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E6DD4 == 0) { + D_801E6DE0 = D_801E6DE0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E6DD4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E6DD4; +} + + + +extern s32 D_801E6DE0; + +void func_8013D164(void) { + D_801E6DE0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E87BE; +extern u8 D_801E8866; +extern u8 D_801E8692; +extern u8 D_801E876C; +extern u8 D_801E8670; +extern u8 D_801E8691; +extern s32 D_801E8774; + +void func_8013D330(void) { + if ((D_801E87BE & 0xff) != D_801E8866) { + D_801E87BE = ((D_801E87BE & 0xff) < D_801E8866) ? (D_801E87BE + 1) : (D_801E87BE - 1); + } + if ((D_801E8692 & 0xff) != D_801E876C) { + D_801E8692 = ((D_801E8692 & 0xff) < D_801E876C) ? (D_801E8692 + 1) : (D_801E8692 - 1); + } + if ((D_801E8670 & 0xff) != D_801E8691) { + D_801E8670 = ((D_801E8670 & 0xff) < D_801E8691) ? (D_801E8670 + 1) : (D_801E8670 - 1); + } + D_801E8774 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E6DB8; +extern void *D_801E6DBC; +extern void *D_801E6DC0; +extern s32 D_801E6DE8; +extern s32 D_801E6DEC; +extern s32 D_801E6DF0; +extern s32 D_801E86D4[]; + +extern u8 D_8018B43C[]; +extern u8 D_8018B4E4[]; +extern u8 D_8018B394[]; +extern u8 D_8018B490[]; +extern u8 D_8018B510[]; +extern u8 D_8018B3E8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E6DE8 = param_2; + D_801E6DEC = (param_2 >> 2) & 3; + D_801E6DF0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E6DB8 = D_8018B43C; + D_801E6DBC = D_8018B4E4; + D_801E6DC0 = D_8018B394; + } else { + D_801E6DB8 = D_8018B490; + D_801E6DBC = D_8018B510; + D_801E6DC0 = D_8018B3E8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E6DF0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E6DE8 & 2) != 0) { + D_801E86D4[0] = 0x140; + D_801E86D4[3] = 0x80; + if (p[0x37] == 4) { + D_801E86D4[0] = 0x140; + D_801E86D4[3] = 0; + } + if (p[0x37] == 0) { + D_801E86D4[0] = 0x140; + D_801E86D4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E6DC0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E6DC0; +extern s16 *D_801E6DC4; +extern s32 D_801E6DD4; +extern s32 D_801E6DF4; +extern s32 D_801E6DF8; +extern s32 D_801E6DFC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E6DC4 != 0) { + D_801E6DD4 = 0; + p = (int *)(param_1 * 12 + (int)D_801E6DC0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E6DF4 != x) { + flag = 1; + if (D_801E6DF4 < x) { + if (x - D_801E6DF4 < 5) { + D_801E6DF4 = x; + } else { + D_801E6DF4 = D_801E6DF4 + 4; + } + } else { + if (D_801E6DF4 - x < 5) { + D_801E6DF4 = x; + } else { + D_801E6DF4 = D_801E6DF4 - 4; + } + } + } + if (D_801E6DF8 != y) { + flag = 1; + if (D_801E6DF8 < y) { + if (y - D_801E6DF8 < 5) { + D_801E6DF8 = y; + } else { + D_801E6DF8 = D_801E6DF8 + 4; + } + } else { + if (D_801E6DF8 - y < 5) { + D_801E6DF8 = y; + } else { + D_801E6DF8 = D_801E6DF8 - 4; + } + } + } + if (D_801E6DFC != z) { + flag = 1; + if (D_801E6DFC < z) { + if (z - D_801E6DFC < 5) { + D_801E6DFC = z; + } else { + D_801E6DFC = D_801E6DFC + 4; + } + } else { + if (D_801E6DFC - z < 5) { + D_801E6DFC = z; + } else { + D_801E6DFC = D_801E6DFC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E6DD4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018B5A0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E6DC4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E6DF4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E6DF8); + uVar5 = (*(int*)&D_801E6DFC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018B5A0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E6DDC; + +s32 func_8013E054(void) { + return D_801E6DDC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018BF9C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018BF74; +extern s16 D_8018BF76; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018BF9C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018BF74 = 2; + D_8018BF76 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018BF76 = 0; + D_8018BF74 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E6E10; + extern void * D_801E6E14; + extern unsigned char D_8018BC14; + extern unsigned char D_8018BC2C; + extern unsigned char D_8018BCA0; + extern unsigned char D_8018BCA8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E6E10 = &D_8018BC14; + D_801E6E14 = &D_8018BCA0; + } else { + D_801E6E10 = &D_8018BC2C; + D_801E6E14 = &D_8018BCA8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018BF9C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018BF9C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018BF9C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018BF78; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018BF78)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018BF78)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018BF74; +extern s16 D_8018BF76; +extern unsigned char D_8018BF78; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018BF76` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018BF74` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018BF76; + if (*r < 3) { + *r = *r + 1; + } + D_8018BF74 = (u16)D_8018BF74 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018BF78; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_000/nonmatchings/ov_SC02_000_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_003/ov_SC02_003_jr_8012ACE0.c b/src/ov_SC02_003/ov_SC02_003_jr_8012ACE0.c index 719c2c494..57a8f6980 100644 --- a/src/ov_SC02_003/ov_SC02_003_jr_8012ACE0.c +++ b/src/ov_SC02_003/ov_SC02_003_jr_8012ACE0.c @@ -2823,1334 +2823,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018B200[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018B200[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018B244; -extern u8 D_8018B288; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018B244; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018B288 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018B2CC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018B308[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018B308; - if (((s16)a1) < 0xC00) { - tbl = D_8018B2CC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018B344, D_8018B346, D_8018B348, D_8018B34A, D_8018B34C, D_8018B34E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018B346 < ang)) goto outer_else; - if (!(ang < D_8018B34C)) goto inner_else; - if (ang < D_8018B348) { *(s16 *)L = D_8018B348; goto done; } - if (D_8018B34A < ang) { *(s16 *)L = D_8018B34A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018B344) { *(s16 *)L = D_8018B344; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018B34E < ang) { *(s16 *)L = D_8018B34E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E6DB0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E6DB0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E6DB0; -extern s8 D_801E6DB4; -extern s8 D_801E6DB5; - -void func_8013C9C4(void * arg0) -{ - D_801E6DB0 = arg0; - D_801E6DB4 = 0; - D_801E6DB5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E6DB0; -extern s8 D_801E6DB4; -extern s8 D_801E6DB5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E6DB0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E6DB5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E6DB4)) * 2) + D_801E6DB0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E6DB5 = (unsigned char) p[1]; - D_801E6DB4 = D_801E6DB4 + 1; - if (D_801E6DB5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E6DB4 = 0; - *base = 0; - } - } - else - { - D_801E6DB5 = c - 1; - } - } - return; -} - - - -extern s32 D_801E6DD4; -extern s32 D_801E6DC8; -extern s32 D_801E6DCC; -extern s32 D_801E6DD8; - -void func_8013CABC(void) { - D_801E6DD4 = 1; - D_801E6DC8 = 1; - D_801E6DCC = 0; - D_801E6DD8 = 1; -} - - - -extern s32 D_801E6DC8; -extern s32 D_801E6DCC; -extern s32 D_801E6DD0; -extern s32 D_801E6DD4; -extern s32 D_801E6DD8; - -void func_8013CAE8(void) { - D_801E6DC8 = 1; - D_801E6DD4 = 0; - D_801E6DCC = 0; - D_801E6DD0 = -1; - D_801E6DD8 = 0; -} - - - -extern s32 D_801E6DD4; -extern s32 D_801E6DD8; -extern s32 D_801E6E00; -extern s32 D_801E6E04; - -void func_8013CB20(void) -{ - D_801E6E00 = D_801E6DD8; - D_801E6E04 = D_801E6DD4; - D_801E6DD8 = 1; - D_801E6DD4 = 0; -} - - - -extern s32 D_801E6E00; -extern s32 D_801E6E04; -extern s32 D_801E6DD8; -extern s32 D_801E6DD4; - -void func_8013CB5C(void) { - D_801E6DD8 = D_801E6E00; - D_801E6DD4 = D_801E6E04; -} - - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E8688; - extern u8 D_801E8689; - extern u8 D_801E868A; - extern u8 D_801E868B; - extern u8 D_801E868C; - extern u8 D_801E868D; - extern u8 D_801E868E; - extern u8 D_801E868F; - extern u8 D_801E8690; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E8688; t1 = D_801E8689; t2 = D_801E868A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E868B; t1 = D_801E868C; t2 = D_801E868D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E868E; t1 = D_801E868F; t2 = D_801E8690; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E6DE0; -extern s32 D_801E6DC8; -extern s32 D_801E6DE4; -extern s32 D_801E6DD4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E6DE0 != 0) { - if (D_801E6DE0 != 2) { - if (((D_801E6DE0 < 3) && (D_801E6DE0 == 1)) && - (D_801E6DE4 = D_801E6DE4 + 1, 0x23a < D_801E6DE4)) { - D_801E6DC8 = D_801E6DE0; - D_801E6DE0 = 2; - } - } else { - D_801E6DC8 = D_801E6DC8 + -1; - if (D_801E6DC8 == 0) { - D_801E6DC8 = D_801E6DE0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E6DD4 == 0) { - D_801E6DE0 = D_801E6DE0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E6DD4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E6DD4; -} - - - -extern s32 D_801E6DE0; - -void func_8013D164(void) { - D_801E6DE0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E87BE; -extern u8 D_801E8866; -extern u8 D_801E8692; -extern u8 D_801E876C; -extern u8 D_801E8670; -extern u8 D_801E8691; -extern s32 D_801E8774; - -void func_8013D330(void) { - if ((D_801E87BE & 0xff) != D_801E8866) { - D_801E87BE = ((D_801E87BE & 0xff) < D_801E8866) ? (D_801E87BE + 1) : (D_801E87BE - 1); - } - if ((D_801E8692 & 0xff) != D_801E876C) { - D_801E8692 = ((D_801E8692 & 0xff) < D_801E876C) ? (D_801E8692 + 1) : (D_801E8692 - 1); - } - if ((D_801E8670 & 0xff) != D_801E8691) { - D_801E8670 = ((D_801E8670 & 0xff) < D_801E8691) ? (D_801E8670 + 1) : (D_801E8670 - 1); - } - D_801E8774 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E6DB8; -extern void *D_801E6DBC; -extern void *D_801E6DC0; -extern s32 D_801E6DE8; -extern s32 D_801E6DEC; -extern s32 D_801E6DF0; -extern s32 D_801E86D4[]; - -extern u8 D_8018B43C[]; -extern u8 D_8018B4E4[]; -extern u8 D_8018B394[]; -extern u8 D_8018B490[]; -extern u8 D_8018B510[]; -extern u8 D_8018B3E8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E6DE8 = param_2; - D_801E6DEC = (param_2 >> 2) & 3; - D_801E6DF0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E6DB8 = D_8018B43C; - D_801E6DBC = D_8018B4E4; - D_801E6DC0 = D_8018B394; - } else { - D_801E6DB8 = D_8018B490; - D_801E6DBC = D_8018B510; - D_801E6DC0 = D_8018B3E8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E6DF0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E6DE8 & 2) != 0) { - D_801E86D4[0] = 0x140; - D_801E86D4[3] = 0x80; - if (p[0x37] == 4) { - D_801E86D4[0] = 0x140; - D_801E86D4[3] = 0; - } - if (p[0x37] == 0) { - D_801E86D4[0] = 0x140; - D_801E86D4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E6DC0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E6DC0; -extern s16 *D_801E6DC4; -extern s32 D_801E6DD4; -extern s32 D_801E6DF4; -extern s32 D_801E6DF8; -extern s32 D_801E6DFC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E6DC4 != 0) { - D_801E6DD4 = 0; - p = (int *)(param_1 * 12 + (int)D_801E6DC0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E6DF4 != x) { - flag = 1; - if (D_801E6DF4 < x) { - if (x - D_801E6DF4 < 5) { - D_801E6DF4 = x; - } else { - D_801E6DF4 = D_801E6DF4 + 4; - } - } else { - if (D_801E6DF4 - x < 5) { - D_801E6DF4 = x; - } else { - D_801E6DF4 = D_801E6DF4 - 4; - } - } - } - if (D_801E6DF8 != y) { - flag = 1; - if (D_801E6DF8 < y) { - if (y - D_801E6DF8 < 5) { - D_801E6DF8 = y; - } else { - D_801E6DF8 = D_801E6DF8 + 4; - } - } else { - if (D_801E6DF8 - y < 5) { - D_801E6DF8 = y; - } else { - D_801E6DF8 = D_801E6DF8 - 4; - } - } - } - if (D_801E6DFC != z) { - flag = 1; - if (D_801E6DFC < z) { - if (z - D_801E6DFC < 5) { - D_801E6DFC = z; - } else { - D_801E6DFC = D_801E6DFC + 4; - } - } else { - if (D_801E6DFC - z < 5) { - D_801E6DFC = z; - } else { - D_801E6DFC = D_801E6DFC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E6DD4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018B5A0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E6DC4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E6DF4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E6DF8); - uVar5 = (*(int*)&D_801E6DFC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018B5A0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E6DDC; - -s32 func_8013E054(void) { - return D_801E6DDC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018BF9C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018BF74; -extern s16 D_8018BF76; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018BF9C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018BF74 = 2; - D_8018BF76 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018BF76 = 0; - D_8018BF74 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E6E10; - extern void * D_801E6E14; - extern unsigned char D_8018BC14; - extern unsigned char D_8018BC2C; - extern unsigned char D_8018BCA0; - extern unsigned char D_8018BCA8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E6E10 = &D_8018BC14; - D_801E6E14 = &D_8018BCA0; - } else { - D_801E6E10 = &D_8018BC2C; - D_801E6E14 = &D_8018BCA8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018BF9C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018BF9C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018BF9C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018BF78; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018BF78)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018BF78)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018BF74; -extern s16 D_8018BF76; -extern unsigned char D_8018BF78; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018BF76` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018BF74` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018BF76; - if (*r < 3) { - *r = *r + 1; - } - D_8018BF74 = (u16)D_8018BF74 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018BF78; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_003/ov_SC02_003_jr_801380E0.c b/src/ov_SC02_003/ov_SC02_003_jr_801380E0.c new file mode 100644 index 000000000..250dbb00e --- /dev/null +++ b/src/ov_SC02_003/ov_SC02_003_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E5794; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018AE94[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E6CCC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E87C0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E5794; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018ABD0)(); +extern s16 (*D_8018ABD4)(); +extern M2C_UNK (*D_8018ABDC)(); +extern s32 (*D_8018ABE0)(); +extern s32 D_801E6CC8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E5798; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018AF28; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018E40C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018AF40; +extern M2C_UNK D_8018AF48; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018AF50; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018AF6C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018AF78[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018AF8C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018AFDC[]; +extern s16 D_8018B00C[]; +extern s16 D_8018B06C[]; +extern s16 D_8018B074[]; +extern s16 D_8018B094[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018B0CC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018B124[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018B16C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018B174[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018B17C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018B184[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018B12C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018B14C; +extern void func_801321B0(int param_1); +extern int D_8018B15C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E6D38; +extern s32 D_801E6D3C[]; +extern int D_801E6D40; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018B190; +extern u8 D_8018B18C; +extern s16 *D_8018B194; +extern u8 D_8018B198; +extern int D_801E6D38; +extern u16 D_801E6D48; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018B194; /* holds a pointer value (*(u16**)&D_8018B194) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018B1A8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018B1FC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018B200[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018B200[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018B244; +extern u8 D_8018B288; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018B244; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018B288 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018B2CC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018B308[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018B308; + if (((s16)a1) < 0xC00) { + tbl = D_8018B2CC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018B344, D_8018B346, D_8018B348, D_8018B34A, D_8018B34C, D_8018B34E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B346 < ang)) goto outer_else; + if (!(ang < D_8018B34C)) goto inner_else; + if (ang < D_8018B348) { *(s16 *)L = D_8018B348; goto done; } + if (D_8018B34A < ang) { *(s16 *)L = D_8018B34A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B344) { *(s16 *)L = D_8018B344; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B34E < ang) { *(s16 *)L = D_8018B34E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E6DB0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E6DB0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E6DB0; +extern s8 D_801E6DB4; +extern s8 D_801E6DB5; + +void func_8013C9C4(void * arg0) +{ + D_801E6DB0 = arg0; + D_801E6DB4 = 0; + D_801E6DB5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E6DB0; +extern s8 D_801E6DB4; +extern s8 D_801E6DB5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E6DB0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E6DB5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E6DB4)) * 2) + D_801E6DB0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E6DB5 = (unsigned char) p[1]; + D_801E6DB4 = D_801E6DB4 + 1; + if (D_801E6DB5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E6DB4 = 0; + *base = 0; + } + } + else + { + D_801E6DB5 = c - 1; + } + } + return; +} + + + +extern s32 D_801E6DD4; +extern s32 D_801E6DC8; +extern s32 D_801E6DCC; +extern s32 D_801E6DD8; + +void func_8013CABC(void) { + D_801E6DD4 = 1; + D_801E6DC8 = 1; + D_801E6DCC = 0; + D_801E6DD8 = 1; +} + + + +extern s32 D_801E6DC8; +extern s32 D_801E6DCC; +extern s32 D_801E6DD0; +extern s32 D_801E6DD4; +extern s32 D_801E6DD8; + +void func_8013CAE8(void) { + D_801E6DC8 = 1; + D_801E6DD4 = 0; + D_801E6DCC = 0; + D_801E6DD0 = -1; + D_801E6DD8 = 0; +} + + + +extern s32 D_801E6DD4; +extern s32 D_801E6DD8; +extern s32 D_801E6E00; +extern s32 D_801E6E04; + +void func_8013CB20(void) +{ + D_801E6E00 = D_801E6DD8; + D_801E6E04 = D_801E6DD4; + D_801E6DD8 = 1; + D_801E6DD4 = 0; +} + + + +extern s32 D_801E6E00; +extern s32 D_801E6E04; +extern s32 D_801E6DD8; +extern s32 D_801E6DD4; + +void func_8013CB5C(void) { + D_801E6DD8 = D_801E6E00; + D_801E6DD4 = D_801E6E04; +} + + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E8688; + extern u8 D_801E8689; + extern u8 D_801E868A; + extern u8 D_801E868B; + extern u8 D_801E868C; + extern u8 D_801E868D; + extern u8 D_801E868E; + extern u8 D_801E868F; + extern u8 D_801E8690; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E8688; t1 = D_801E8689; t2 = D_801E868A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E868B; t1 = D_801E868C; t2 = D_801E868D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E868E; t1 = D_801E868F; t2 = D_801E8690; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E6DE0; +extern s32 D_801E6DC8; +extern s32 D_801E6DE4; +extern s32 D_801E6DD4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E6DE0 != 0) { + if (D_801E6DE0 != 2) { + if (((D_801E6DE0 < 3) && (D_801E6DE0 == 1)) && + (D_801E6DE4 = D_801E6DE4 + 1, 0x23a < D_801E6DE4)) { + D_801E6DC8 = D_801E6DE0; + D_801E6DE0 = 2; + } + } else { + D_801E6DC8 = D_801E6DC8 + -1; + if (D_801E6DC8 == 0) { + D_801E6DC8 = D_801E6DE0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E6DD4 == 0) { + D_801E6DE0 = D_801E6DE0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E6DD4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E6DD4; +} + + + +extern s32 D_801E6DE0; + +void func_8013D164(void) { + D_801E6DE0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E87BE; +extern u8 D_801E8866; +extern u8 D_801E8692; +extern u8 D_801E876C; +extern u8 D_801E8670; +extern u8 D_801E8691; +extern s32 D_801E8774; + +void func_8013D330(void) { + if ((D_801E87BE & 0xff) != D_801E8866) { + D_801E87BE = ((D_801E87BE & 0xff) < D_801E8866) ? (D_801E87BE + 1) : (D_801E87BE - 1); + } + if ((D_801E8692 & 0xff) != D_801E876C) { + D_801E8692 = ((D_801E8692 & 0xff) < D_801E876C) ? (D_801E8692 + 1) : (D_801E8692 - 1); + } + if ((D_801E8670 & 0xff) != D_801E8691) { + D_801E8670 = ((D_801E8670 & 0xff) < D_801E8691) ? (D_801E8670 + 1) : (D_801E8670 - 1); + } + D_801E8774 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E6DB8; +extern void *D_801E6DBC; +extern void *D_801E6DC0; +extern s32 D_801E6DE8; +extern s32 D_801E6DEC; +extern s32 D_801E6DF0; +extern s32 D_801E86D4[]; + +extern u8 D_8018B43C[]; +extern u8 D_8018B4E4[]; +extern u8 D_8018B394[]; +extern u8 D_8018B490[]; +extern u8 D_8018B510[]; +extern u8 D_8018B3E8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E6DE8 = param_2; + D_801E6DEC = (param_2 >> 2) & 3; + D_801E6DF0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E6DB8 = D_8018B43C; + D_801E6DBC = D_8018B4E4; + D_801E6DC0 = D_8018B394; + } else { + D_801E6DB8 = D_8018B490; + D_801E6DBC = D_8018B510; + D_801E6DC0 = D_8018B3E8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E6DF0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E6DE8 & 2) != 0) { + D_801E86D4[0] = 0x140; + D_801E86D4[3] = 0x80; + if (p[0x37] == 4) { + D_801E86D4[0] = 0x140; + D_801E86D4[3] = 0; + } + if (p[0x37] == 0) { + D_801E86D4[0] = 0x140; + D_801E86D4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E6DC0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E6DC0; +extern s16 *D_801E6DC4; +extern s32 D_801E6DD4; +extern s32 D_801E6DF4; +extern s32 D_801E6DF8; +extern s32 D_801E6DFC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E6DC4 != 0) { + D_801E6DD4 = 0; + p = (int *)(param_1 * 12 + (int)D_801E6DC0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E6DF4 != x) { + flag = 1; + if (D_801E6DF4 < x) { + if (x - D_801E6DF4 < 5) { + D_801E6DF4 = x; + } else { + D_801E6DF4 = D_801E6DF4 + 4; + } + } else { + if (D_801E6DF4 - x < 5) { + D_801E6DF4 = x; + } else { + D_801E6DF4 = D_801E6DF4 - 4; + } + } + } + if (D_801E6DF8 != y) { + flag = 1; + if (D_801E6DF8 < y) { + if (y - D_801E6DF8 < 5) { + D_801E6DF8 = y; + } else { + D_801E6DF8 = D_801E6DF8 + 4; + } + } else { + if (D_801E6DF8 - y < 5) { + D_801E6DF8 = y; + } else { + D_801E6DF8 = D_801E6DF8 - 4; + } + } + } + if (D_801E6DFC != z) { + flag = 1; + if (D_801E6DFC < z) { + if (z - D_801E6DFC < 5) { + D_801E6DFC = z; + } else { + D_801E6DFC = D_801E6DFC + 4; + } + } else { + if (D_801E6DFC - z < 5) { + D_801E6DFC = z; + } else { + D_801E6DFC = D_801E6DFC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E6DD4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018B5A0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E6DC4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E6DF4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E6DF8); + uVar5 = (*(int*)&D_801E6DFC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018B5A0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E6DDC; + +s32 func_8013E054(void) { + return D_801E6DDC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018BF9C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018BF74; +extern s16 D_8018BF76; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018BF9C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018BF74 = 2; + D_8018BF76 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018BF76 = 0; + D_8018BF74 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E6E10; + extern void * D_801E6E14; + extern unsigned char D_8018BC14; + extern unsigned char D_8018BC2C; + extern unsigned char D_8018BCA0; + extern unsigned char D_8018BCA8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E6E10 = &D_8018BC14; + D_801E6E14 = &D_8018BCA0; + } else { + D_801E6E10 = &D_8018BC2C; + D_801E6E14 = &D_8018BCA8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018BF9C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018BF9C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018BF9C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018BF78; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018BF78)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018BF78)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018BF74; +extern s16 D_8018BF76; +extern unsigned char D_8018BF78; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018BF76` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018BF74` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018BF76; + if (*r < 3) { + *r = *r + 1; + } + D_8018BF74 = (u16)D_8018BF74 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018BF78; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF78); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_003/nonmatchings/ov_SC02_003_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_004/ov_SC02_004_jr_8012ACE0.c b/src/ov_SC02_004/ov_SC02_004_jr_8012ACE0.c index d9d14a3b2..f1f9841d8 100644 --- a/src/ov_SC02_004/ov_SC02_004_jr_8012ACE0.c +++ b/src/ov_SC02_004/ov_SC02_004_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E2E0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E2E0[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E324; -extern u8 D_8017E368; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E324; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E368 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E3AC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E3E8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E3E8; - if (((s16)a1) < 0xC00) { - tbl = D_8017E3AC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E424, D_8017E426, D_8017E428, D_8017E42A, D_8017E42C, D_8017E42E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E426 < ang)) goto outer_else; - if (!(ang < D_8017E42C)) goto inner_else; - if (ang < D_8017E428) { *(s16 *)L = D_8017E428; goto done; } - if (D_8017E42A < ang) { *(s16 *)L = D_8017E42A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E424) { *(s16 *)L = D_8017E424; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E42E < ang) { *(s16 *)L = D_8017E42E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80195000; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80195000, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80195000; -extern s8 D_80195004; -extern s8 D_80195005; - -void func_8013C9C4(void * arg0) -{ - D_80195000 = arg0; - D_80195004 = 0; - D_80195005 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80195000; -extern s8 D_80195004; -extern s8 D_80195005; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80195000; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80195005; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80195004)) * 2) + D_80195000); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80195005 = (unsigned char) p[1]; - D_80195004 = D_80195004 + 1; - if (D_80195005 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80195004 = 0; - *base = 0; - } - } - else - { - D_80195005 = c - 1; - } - } - return; -} - - - -extern s32 D_80195024; -extern s32 D_80195018; -extern s32 D_8019501C; -extern s32 D_80195028; - -void func_8013CABC(void) { - D_80195024 = 1; - D_80195018 = 1; - D_8019501C = 0; - D_80195028 = 1; -} - - - -extern s32 D_80195018; -extern s32 D_8019501C; -extern s32 D_80195020; -extern s32 D_80195024; -extern s32 D_80195028; - -void func_8013CAE8(void) { - D_80195018 = 1; - D_80195024 = 0; - D_8019501C = 0; - D_80195020 = -1; - D_80195028 = 0; -} - - - -extern s32 D_80195024; -extern s32 D_80195028; -extern s32 D_80195050; -extern s32 D_80195054; - -void func_8013CB20(void) -{ - D_80195050 = D_80195028; - D_80195054 = D_80195024; - D_80195028 = 1; - D_80195024 = 0; -} - - - -extern s32 D_80195050; -extern s32 D_80195054; -extern s32 D_80195028; -extern s32 D_80195024; - -void func_8013CB5C(void) { - D_80195028 = D_80195050; - D_80195024 = D_80195054; -} - - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80196270; - extern u8 D_80196271; - extern u8 D_80196272; - extern u8 D_80196273; - extern u8 D_80196274; - extern u8 D_80196275; - extern u8 D_80196276; - extern u8 D_80196277; - extern u8 D_80196278; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80196270; t1 = D_80196271; t2 = D_80196272; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_80196273; t1 = D_80196274; t2 = D_80196275; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_80196276; t1 = D_80196277; t2 = D_80196278; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80195030; -extern s32 D_80195018; -extern s32 D_80195034; -extern s32 D_80195024; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80195030 != 0) { - if (D_80195030 != 2) { - if (((D_80195030 < 3) && (D_80195030 == 1)) && - (D_80195034 = D_80195034 + 1, 0x23a < D_80195034)) { - D_80195018 = D_80195030; - D_80195030 = 2; - } - } else { - D_80195018 = D_80195018 + -1; - if (D_80195018 == 0) { - D_80195018 = D_80195030; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80195024 == 0) { - D_80195030 = D_80195030 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80195024; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80195024; -} - - - -extern s32 D_80195030; - -void func_8013D164(void) { - D_80195030 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_80196352; -extern u8 D_801963C6; -extern u8 D_8019627A; -extern u8 D_80196334; -extern u8 D_80196258; -extern u8 D_80196279; -extern s32 D_80196338; - -void func_8013D330(void) { - if ((D_80196352 & 0xff) != D_801963C6) { - D_80196352 = ((D_80196352 & 0xff) < D_801963C6) ? (D_80196352 + 1) : (D_80196352 - 1); - } - if ((D_8019627A & 0xff) != D_80196334) { - D_8019627A = ((D_8019627A & 0xff) < D_80196334) ? (D_8019627A + 1) : (D_8019627A - 1); - } - if ((D_80196258 & 0xff) != D_80196279) { - D_80196258 = ((D_80196258 & 0xff) < D_80196279) ? (D_80196258 + 1) : (D_80196258 - 1); - } - D_80196338 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80195008; -extern void *D_8019500C; -extern void *D_80195010; -extern s32 D_80195038; -extern s32 D_8019503C; -extern s32 D_80195040; -extern s32 D_801962AC[]; - -extern u8 D_8017E51C[]; -extern u8 D_8017E5C4[]; -extern u8 D_8017E474[]; -extern u8 D_8017E570[]; -extern u8 D_8017E5F0[]; -extern u8 D_8017E4C8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80195038 = param_2; - D_8019503C = (param_2 >> 2) & 3; - D_80195040 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80195008 = D_8017E51C; - D_8019500C = D_8017E5C4; - D_80195010 = D_8017E474; - } else { - D_80195008 = D_8017E570; - D_8019500C = D_8017E5F0; - D_80195010 = D_8017E4C8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80195040 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80195038 & 2) != 0) { - D_801962AC[0] = 0x140; - D_801962AC[3] = 0x80; - if (p[0x37] == 4) { - D_801962AC[0] = 0x140; - D_801962AC[3] = 0; - } - if (p[0x37] == 0) { - D_801962AC[0] = 0x140; - D_801962AC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80195010)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80195010; -extern s16 *D_80195014; -extern s32 D_80195024; -extern s32 D_80195044; -extern s32 D_80195048; -extern s32 D_8019504C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80195014 != 0) { - D_80195024 = 0; - p = (int *)(param_1 * 12 + (int)D_80195010); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80195044 != x) { - flag = 1; - if (D_80195044 < x) { - if (x - D_80195044 < 5) { - D_80195044 = x; - } else { - D_80195044 = D_80195044 + 4; - } - } else { - if (D_80195044 - x < 5) { - D_80195044 = x; - } else { - D_80195044 = D_80195044 - 4; - } - } - } - if (D_80195048 != y) { - flag = 1; - if (D_80195048 < y) { - if (y - D_80195048 < 5) { - D_80195048 = y; - } else { - D_80195048 = D_80195048 + 4; - } - } else { - if (D_80195048 - y < 5) { - D_80195048 = y; - } else { - D_80195048 = D_80195048 - 4; - } - } - } - if (D_8019504C != z) { - flag = 1; - if (D_8019504C < z) { - if (z - D_8019504C < 5) { - D_8019504C = z; - } else { - D_8019504C = D_8019504C + 4; - } - } else { - if (D_8019504C - z < 5) { - D_8019504C = z; - } else { - D_8019504C = D_8019504C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80195024 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017E680[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80195014); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80195044); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80195048); - uVar5 = (*(int*)&D_8019504C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017E680); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019502C; - -s32 func_8013E054(void) { - return D_8019502C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F07C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F054; -extern s16 D_8017F056; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F07C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F054 = 2; - D_8017F056 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F056 = 0; - D_8017F054 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80195060; - extern void * D_80195064; - extern unsigned char D_8017ECF4; - extern unsigned char D_8017ED0C; - extern unsigned char D_8017ED80; - extern unsigned char D_8017ED88; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80195060 = &D_8017ECF4; - D_80195064 = &D_8017ED80; - } else { - D_80195060 = &D_8017ED0C; - D_80195064 = &D_8017ED88; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F07C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F07C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F07C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F058; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F058)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F058)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F054; -extern s16 D_8017F056; -extern unsigned char D_8017F058; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F056` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F054` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F056; - if (*r < 3) { - *r = *r + 1; - } - D_8017F054 = (u16)D_8017F054 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F058); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F058; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F058); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_004/ov_SC02_004_jr_801380E0.c b/src/ov_SC02_004/ov_SC02_004_jr_801380E0.c new file mode 100644 index 000000000..0cf3a17e6 --- /dev/null +++ b/src/ov_SC02_004/ov_SC02_004_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80193DA4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017DF74[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80194F1C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80196358; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80193DA4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017DCB0)(); +extern s16 (*D_8017DCB4)(); +extern M2C_UNK (*D_8017DCBC)(); +extern s32 (*D_8017DCC0)(); +extern s32 D_80194F18; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80193DA8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E008; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801814EC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E020; +extern M2C_UNK D_8017E028; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E030; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E04C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E058[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E06C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E0BC[]; +extern s16 D_8017E0EC[]; +extern s16 D_8017E14C[]; +extern s16 D_8017E154[]; +extern s16 D_8017E174[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E1AC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E204[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E24C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E254[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E25C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E264[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E20C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E22C; +extern void func_801321B0(int param_1); +extern int D_8017E23C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80194F88; +extern s32 D_80194F8C[]; +extern int D_80194F90; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E270; +extern u8 D_8017E26C; +extern s16 *D_8017E274; +extern u8 D_8017E278; +extern int D_80194F88; +extern u16 D_80194F98; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E274; /* holds a pointer value (*(u16**)&D_8017E274) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E288[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E2DC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E2E0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E2E0[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E324; +extern u8 D_8017E368; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E324; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E368 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E3AC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E3E8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E3E8; + if (((s16)a1) < 0xC00) { + tbl = D_8017E3AC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E424, D_8017E426, D_8017E428, D_8017E42A, D_8017E42C, D_8017E42E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E426 < ang)) goto outer_else; + if (!(ang < D_8017E42C)) goto inner_else; + if (ang < D_8017E428) { *(s16 *)L = D_8017E428; goto done; } + if (D_8017E42A < ang) { *(s16 *)L = D_8017E42A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E424) { *(s16 *)L = D_8017E424; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E42E < ang) { *(s16 *)L = D_8017E42E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80195000; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80195000, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80195000; +extern s8 D_80195004; +extern s8 D_80195005; + +void func_8013C9C4(void * arg0) +{ + D_80195000 = arg0; + D_80195004 = 0; + D_80195005 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80195000; +extern s8 D_80195004; +extern s8 D_80195005; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80195000; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80195005; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80195004)) * 2) + D_80195000); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80195005 = (unsigned char) p[1]; + D_80195004 = D_80195004 + 1; + if (D_80195005 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80195004 = 0; + *base = 0; + } + } + else + { + D_80195005 = c - 1; + } + } + return; +} + + + +extern s32 D_80195024; +extern s32 D_80195018; +extern s32 D_8019501C; +extern s32 D_80195028; + +void func_8013CABC(void) { + D_80195024 = 1; + D_80195018 = 1; + D_8019501C = 0; + D_80195028 = 1; +} + + + +extern s32 D_80195018; +extern s32 D_8019501C; +extern s32 D_80195020; +extern s32 D_80195024; +extern s32 D_80195028; + +void func_8013CAE8(void) { + D_80195018 = 1; + D_80195024 = 0; + D_8019501C = 0; + D_80195020 = -1; + D_80195028 = 0; +} + + + +extern s32 D_80195024; +extern s32 D_80195028; +extern s32 D_80195050; +extern s32 D_80195054; + +void func_8013CB20(void) +{ + D_80195050 = D_80195028; + D_80195054 = D_80195024; + D_80195028 = 1; + D_80195024 = 0; +} + + + +extern s32 D_80195050; +extern s32 D_80195054; +extern s32 D_80195028; +extern s32 D_80195024; + +void func_8013CB5C(void) { + D_80195028 = D_80195050; + D_80195024 = D_80195054; +} + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80196270; + extern u8 D_80196271; + extern u8 D_80196272; + extern u8 D_80196273; + extern u8 D_80196274; + extern u8 D_80196275; + extern u8 D_80196276; + extern u8 D_80196277; + extern u8 D_80196278; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80196270; t1 = D_80196271; t2 = D_80196272; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_80196273; t1 = D_80196274; t2 = D_80196275; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_80196276; t1 = D_80196277; t2 = D_80196278; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80195030; +extern s32 D_80195018; +extern s32 D_80195034; +extern s32 D_80195024; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80195030 != 0) { + if (D_80195030 != 2) { + if (((D_80195030 < 3) && (D_80195030 == 1)) && + (D_80195034 = D_80195034 + 1, 0x23a < D_80195034)) { + D_80195018 = D_80195030; + D_80195030 = 2; + } + } else { + D_80195018 = D_80195018 + -1; + if (D_80195018 == 0) { + D_80195018 = D_80195030; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80195024 == 0) { + D_80195030 = D_80195030 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80195024; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80195024; +} + + + +extern s32 D_80195030; + +void func_8013D164(void) { + D_80195030 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_80196352; +extern u8 D_801963C6; +extern u8 D_8019627A; +extern u8 D_80196334; +extern u8 D_80196258; +extern u8 D_80196279; +extern s32 D_80196338; + +void func_8013D330(void) { + if ((D_80196352 & 0xff) != D_801963C6) { + D_80196352 = ((D_80196352 & 0xff) < D_801963C6) ? (D_80196352 + 1) : (D_80196352 - 1); + } + if ((D_8019627A & 0xff) != D_80196334) { + D_8019627A = ((D_8019627A & 0xff) < D_80196334) ? (D_8019627A + 1) : (D_8019627A - 1); + } + if ((D_80196258 & 0xff) != D_80196279) { + D_80196258 = ((D_80196258 & 0xff) < D_80196279) ? (D_80196258 + 1) : (D_80196258 - 1); + } + D_80196338 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80195008; +extern void *D_8019500C; +extern void *D_80195010; +extern s32 D_80195038; +extern s32 D_8019503C; +extern s32 D_80195040; +extern s32 D_801962AC[]; + +extern u8 D_8017E51C[]; +extern u8 D_8017E5C4[]; +extern u8 D_8017E474[]; +extern u8 D_8017E570[]; +extern u8 D_8017E5F0[]; +extern u8 D_8017E4C8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80195038 = param_2; + D_8019503C = (param_2 >> 2) & 3; + D_80195040 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80195008 = D_8017E51C; + D_8019500C = D_8017E5C4; + D_80195010 = D_8017E474; + } else { + D_80195008 = D_8017E570; + D_8019500C = D_8017E5F0; + D_80195010 = D_8017E4C8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80195040 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80195038 & 2) != 0) { + D_801962AC[0] = 0x140; + D_801962AC[3] = 0x80; + if (p[0x37] == 4) { + D_801962AC[0] = 0x140; + D_801962AC[3] = 0; + } + if (p[0x37] == 0) { + D_801962AC[0] = 0x140; + D_801962AC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80195010)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80195010; +extern s16 *D_80195014; +extern s32 D_80195024; +extern s32 D_80195044; +extern s32 D_80195048; +extern s32 D_8019504C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80195014 != 0) { + D_80195024 = 0; + p = (int *)(param_1 * 12 + (int)D_80195010); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80195044 != x) { + flag = 1; + if (D_80195044 < x) { + if (x - D_80195044 < 5) { + D_80195044 = x; + } else { + D_80195044 = D_80195044 + 4; + } + } else { + if (D_80195044 - x < 5) { + D_80195044 = x; + } else { + D_80195044 = D_80195044 - 4; + } + } + } + if (D_80195048 != y) { + flag = 1; + if (D_80195048 < y) { + if (y - D_80195048 < 5) { + D_80195048 = y; + } else { + D_80195048 = D_80195048 + 4; + } + } else { + if (D_80195048 - y < 5) { + D_80195048 = y; + } else { + D_80195048 = D_80195048 - 4; + } + } + } + if (D_8019504C != z) { + flag = 1; + if (D_8019504C < z) { + if (z - D_8019504C < 5) { + D_8019504C = z; + } else { + D_8019504C = D_8019504C + 4; + } + } else { + if (D_8019504C - z < 5) { + D_8019504C = z; + } else { + D_8019504C = D_8019504C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80195024 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017E680[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80195014); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80195044); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80195048); + uVar5 = (*(int*)&D_8019504C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017E680); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019502C; + +s32 func_8013E054(void) { + return D_8019502C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F07C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F054; +extern s16 D_8017F056; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F07C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F054 = 2; + D_8017F056 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F056 = 0; + D_8017F054 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80195060; + extern void * D_80195064; + extern unsigned char D_8017ECF4; + extern unsigned char D_8017ED0C; + extern unsigned char D_8017ED80; + extern unsigned char D_8017ED88; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80195060 = &D_8017ECF4; + D_80195064 = &D_8017ED80; + } else { + D_80195060 = &D_8017ED0C; + D_80195064 = &D_8017ED88; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F07C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F07C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F07C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F058; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F058)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F058)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F054; +extern s16 D_8017F056; +extern unsigned char D_8017F058; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F056` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F054` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F056; + if (*r < 3) { + *r = *r + 1; + } + D_8017F054 = (u16)D_8017F054 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F058); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F058; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F058); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_005/ov_SC02_005_jr_8012ACE0.c b/src/ov_SC02_005/ov_SC02_005_jr_8012ACE0.c index 477ce9088..8677bd589 100644 --- a/src/ov_SC02_005/ov_SC02_005_jr_8012ACE0.c +++ b/src/ov_SC02_005/ov_SC02_005_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80190EE4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80190EE4[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80190F28; -extern u8 D_80190F6C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80190F28; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80190F6C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80190FB0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80190FEC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80190FEC; - if (((s16)a1) < 0xC00) { - tbl = D_80190FB0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80191028, D_8019102A, D_8019102C, D_8019102E, D_80191030, D_80191032; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8019102A < ang)) goto outer_else; - if (!(ang < D_80191030)) goto inner_else; - if (ang < D_8019102C) { *(s16 *)L = D_8019102C; goto done; } - if (D_8019102E < ang) { *(s16 *)L = D_8019102E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80191028) { *(s16 *)L = D_80191028; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80191032 < ang) { *(s16 *)L = D_80191032; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E3078; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E3078, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E3078; -extern s8 D_801E307C; -extern s8 D_801E307D; - -void func_8013C9C4(void * arg0) -{ - D_801E3078 = arg0; - D_801E307C = 0; - D_801E307D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E3078; -extern s8 D_801E307C; -extern s8 D_801E307D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E3078; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E307D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E307C)) * 2) + D_801E3078); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E307D = (unsigned char) p[1]; - D_801E307C = D_801E307C + 1; - if (D_801E307D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E307C = 0; - *base = 0; - } - } - else - { - D_801E307D = c - 1; - } - } - return; -} - - - -extern s32 D_801E309C; -extern s32 D_801E3090; -extern s32 D_801E3094; -extern s32 D_801E30A0; - -void func_8013CABC(void) { - D_801E309C = 1; - D_801E3090 = 1; - D_801E3094 = 0; - D_801E30A0 = 1; -} - - - -extern s32 D_801E3090; -extern s32 D_801E3094; -extern s32 D_801E3098; -extern s32 D_801E309C; -extern s32 D_801E30A0; - -void func_8013CAE8(void) { - D_801E3090 = 1; - D_801E309C = 0; - D_801E3094 = 0; - D_801E3098 = -1; - D_801E30A0 = 0; -} - - - -extern s32 D_801E309C; -extern s32 D_801E30A0; -extern s32 D_801E30C8; -extern s32 D_801E30CC; - -void func_8013CB20(void) -{ - D_801E30C8 = D_801E30A0; - D_801E30CC = D_801E309C; - D_801E30A0 = 1; - D_801E309C = 0; -} - - - -extern s32 D_801E30C8; -extern s32 D_801E30CC; -extern s32 D_801E30A0; -extern s32 D_801E309C; - -void func_8013CB5C(void) { - D_801E30A0 = D_801E30C8; - D_801E309C = D_801E30CC; -} - - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E4A90; - extern u8 D_801E4A91; - extern u8 D_801E4A92; - extern u8 D_801E4A93; - extern u8 D_801E4A94; - extern u8 D_801E4A95; - extern u8 D_801E4A96; - extern u8 D_801E4A97; - extern u8 D_801E4A98; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E4A90; t1 = D_801E4A91; t2 = D_801E4A92; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E4A93; t1 = D_801E4A94; t2 = D_801E4A95; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E4A96; t1 = D_801E4A97; t2 = D_801E4A98; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E30A8; -extern s32 D_801E3090; -extern s32 D_801E30AC; -extern s32 D_801E309C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E30A8 != 0) { - if (D_801E30A8 != 2) { - if (((D_801E30A8 < 3) && (D_801E30A8 == 1)) && - (D_801E30AC = D_801E30AC + 1, 0x23a < D_801E30AC)) { - D_801E3090 = D_801E30A8; - D_801E30A8 = 2; - } - } else { - D_801E3090 = D_801E3090 + -1; - if (D_801E3090 == 0) { - D_801E3090 = D_801E30A8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E309C == 0) { - D_801E30A8 = D_801E30A8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E309C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E309C; -} - - - -extern s32 D_801E30A8; - -void func_8013D164(void) { - D_801E30A8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E4BDA; -extern u8 D_801E4C58; -extern u8 D_801E4B00; -extern u8 D_801E4BBE; -extern u8 D_801E4A40; -extern u8 D_801E4A99; -extern s32 D_801E4BC0; - -void func_8013D330(void) { - if ((D_801E4BDA & 0xff) != D_801E4C58) { - D_801E4BDA = ((D_801E4BDA & 0xff) < D_801E4C58) ? (D_801E4BDA + 1) : (D_801E4BDA - 1); - } - if ((D_801E4B00 & 0xff) != D_801E4BBE) { - D_801E4B00 = ((D_801E4B00 & 0xff) < D_801E4BBE) ? (D_801E4B00 + 1) : (D_801E4B00 - 1); - } - if ((D_801E4A40 & 0xff) != D_801E4A99) { - D_801E4A40 = ((D_801E4A40 & 0xff) < D_801E4A99) ? (D_801E4A40 + 1) : (D_801E4A40 - 1); - } - D_801E4BC0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E3080; -extern void *D_801E3084; -extern void *D_801E3088; -extern s32 D_801E30B0; -extern s32 D_801E30B4; -extern s32 D_801E30B8; -extern s32 D_801E4B34[]; - -extern u8 D_80191120[]; -extern u8 D_801911C8[]; -extern u8 D_80191078[]; -extern u8 D_80191174[]; -extern u8 D_801911F4[]; -extern u8 D_801910CC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E30B0 = param_2; - D_801E30B4 = (param_2 >> 2) & 3; - D_801E30B8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E3080 = D_80191120; - D_801E3084 = D_801911C8; - D_801E3088 = D_80191078; - } else { - D_801E3080 = D_80191174; - D_801E3084 = D_801911F4; - D_801E3088 = D_801910CC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E30B8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E30B0 & 2) != 0) { - D_801E4B34[0] = 0x140; - D_801E4B34[3] = 0x80; - if (p[0x37] == 4) { - D_801E4B34[0] = 0x140; - D_801E4B34[3] = 0; - } - if (p[0x37] == 0) { - D_801E4B34[0] = 0x140; - D_801E4B34[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E3088)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E3088; -extern s16 *D_801E308C; -extern s32 D_801E309C; -extern s32 D_801E30BC; -extern s32 D_801E30C0; -extern s32 D_801E30C4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E308C != 0) { - D_801E309C = 0; - p = (int *)(param_1 * 12 + (int)D_801E3088); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E30BC != x) { - flag = 1; - if (D_801E30BC < x) { - if (x - D_801E30BC < 5) { - D_801E30BC = x; - } else { - D_801E30BC = D_801E30BC + 4; - } - } else { - if (D_801E30BC - x < 5) { - D_801E30BC = x; - } else { - D_801E30BC = D_801E30BC - 4; - } - } - } - if (D_801E30C0 != y) { - flag = 1; - if (D_801E30C0 < y) { - if (y - D_801E30C0 < 5) { - D_801E30C0 = y; - } else { - D_801E30C0 = D_801E30C0 + 4; - } - } else { - if (D_801E30C0 - y < 5) { - D_801E30C0 = y; - } else { - D_801E30C0 = D_801E30C0 - 4; - } - } - } - if (D_801E30C4 != z) { - flag = 1; - if (D_801E30C4 < z) { - if (z - D_801E30C4 < 5) { - D_801E30C4 = z; - } else { - D_801E30C4 = D_801E30C4 + 4; - } - } else { - if (D_801E30C4 - z < 5) { - D_801E30C4 = z; - } else { - D_801E30C4 = D_801E30C4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E309C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80191284[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E308C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E30BC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E30C0); - uVar5 = (*(int*)&D_801E30C4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80191284); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E30A4; - -s32 func_8013E054(void) { - return D_801E30A4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80191C80; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80191C58; -extern s16 D_80191C5A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80191C80; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80191C58 = 2; - D_80191C5A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80191C5A = 0; - D_80191C58 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E30D8; - extern void * D_801E30DC; - extern unsigned char D_801918F8; - extern unsigned char D_80191910; - extern unsigned char D_80191984; - extern unsigned char D_8019198C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E30D8 = &D_801918F8; - D_801E30DC = &D_80191984; - } else { - D_801E30D8 = &D_80191910; - D_801E30DC = &D_8019198C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80191C80/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80191C80 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80191C80)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80191C5C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80191C5C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80191C5C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80191C58; -extern s16 D_80191C5A; -extern unsigned char D_80191C5C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80191C5A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80191C58` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80191C5A; - if (*r < 3) { - *r = *r + 1; - } - D_80191C58 = (u16)D_80191C58 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80191C5C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80191C5C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80191C5C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_005/ov_SC02_005_jr_801380E0.c b/src/ov_SC02_005/ov_SC02_005_jr_801380E0.c new file mode 100644 index 000000000..69aedb776 --- /dev/null +++ b/src/ov_SC02_005/ov_SC02_005_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E1AD8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80190B78[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E2F94; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E4BE0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E1AD8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801908B4)(); +extern s16 (*D_801908B8)(); +extern M2C_UNK (*D_801908C0)(); +extern s32 (*D_801908C4)(); +extern s32 D_801E2F90; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E1ADC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80190C0C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801940F0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80190C24; +extern M2C_UNK D_80190C2C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80190C34; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80190C50[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80190C5C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80190C70[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80190CC0[]; +extern s16 D_80190CF0[]; +extern s16 D_80190D50[]; +extern s16 D_80190D58[]; +extern s16 D_80190D78[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80190DB0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80190E08[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80190E50[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80190E58[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80190E60[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80190E68[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80190E10; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80190E30; +extern void func_801321B0(int param_1); +extern int D_80190E40; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E3000; +extern s32 D_801E3004[]; +extern int D_801E3008; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80190E74; +extern u8 D_80190E70; +extern s16 *D_80190E78; +extern u8 D_80190E7C; +extern int D_801E3000; +extern u16 D_801E3010; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80190E78; /* holds a pointer value (*(u16**)&D_80190E78) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80190E8C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80190EE0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80190EE4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80190EE4[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80190F28; +extern u8 D_80190F6C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80190F28; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80190F6C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80190FB0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80190FEC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80190FEC; + if (((s16)a1) < 0xC00) { + tbl = D_80190FB0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80191028, D_8019102A, D_8019102C, D_8019102E, D_80191030, D_80191032; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8019102A < ang)) goto outer_else; + if (!(ang < D_80191030)) goto inner_else; + if (ang < D_8019102C) { *(s16 *)L = D_8019102C; goto done; } + if (D_8019102E < ang) { *(s16 *)L = D_8019102E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80191028) { *(s16 *)L = D_80191028; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80191032 < ang) { *(s16 *)L = D_80191032; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E3078; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E3078, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E3078; +extern s8 D_801E307C; +extern s8 D_801E307D; + +void func_8013C9C4(void * arg0) +{ + D_801E3078 = arg0; + D_801E307C = 0; + D_801E307D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E3078; +extern s8 D_801E307C; +extern s8 D_801E307D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E3078; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E307D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E307C)) * 2) + D_801E3078); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E307D = (unsigned char) p[1]; + D_801E307C = D_801E307C + 1; + if (D_801E307D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E307C = 0; + *base = 0; + } + } + else + { + D_801E307D = c - 1; + } + } + return; +} + + + +extern s32 D_801E309C; +extern s32 D_801E3090; +extern s32 D_801E3094; +extern s32 D_801E30A0; + +void func_8013CABC(void) { + D_801E309C = 1; + D_801E3090 = 1; + D_801E3094 = 0; + D_801E30A0 = 1; +} + + + +extern s32 D_801E3090; +extern s32 D_801E3094; +extern s32 D_801E3098; +extern s32 D_801E309C; +extern s32 D_801E30A0; + +void func_8013CAE8(void) { + D_801E3090 = 1; + D_801E309C = 0; + D_801E3094 = 0; + D_801E3098 = -1; + D_801E30A0 = 0; +} + + + +extern s32 D_801E309C; +extern s32 D_801E30A0; +extern s32 D_801E30C8; +extern s32 D_801E30CC; + +void func_8013CB20(void) +{ + D_801E30C8 = D_801E30A0; + D_801E30CC = D_801E309C; + D_801E30A0 = 1; + D_801E309C = 0; +} + + + +extern s32 D_801E30C8; +extern s32 D_801E30CC; +extern s32 D_801E30A0; +extern s32 D_801E309C; + +void func_8013CB5C(void) { + D_801E30A0 = D_801E30C8; + D_801E309C = D_801E30CC; +} + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E4A90; + extern u8 D_801E4A91; + extern u8 D_801E4A92; + extern u8 D_801E4A93; + extern u8 D_801E4A94; + extern u8 D_801E4A95; + extern u8 D_801E4A96; + extern u8 D_801E4A97; + extern u8 D_801E4A98; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E4A90; t1 = D_801E4A91; t2 = D_801E4A92; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E4A93; t1 = D_801E4A94; t2 = D_801E4A95; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E4A96; t1 = D_801E4A97; t2 = D_801E4A98; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E30A8; +extern s32 D_801E3090; +extern s32 D_801E30AC; +extern s32 D_801E309C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E30A8 != 0) { + if (D_801E30A8 != 2) { + if (((D_801E30A8 < 3) && (D_801E30A8 == 1)) && + (D_801E30AC = D_801E30AC + 1, 0x23a < D_801E30AC)) { + D_801E3090 = D_801E30A8; + D_801E30A8 = 2; + } + } else { + D_801E3090 = D_801E3090 + -1; + if (D_801E3090 == 0) { + D_801E3090 = D_801E30A8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E309C == 0) { + D_801E30A8 = D_801E30A8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E309C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E309C; +} + + + +extern s32 D_801E30A8; + +void func_8013D164(void) { + D_801E30A8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E4BDA; +extern u8 D_801E4C58; +extern u8 D_801E4B00; +extern u8 D_801E4BBE; +extern u8 D_801E4A40; +extern u8 D_801E4A99; +extern s32 D_801E4BC0; + +void func_8013D330(void) { + if ((D_801E4BDA & 0xff) != D_801E4C58) { + D_801E4BDA = ((D_801E4BDA & 0xff) < D_801E4C58) ? (D_801E4BDA + 1) : (D_801E4BDA - 1); + } + if ((D_801E4B00 & 0xff) != D_801E4BBE) { + D_801E4B00 = ((D_801E4B00 & 0xff) < D_801E4BBE) ? (D_801E4B00 + 1) : (D_801E4B00 - 1); + } + if ((D_801E4A40 & 0xff) != D_801E4A99) { + D_801E4A40 = ((D_801E4A40 & 0xff) < D_801E4A99) ? (D_801E4A40 + 1) : (D_801E4A40 - 1); + } + D_801E4BC0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E3080; +extern void *D_801E3084; +extern void *D_801E3088; +extern s32 D_801E30B0; +extern s32 D_801E30B4; +extern s32 D_801E30B8; +extern s32 D_801E4B34[]; + +extern u8 D_80191120[]; +extern u8 D_801911C8[]; +extern u8 D_80191078[]; +extern u8 D_80191174[]; +extern u8 D_801911F4[]; +extern u8 D_801910CC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E30B0 = param_2; + D_801E30B4 = (param_2 >> 2) & 3; + D_801E30B8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E3080 = D_80191120; + D_801E3084 = D_801911C8; + D_801E3088 = D_80191078; + } else { + D_801E3080 = D_80191174; + D_801E3084 = D_801911F4; + D_801E3088 = D_801910CC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E30B8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E30B0 & 2) != 0) { + D_801E4B34[0] = 0x140; + D_801E4B34[3] = 0x80; + if (p[0x37] == 4) { + D_801E4B34[0] = 0x140; + D_801E4B34[3] = 0; + } + if (p[0x37] == 0) { + D_801E4B34[0] = 0x140; + D_801E4B34[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E3088)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E3088; +extern s16 *D_801E308C; +extern s32 D_801E309C; +extern s32 D_801E30BC; +extern s32 D_801E30C0; +extern s32 D_801E30C4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E308C != 0) { + D_801E309C = 0; + p = (int *)(param_1 * 12 + (int)D_801E3088); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E30BC != x) { + flag = 1; + if (D_801E30BC < x) { + if (x - D_801E30BC < 5) { + D_801E30BC = x; + } else { + D_801E30BC = D_801E30BC + 4; + } + } else { + if (D_801E30BC - x < 5) { + D_801E30BC = x; + } else { + D_801E30BC = D_801E30BC - 4; + } + } + } + if (D_801E30C0 != y) { + flag = 1; + if (D_801E30C0 < y) { + if (y - D_801E30C0 < 5) { + D_801E30C0 = y; + } else { + D_801E30C0 = D_801E30C0 + 4; + } + } else { + if (D_801E30C0 - y < 5) { + D_801E30C0 = y; + } else { + D_801E30C0 = D_801E30C0 - 4; + } + } + } + if (D_801E30C4 != z) { + flag = 1; + if (D_801E30C4 < z) { + if (z - D_801E30C4 < 5) { + D_801E30C4 = z; + } else { + D_801E30C4 = D_801E30C4 + 4; + } + } else { + if (D_801E30C4 - z < 5) { + D_801E30C4 = z; + } else { + D_801E30C4 = D_801E30C4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E309C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80191284[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E308C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E30BC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E30C0); + uVar5 = (*(int*)&D_801E30C4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80191284); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E30A4; + +s32 func_8013E054(void) { + return D_801E30A4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80191C80; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80191C58; +extern s16 D_80191C5A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80191C80; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80191C58 = 2; + D_80191C5A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80191C5A = 0; + D_80191C58 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E30D8; + extern void * D_801E30DC; + extern unsigned char D_801918F8; + extern unsigned char D_80191910; + extern unsigned char D_80191984; + extern unsigned char D_8019198C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E30D8 = &D_801918F8; + D_801E30DC = &D_80191984; + } else { + D_801E30D8 = &D_80191910; + D_801E30DC = &D_8019198C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80191C80/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80191C80 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80191C80)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80191C5C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80191C5C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80191C5C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80191C58; +extern s16 D_80191C5A; +extern unsigned char D_80191C5C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80191C5A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80191C58` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80191C5A; + if (*r < 3) { + *r = *r + 1; + } + D_80191C58 = (u16)D_80191C58 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80191C5C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80191C5C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80191C5C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_011/ov_SC02_011_jr_8012ACE0.c b/src/ov_SC02_011/ov_SC02_011_jr_8012ACE0.c index 7d17865a9..8060d2886 100644 --- a/src/ov_SC02_011/ov_SC02_011_jr_8012ACE0.c +++ b/src/ov_SC02_011/ov_SC02_011_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80191334[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80191334[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80191378; -extern u8 D_801913BC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80191378; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801913BC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80191400[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8019143C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8019143C; - if (((s16)a1) < 0xC00) { - tbl = D_80191400; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80191478, D_8019147A, D_8019147C, D_8019147E, D_80191480, D_80191482; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8019147A < ang)) goto outer_else; - if (!(ang < D_80191480)) goto inner_else; - if (ang < D_8019147C) { *(s16 *)L = D_8019147C; goto done; } - if (D_8019147E < ang) { *(s16 *)L = D_8019147E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80191478) { *(s16 *)L = D_80191478; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80191482 < ang) { *(s16 *)L = D_80191482; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E9F58; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E9F58, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E9F58; -extern s8 D_801E9F5C; -extern s8 D_801E9F5D; - -void func_8013C9C4(void * arg0) -{ - D_801E9F58 = arg0; - D_801E9F5C = 0; - D_801E9F5D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E9F58; -extern s8 D_801E9F5C; -extern s8 D_801E9F5D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E9F58; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E9F5D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E9F5C)) * 2) + D_801E9F58); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E9F5D = (unsigned char) p[1]; - D_801E9F5C = D_801E9F5C + 1; - if (D_801E9F5D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E9F5C = 0; - *base = 0; - } - } - else - { - D_801E9F5D = c - 1; - } - } - return; -} - - - -extern s32 D_801E9F7C; -extern s32 D_801E9F70; -extern s32 D_801E9F74; -extern s32 D_801E9F80; - -void func_8013CABC(void) { - D_801E9F7C = 1; - D_801E9F70 = 1; - D_801E9F74 = 0; - D_801E9F80 = 1; -} - - - -extern s32 D_801E9F70; -extern s32 D_801E9F74; -extern s32 D_801E9F78; -extern s32 D_801E9F7C; -extern s32 D_801E9F80; - -void func_8013CAE8(void) { - D_801E9F70 = 1; - D_801E9F7C = 0; - D_801E9F74 = 0; - D_801E9F78 = -1; - D_801E9F80 = 0; -} - - - -extern s32 D_801E9F7C; -extern s32 D_801E9F80; -extern s32 D_801E9FA8; -extern s32 D_801E9FAC; - -void func_8013CB20(void) -{ - D_801E9FA8 = D_801E9F80; - D_801E9FAC = D_801E9F7C; - D_801E9F80 = 1; - D_801E9F7C = 0; -} - - - -extern s32 D_801E9FA8; -extern s32 D_801E9FAC; -extern s32 D_801E9F80; -extern s32 D_801E9F7C; - -void func_8013CB5C(void) { - D_801E9F80 = D_801E9FA8; - D_801E9F7C = D_801E9FAC; -} - - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EB928; - extern u8 D_801EB929; - extern u8 D_801EB92A; - extern u8 D_801EB92B; - extern u8 D_801EB92C; - extern u8 D_801EB92D; - extern u8 D_801EB92E; - extern u8 D_801EB92F; - extern u8 D_801EB930; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EB928; t1 = D_801EB929; t2 = D_801EB92A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EB92B; t1 = D_801EB92C; t2 = D_801EB92D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EB92E; t1 = D_801EB92F; t2 = D_801EB930; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E9F88; -extern s32 D_801E9F70; -extern s32 D_801E9F8C; -extern s32 D_801E9F7C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E9F88 != 0) { - if (D_801E9F88 != 2) { - if (((D_801E9F88 < 3) && (D_801E9F88 == 1)) && - (D_801E9F8C = D_801E9F8C + 1, 0x23a < D_801E9F8C)) { - D_801E9F70 = D_801E9F88; - D_801E9F88 = 2; - } - } else { - D_801E9F70 = D_801E9F70 + -1; - if (D_801E9F70 == 0) { - D_801E9F70 = D_801E9F88; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E9F7C == 0) { - D_801E9F88 = D_801E9F88 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E9F7C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E9F7C; -} - - - -extern s32 D_801E9F88; - -void func_8013D164(void) { - D_801E9F88 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EBA0A; -extern u8 D_801EBA7E; -extern u8 D_801EB932; -extern u8 D_801EB9EC; -extern u8 D_801EB910; -extern u8 D_801EB931; -extern s32 D_801EB9F0; - -void func_8013D330(void) { - if ((D_801EBA0A & 0xff) != D_801EBA7E) { - D_801EBA0A = ((D_801EBA0A & 0xff) < D_801EBA7E) ? (D_801EBA0A + 1) : (D_801EBA0A - 1); - } - if ((D_801EB932 & 0xff) != D_801EB9EC) { - D_801EB932 = ((D_801EB932 & 0xff) < D_801EB9EC) ? (D_801EB932 + 1) : (D_801EB932 - 1); - } - if ((D_801EB910 & 0xff) != D_801EB931) { - D_801EB910 = ((D_801EB910 & 0xff) < D_801EB931) ? (D_801EB910 + 1) : (D_801EB910 - 1); - } - D_801EB9F0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E9F60; -extern void *D_801E9F64; -extern void *D_801E9F68; -extern s32 D_801E9F90; -extern s32 D_801E9F94; -extern s32 D_801E9F98; -extern s32 D_801EB964[]; - -extern u8 D_80191570[]; -extern u8 D_80191618[]; -extern u8 D_801914C8[]; -extern u8 D_801915C4[]; -extern u8 D_80191644[]; -extern u8 D_8019151C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E9F90 = param_2; - D_801E9F94 = (param_2 >> 2) & 3; - D_801E9F98 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E9F60 = D_80191570; - D_801E9F64 = D_80191618; - D_801E9F68 = D_801914C8; - } else { - D_801E9F60 = D_801915C4; - D_801E9F64 = D_80191644; - D_801E9F68 = D_8019151C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E9F98 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E9F90 & 2) != 0) { - D_801EB964[0] = 0x140; - D_801EB964[3] = 0x80; - if (p[0x37] == 4) { - D_801EB964[0] = 0x140; - D_801EB964[3] = 0; - } - if (p[0x37] == 0) { - D_801EB964[0] = 0x140; - D_801EB964[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E9F68)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E9F68; -extern s16 *D_801E9F6C; -extern s32 D_801E9F7C; -extern s32 D_801E9F9C; -extern s32 D_801E9FA0; -extern s32 D_801E9FA4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E9F6C != 0) { - D_801E9F7C = 0; - p = (int *)(param_1 * 12 + (int)D_801E9F68); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E9F9C != x) { - flag = 1; - if (D_801E9F9C < x) { - if (x - D_801E9F9C < 5) { - D_801E9F9C = x; - } else { - D_801E9F9C = D_801E9F9C + 4; - } - } else { - if (D_801E9F9C - x < 5) { - D_801E9F9C = x; - } else { - D_801E9F9C = D_801E9F9C - 4; - } - } - } - if (D_801E9FA0 != y) { - flag = 1; - if (D_801E9FA0 < y) { - if (y - D_801E9FA0 < 5) { - D_801E9FA0 = y; - } else { - D_801E9FA0 = D_801E9FA0 + 4; - } - } else { - if (D_801E9FA0 - y < 5) { - D_801E9FA0 = y; - } else { - D_801E9FA0 = D_801E9FA0 - 4; - } - } - } - if (D_801E9FA4 != z) { - flag = 1; - if (D_801E9FA4 < z) { - if (z - D_801E9FA4 < 5) { - D_801E9FA4 = z; - } else { - D_801E9FA4 = D_801E9FA4 + 4; - } - } else { - if (D_801E9FA4 - z < 5) { - D_801E9FA4 = z; - } else { - D_801E9FA4 = D_801E9FA4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E9F7C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801916D4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E9F6C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E9F9C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E9FA0); - uVar5 = (*(int*)&D_801E9FA4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801916D4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E9F84; - -s32 func_8013E054(void) { - return D_801E9F84; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801920D0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801920A8; -extern s16 D_801920AA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801920D0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801920A8 = 2; - D_801920AA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801920AA = 0; - D_801920A8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E9FB8; - extern void * D_801E9FBC; - extern unsigned char D_80191D48; - extern unsigned char D_80191D60; - extern unsigned char D_80191DD4; - extern unsigned char D_80191DDC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E9FB8 = &D_80191D48; - D_801E9FBC = &D_80191DD4; - } else { - D_801E9FB8 = &D_80191D60; - D_801E9FBC = &D_80191DDC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801920D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801920D0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801920D0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801920AC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801920AC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801920AC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801920A8; -extern s16 D_801920AA; -extern unsigned char D_801920AC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801920AA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801920A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801920AA; - if (*r < 3) { - *r = *r + 1; - } - D_801920A8 = (u16)D_801920A8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801920AC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801920AC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801920AC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_011/ov_SC02_011_jr_801380E0.c b/src/ov_SC02_011/ov_SC02_011_jr_801380E0.c new file mode 100644 index 000000000..a9e63d0c2 --- /dev/null +++ b/src/ov_SC02_011/ov_SC02_011_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E8C34; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80190FC8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E9E74; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EBA10; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E8C34; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80190D04)(); +extern s16 (*D_80190D08)(); +extern M2C_UNK (*D_80190D10)(); +extern s32 (*D_80190D14)(); +extern s32 D_801E9E70; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E8C38; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8019105C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80194540; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80191074; +extern M2C_UNK D_8019107C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80191084; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801910A0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801910AC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801910C0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80191110[]; +extern s16 D_80191140[]; +extern s16 D_801911A0[]; +extern s16 D_801911A8[]; +extern s16 D_801911C8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80191200[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80191258[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801912A0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801912A8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801912B0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801912B8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80191260; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80191280; +extern void func_801321B0(int param_1); +extern int D_80191290; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E9EE0; +extern s32 D_801E9EE4[]; +extern int D_801E9EE8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801912C4; +extern u8 D_801912C0; +extern s16 *D_801912C8; +extern u8 D_801912CC; +extern int D_801E9EE0; +extern u16 D_801E9EF0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801912C8; /* holds a pointer value (*(u16**)&D_801912C8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801912DC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80191330; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80191334[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80191334[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80191378; +extern u8 D_801913BC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80191378; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801913BC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80191400[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8019143C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8019143C; + if (((s16)a1) < 0xC00) { + tbl = D_80191400; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80191478, D_8019147A, D_8019147C, D_8019147E, D_80191480, D_80191482; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8019147A < ang)) goto outer_else; + if (!(ang < D_80191480)) goto inner_else; + if (ang < D_8019147C) { *(s16 *)L = D_8019147C; goto done; } + if (D_8019147E < ang) { *(s16 *)L = D_8019147E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80191478) { *(s16 *)L = D_80191478; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80191482 < ang) { *(s16 *)L = D_80191482; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E9F58; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E9F58, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E9F58; +extern s8 D_801E9F5C; +extern s8 D_801E9F5D; + +void func_8013C9C4(void * arg0) +{ + D_801E9F58 = arg0; + D_801E9F5C = 0; + D_801E9F5D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E9F58; +extern s8 D_801E9F5C; +extern s8 D_801E9F5D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E9F58; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E9F5D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E9F5C)) * 2) + D_801E9F58); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E9F5D = (unsigned char) p[1]; + D_801E9F5C = D_801E9F5C + 1; + if (D_801E9F5D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E9F5C = 0; + *base = 0; + } + } + else + { + D_801E9F5D = c - 1; + } + } + return; +} + + + +extern s32 D_801E9F7C; +extern s32 D_801E9F70; +extern s32 D_801E9F74; +extern s32 D_801E9F80; + +void func_8013CABC(void) { + D_801E9F7C = 1; + D_801E9F70 = 1; + D_801E9F74 = 0; + D_801E9F80 = 1; +} + + + +extern s32 D_801E9F70; +extern s32 D_801E9F74; +extern s32 D_801E9F78; +extern s32 D_801E9F7C; +extern s32 D_801E9F80; + +void func_8013CAE8(void) { + D_801E9F70 = 1; + D_801E9F7C = 0; + D_801E9F74 = 0; + D_801E9F78 = -1; + D_801E9F80 = 0; +} + + + +extern s32 D_801E9F7C; +extern s32 D_801E9F80; +extern s32 D_801E9FA8; +extern s32 D_801E9FAC; + +void func_8013CB20(void) +{ + D_801E9FA8 = D_801E9F80; + D_801E9FAC = D_801E9F7C; + D_801E9F80 = 1; + D_801E9F7C = 0; +} + + + +extern s32 D_801E9FA8; +extern s32 D_801E9FAC; +extern s32 D_801E9F80; +extern s32 D_801E9F7C; + +void func_8013CB5C(void) { + D_801E9F80 = D_801E9FA8; + D_801E9F7C = D_801E9FAC; +} + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EB928; + extern u8 D_801EB929; + extern u8 D_801EB92A; + extern u8 D_801EB92B; + extern u8 D_801EB92C; + extern u8 D_801EB92D; + extern u8 D_801EB92E; + extern u8 D_801EB92F; + extern u8 D_801EB930; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EB928; t1 = D_801EB929; t2 = D_801EB92A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EB92B; t1 = D_801EB92C; t2 = D_801EB92D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EB92E; t1 = D_801EB92F; t2 = D_801EB930; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E9F88; +extern s32 D_801E9F70; +extern s32 D_801E9F8C; +extern s32 D_801E9F7C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E9F88 != 0) { + if (D_801E9F88 != 2) { + if (((D_801E9F88 < 3) && (D_801E9F88 == 1)) && + (D_801E9F8C = D_801E9F8C + 1, 0x23a < D_801E9F8C)) { + D_801E9F70 = D_801E9F88; + D_801E9F88 = 2; + } + } else { + D_801E9F70 = D_801E9F70 + -1; + if (D_801E9F70 == 0) { + D_801E9F70 = D_801E9F88; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E9F7C == 0) { + D_801E9F88 = D_801E9F88 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E9F7C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E9F7C; +} + + + +extern s32 D_801E9F88; + +void func_8013D164(void) { + D_801E9F88 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EBA0A; +extern u8 D_801EBA7E; +extern u8 D_801EB932; +extern u8 D_801EB9EC; +extern u8 D_801EB910; +extern u8 D_801EB931; +extern s32 D_801EB9F0; + +void func_8013D330(void) { + if ((D_801EBA0A & 0xff) != D_801EBA7E) { + D_801EBA0A = ((D_801EBA0A & 0xff) < D_801EBA7E) ? (D_801EBA0A + 1) : (D_801EBA0A - 1); + } + if ((D_801EB932 & 0xff) != D_801EB9EC) { + D_801EB932 = ((D_801EB932 & 0xff) < D_801EB9EC) ? (D_801EB932 + 1) : (D_801EB932 - 1); + } + if ((D_801EB910 & 0xff) != D_801EB931) { + D_801EB910 = ((D_801EB910 & 0xff) < D_801EB931) ? (D_801EB910 + 1) : (D_801EB910 - 1); + } + D_801EB9F0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E9F60; +extern void *D_801E9F64; +extern void *D_801E9F68; +extern s32 D_801E9F90; +extern s32 D_801E9F94; +extern s32 D_801E9F98; +extern s32 D_801EB964[]; + +extern u8 D_80191570[]; +extern u8 D_80191618[]; +extern u8 D_801914C8[]; +extern u8 D_801915C4[]; +extern u8 D_80191644[]; +extern u8 D_8019151C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E9F90 = param_2; + D_801E9F94 = (param_2 >> 2) & 3; + D_801E9F98 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E9F60 = D_80191570; + D_801E9F64 = D_80191618; + D_801E9F68 = D_801914C8; + } else { + D_801E9F60 = D_801915C4; + D_801E9F64 = D_80191644; + D_801E9F68 = D_8019151C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E9F98 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E9F90 & 2) != 0) { + D_801EB964[0] = 0x140; + D_801EB964[3] = 0x80; + if (p[0x37] == 4) { + D_801EB964[0] = 0x140; + D_801EB964[3] = 0; + } + if (p[0x37] == 0) { + D_801EB964[0] = 0x140; + D_801EB964[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E9F68)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E9F68; +extern s16 *D_801E9F6C; +extern s32 D_801E9F7C; +extern s32 D_801E9F9C; +extern s32 D_801E9FA0; +extern s32 D_801E9FA4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E9F6C != 0) { + D_801E9F7C = 0; + p = (int *)(param_1 * 12 + (int)D_801E9F68); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E9F9C != x) { + flag = 1; + if (D_801E9F9C < x) { + if (x - D_801E9F9C < 5) { + D_801E9F9C = x; + } else { + D_801E9F9C = D_801E9F9C + 4; + } + } else { + if (D_801E9F9C - x < 5) { + D_801E9F9C = x; + } else { + D_801E9F9C = D_801E9F9C - 4; + } + } + } + if (D_801E9FA0 != y) { + flag = 1; + if (D_801E9FA0 < y) { + if (y - D_801E9FA0 < 5) { + D_801E9FA0 = y; + } else { + D_801E9FA0 = D_801E9FA0 + 4; + } + } else { + if (D_801E9FA0 - y < 5) { + D_801E9FA0 = y; + } else { + D_801E9FA0 = D_801E9FA0 - 4; + } + } + } + if (D_801E9FA4 != z) { + flag = 1; + if (D_801E9FA4 < z) { + if (z - D_801E9FA4 < 5) { + D_801E9FA4 = z; + } else { + D_801E9FA4 = D_801E9FA4 + 4; + } + } else { + if (D_801E9FA4 - z < 5) { + D_801E9FA4 = z; + } else { + D_801E9FA4 = D_801E9FA4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E9F7C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801916D4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E9F6C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E9F9C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E9FA0); + uVar5 = (*(int*)&D_801E9FA4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801916D4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E9F84; + +s32 func_8013E054(void) { + return D_801E9F84; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801920D0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801920A8; +extern s16 D_801920AA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801920D0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801920A8 = 2; + D_801920AA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801920AA = 0; + D_801920A8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E9FB8; + extern void * D_801E9FBC; + extern unsigned char D_80191D48; + extern unsigned char D_80191D60; + extern unsigned char D_80191DD4; + extern unsigned char D_80191DDC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E9FB8 = &D_80191D48; + D_801E9FBC = &D_80191DD4; + } else { + D_801E9FB8 = &D_80191D60; + D_801E9FBC = &D_80191DDC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801920D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801920D0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801920D0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801920AC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801920AC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801920AC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801920A8; +extern s16 D_801920AA; +extern unsigned char D_801920AC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801920AA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801920A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801920AA; + if (*r < 3) { + *r = *r + 1; + } + D_801920A8 = (u16)D_801920A8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801920AC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801920AC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801920AC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_015/ov_SC02_015_jr_8012ACE0.c b/src/ov_SC02_015/ov_SC02_015_jr_8012ACE0.c index 6bcccb501..051816534 100644 --- a/src/ov_SC02_015/ov_SC02_015_jr_8012ACE0.c +++ b/src/ov_SC02_015/ov_SC02_015_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E848[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E848[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E88C; -extern u8 D_8017E8D0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E88C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E8D0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E914[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E950[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E950; - if (((s16)a1) < 0xC00) { - tbl = D_8017E914; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E98C, D_8017E98E, D_8017E990, D_8017E992, D_8017E994, D_8017E996; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E98E < ang)) goto outer_else; - if (!(ang < D_8017E994)) goto inner_else; - if (ang < D_8017E990) { *(s16 *)L = D_8017E990; goto done; } - if (D_8017E992 < ang) { *(s16 *)L = D_8017E992; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E98C) { *(s16 *)L = D_8017E98C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E996 < ang) { *(s16 *)L = D_8017E996; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018F0D8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018F0D8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018F0D8; -extern s8 D_8018F0DC; -extern s8 D_8018F0DD; - -void func_8013C9C4(void * arg0) -{ - D_8018F0D8 = arg0; - D_8018F0DC = 0; - D_8018F0DD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018F0D8; -extern s8 D_8018F0DC; -extern s8 D_8018F0DD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018F0D8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018F0DD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018F0DC)) * 2) + D_8018F0D8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018F0DD = (unsigned char) p[1]; - D_8018F0DC = D_8018F0DC + 1; - if (D_8018F0DD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018F0DC = 0; - *base = 0; - } - } - else - { - D_8018F0DD = c - 1; - } - } - return; -} - - - -extern s32 D_8018F0FC; -extern s32 D_8018F0F0; -extern s32 D_8018F0F4; -extern s32 D_8018F100; - -void func_8013CABC(void) { - D_8018F0FC = 1; - D_8018F0F0 = 1; - D_8018F0F4 = 0; - D_8018F100 = 1; -} - - - -extern s32 D_8018F0F0; -extern s32 D_8018F0F4; -extern s32 D_8018F0F8; -extern s32 D_8018F0FC; -extern s32 D_8018F100; - -void func_8013CAE8(void) { - D_8018F0F0 = 1; - D_8018F0FC = 0; - D_8018F0F4 = 0; - D_8018F0F8 = -1; - D_8018F100 = 0; -} - - - -extern s32 D_8018F0FC; -extern s32 D_8018F100; -extern s32 D_8018F128; -extern s32 D_8018F12C; - -void func_8013CB20(void) -{ - D_8018F128 = D_8018F100; - D_8018F12C = D_8018F0FC; - D_8018F100 = 1; - D_8018F0FC = 0; -} - - - -extern s32 D_8018F128; -extern s32 D_8018F12C; -extern s32 D_8018F100; -extern s32 D_8018F0FC; - -void func_8013CB5C(void) { - D_8018F100 = D_8018F128; - D_8018F0FC = D_8018F12C; -} - - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80190548; - extern u8 D_80190549; - extern u8 D_8019054A; - extern u8 D_8019054B; - extern u8 D_8019054C; - extern u8 D_8019054D; - extern u8 D_8019054E; - extern u8 D_8019054F; - extern u8 D_80190550; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80190548; t1 = D_80190549; t2 = D_8019054A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019054B; t1 = D_8019054C; t2 = D_8019054D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019054E; t1 = D_8019054F; t2 = D_80190550; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018F108; -extern s32 D_8018F0F0; -extern s32 D_8018F10C; -extern s32 D_8018F0FC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018F108 != 0) { - if (D_8018F108 != 2) { - if (((D_8018F108 < 3) && (D_8018F108 == 1)) && - (D_8018F10C = D_8018F10C + 1, 0x23a < D_8018F10C)) { - D_8018F0F0 = D_8018F108; - D_8018F108 = 2; - } - } else { - D_8018F0F0 = D_8018F0F0 + -1; - if (D_8018F0F0 == 0) { - D_8018F0F0 = D_8018F108; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018F0FC == 0) { - D_8018F108 = D_8018F108 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018F0FC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018F0FC; -} - - - -extern s32 D_8018F108; - -void func_8013D164(void) { - D_8018F108 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019062A; -extern u8 D_8019069E; -extern u8 D_80190552; -extern u8 D_8019060C; -extern u8 D_80190530; -extern u8 D_80190551; -extern s32 D_80190610; - -void func_8013D330(void) { - if ((D_8019062A & 0xff) != D_8019069E) { - D_8019062A = ((D_8019062A & 0xff) < D_8019069E) ? (D_8019062A + 1) : (D_8019062A - 1); - } - if ((D_80190552 & 0xff) != D_8019060C) { - D_80190552 = ((D_80190552 & 0xff) < D_8019060C) ? (D_80190552 + 1) : (D_80190552 - 1); - } - if ((D_80190530 & 0xff) != D_80190551) { - D_80190530 = ((D_80190530 & 0xff) < D_80190551) ? (D_80190530 + 1) : (D_80190530 - 1); - } - D_80190610 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018F0E0; -extern void *D_8018F0E4; -extern void *D_8018F0E8; -extern s32 D_8018F110; -extern s32 D_8018F114; -extern s32 D_8018F118; -extern s32 D_80190584[]; - -extern u8 D_8017EA84[]; -extern u8 D_8017EB2C[]; -extern u8 D_8017E9DC[]; -extern u8 D_8017EAD8[]; -extern u8 D_8017EB58[]; -extern u8 D_8017EA30[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018F110 = param_2; - D_8018F114 = (param_2 >> 2) & 3; - D_8018F118 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018F0E0 = D_8017EA84; - D_8018F0E4 = D_8017EB2C; - D_8018F0E8 = D_8017E9DC; - } else { - D_8018F0E0 = D_8017EAD8; - D_8018F0E4 = D_8017EB58; - D_8018F0E8 = D_8017EA30; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018F118 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018F110 & 2) != 0) { - D_80190584[0] = 0x140; - D_80190584[3] = 0x80; - if (p[0x37] == 4) { - D_80190584[0] = 0x140; - D_80190584[3] = 0; - } - if (p[0x37] == 0) { - D_80190584[0] = 0x140; - D_80190584[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018F0E8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018F0E8; -extern s16 *D_8018F0EC; -extern s32 D_8018F0FC; -extern s32 D_8018F11C; -extern s32 D_8018F120; -extern s32 D_8018F124; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018F0EC != 0) { - D_8018F0FC = 0; - p = (int *)(param_1 * 12 + (int)D_8018F0E8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018F11C != x) { - flag = 1; - if (D_8018F11C < x) { - if (x - D_8018F11C < 5) { - D_8018F11C = x; - } else { - D_8018F11C = D_8018F11C + 4; - } - } else { - if (D_8018F11C - x < 5) { - D_8018F11C = x; - } else { - D_8018F11C = D_8018F11C - 4; - } - } - } - if (D_8018F120 != y) { - flag = 1; - if (D_8018F120 < y) { - if (y - D_8018F120 < 5) { - D_8018F120 = y; - } else { - D_8018F120 = D_8018F120 + 4; - } - } else { - if (D_8018F120 - y < 5) { - D_8018F120 = y; - } else { - D_8018F120 = D_8018F120 - 4; - } - } - } - if (D_8018F124 != z) { - flag = 1; - if (D_8018F124 < z) { - if (z - D_8018F124 < 5) { - D_8018F124 = z; - } else { - D_8018F124 = D_8018F124 + 4; - } - } else { - if (D_8018F124 - z < 5) { - D_8018F124 = z; - } else { - D_8018F124 = D_8018F124 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018F0FC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017EBE8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018F0EC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018F11C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018F120); - uVar5 = (*(int*)&D_8018F124); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017EBE8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018F104; - -s32 func_8013E054(void) { - return D_8018F104; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F5E4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F5BC; -extern s16 D_8017F5BE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F5E4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F5BC = 2; - D_8017F5BE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F5BE = 0; - D_8017F5BC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018F138; - extern void * D_8018F13C; - extern unsigned char D_8017F25C; - extern unsigned char D_8017F274; - extern unsigned char D_8017F2E8; - extern unsigned char D_8017F2F0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018F138 = &D_8017F25C; - D_8018F13C = &D_8017F2E8; - } else { - D_8018F138 = &D_8017F274; - D_8018F13C = &D_8017F2F0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F5E4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F5E4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F5E4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F5C0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F5C0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F5C0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F5BC; -extern s16 D_8017F5BE; -extern unsigned char D_8017F5C0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F5BE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F5BC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F5BE; - if (*r < 3) { - *r = *r + 1; - } - D_8017F5BC = (u16)D_8017F5BC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F5C0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F5C0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F5C0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_015/ov_SC02_015_jr_801380E0.c b/src/ov_SC02_015/ov_SC02_015_jr_801380E0.c new file mode 100644 index 000000000..306eb6772 --- /dev/null +++ b/src/ov_SC02_015/ov_SC02_015_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018DE8C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E4DC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018EFF4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80190630; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018DE8C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E218)(); +extern s16 (*D_8017E21C)(); +extern M2C_UNK (*D_8017E224)(); +extern s32 (*D_8017E228)(); +extern s32 D_8018EFF0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018DE90; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E570; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181A54; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E588; +extern M2C_UNK D_8017E590; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E598; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E5B4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E5C0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E5D4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E624[]; +extern s16 D_8017E654[]; +extern s16 D_8017E6B4[]; +extern s16 D_8017E6BC[]; +extern s16 D_8017E6DC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E714[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E76C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E7B4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E7BC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E7C4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E7CC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E774; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E794; +extern void func_801321B0(int param_1); +extern int D_8017E7A4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018F060; +extern s32 D_8018F064[]; +extern int D_8018F068; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E7D8; +extern u8 D_8017E7D4; +extern s16 *D_8017E7DC; +extern u8 D_8017E7E0; +extern int D_8018F060; +extern u16 D_8018F070; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E7DC; /* holds a pointer value (*(u16**)&D_8017E7DC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E7F0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E844; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E848[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E848[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E88C; +extern u8 D_8017E8D0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E88C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E8D0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E914[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E950[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E950; + if (((s16)a1) < 0xC00) { + tbl = D_8017E914; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E98C, D_8017E98E, D_8017E990, D_8017E992, D_8017E994, D_8017E996; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E98E < ang)) goto outer_else; + if (!(ang < D_8017E994)) goto inner_else; + if (ang < D_8017E990) { *(s16 *)L = D_8017E990; goto done; } + if (D_8017E992 < ang) { *(s16 *)L = D_8017E992; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E98C) { *(s16 *)L = D_8017E98C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E996 < ang) { *(s16 *)L = D_8017E996; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018F0D8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018F0D8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018F0D8; +extern s8 D_8018F0DC; +extern s8 D_8018F0DD; + +void func_8013C9C4(void * arg0) +{ + D_8018F0D8 = arg0; + D_8018F0DC = 0; + D_8018F0DD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018F0D8; +extern s8 D_8018F0DC; +extern s8 D_8018F0DD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018F0D8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018F0DD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018F0DC)) * 2) + D_8018F0D8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018F0DD = (unsigned char) p[1]; + D_8018F0DC = D_8018F0DC + 1; + if (D_8018F0DD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018F0DC = 0; + *base = 0; + } + } + else + { + D_8018F0DD = c - 1; + } + } + return; +} + + + +extern s32 D_8018F0FC; +extern s32 D_8018F0F0; +extern s32 D_8018F0F4; +extern s32 D_8018F100; + +void func_8013CABC(void) { + D_8018F0FC = 1; + D_8018F0F0 = 1; + D_8018F0F4 = 0; + D_8018F100 = 1; +} + + + +extern s32 D_8018F0F0; +extern s32 D_8018F0F4; +extern s32 D_8018F0F8; +extern s32 D_8018F0FC; +extern s32 D_8018F100; + +void func_8013CAE8(void) { + D_8018F0F0 = 1; + D_8018F0FC = 0; + D_8018F0F4 = 0; + D_8018F0F8 = -1; + D_8018F100 = 0; +} + + + +extern s32 D_8018F0FC; +extern s32 D_8018F100; +extern s32 D_8018F128; +extern s32 D_8018F12C; + +void func_8013CB20(void) +{ + D_8018F128 = D_8018F100; + D_8018F12C = D_8018F0FC; + D_8018F100 = 1; + D_8018F0FC = 0; +} + + + +extern s32 D_8018F128; +extern s32 D_8018F12C; +extern s32 D_8018F100; +extern s32 D_8018F0FC; + +void func_8013CB5C(void) { + D_8018F100 = D_8018F128; + D_8018F0FC = D_8018F12C; +} + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80190548; + extern u8 D_80190549; + extern u8 D_8019054A; + extern u8 D_8019054B; + extern u8 D_8019054C; + extern u8 D_8019054D; + extern u8 D_8019054E; + extern u8 D_8019054F; + extern u8 D_80190550; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80190548; t1 = D_80190549; t2 = D_8019054A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019054B; t1 = D_8019054C; t2 = D_8019054D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019054E; t1 = D_8019054F; t2 = D_80190550; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018F108; +extern s32 D_8018F0F0; +extern s32 D_8018F10C; +extern s32 D_8018F0FC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018F108 != 0) { + if (D_8018F108 != 2) { + if (((D_8018F108 < 3) && (D_8018F108 == 1)) && + (D_8018F10C = D_8018F10C + 1, 0x23a < D_8018F10C)) { + D_8018F0F0 = D_8018F108; + D_8018F108 = 2; + } + } else { + D_8018F0F0 = D_8018F0F0 + -1; + if (D_8018F0F0 == 0) { + D_8018F0F0 = D_8018F108; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018F0FC == 0) { + D_8018F108 = D_8018F108 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018F0FC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018F0FC; +} + + + +extern s32 D_8018F108; + +void func_8013D164(void) { + D_8018F108 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019062A; +extern u8 D_8019069E; +extern u8 D_80190552; +extern u8 D_8019060C; +extern u8 D_80190530; +extern u8 D_80190551; +extern s32 D_80190610; + +void func_8013D330(void) { + if ((D_8019062A & 0xff) != D_8019069E) { + D_8019062A = ((D_8019062A & 0xff) < D_8019069E) ? (D_8019062A + 1) : (D_8019062A - 1); + } + if ((D_80190552 & 0xff) != D_8019060C) { + D_80190552 = ((D_80190552 & 0xff) < D_8019060C) ? (D_80190552 + 1) : (D_80190552 - 1); + } + if ((D_80190530 & 0xff) != D_80190551) { + D_80190530 = ((D_80190530 & 0xff) < D_80190551) ? (D_80190530 + 1) : (D_80190530 - 1); + } + D_80190610 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018F0E0; +extern void *D_8018F0E4; +extern void *D_8018F0E8; +extern s32 D_8018F110; +extern s32 D_8018F114; +extern s32 D_8018F118; +extern s32 D_80190584[]; + +extern u8 D_8017EA84[]; +extern u8 D_8017EB2C[]; +extern u8 D_8017E9DC[]; +extern u8 D_8017EAD8[]; +extern u8 D_8017EB58[]; +extern u8 D_8017EA30[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018F110 = param_2; + D_8018F114 = (param_2 >> 2) & 3; + D_8018F118 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018F0E0 = D_8017EA84; + D_8018F0E4 = D_8017EB2C; + D_8018F0E8 = D_8017E9DC; + } else { + D_8018F0E0 = D_8017EAD8; + D_8018F0E4 = D_8017EB58; + D_8018F0E8 = D_8017EA30; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018F118 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018F110 & 2) != 0) { + D_80190584[0] = 0x140; + D_80190584[3] = 0x80; + if (p[0x37] == 4) { + D_80190584[0] = 0x140; + D_80190584[3] = 0; + } + if (p[0x37] == 0) { + D_80190584[0] = 0x140; + D_80190584[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018F0E8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018F0E8; +extern s16 *D_8018F0EC; +extern s32 D_8018F0FC; +extern s32 D_8018F11C; +extern s32 D_8018F120; +extern s32 D_8018F124; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018F0EC != 0) { + D_8018F0FC = 0; + p = (int *)(param_1 * 12 + (int)D_8018F0E8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018F11C != x) { + flag = 1; + if (D_8018F11C < x) { + if (x - D_8018F11C < 5) { + D_8018F11C = x; + } else { + D_8018F11C = D_8018F11C + 4; + } + } else { + if (D_8018F11C - x < 5) { + D_8018F11C = x; + } else { + D_8018F11C = D_8018F11C - 4; + } + } + } + if (D_8018F120 != y) { + flag = 1; + if (D_8018F120 < y) { + if (y - D_8018F120 < 5) { + D_8018F120 = y; + } else { + D_8018F120 = D_8018F120 + 4; + } + } else { + if (D_8018F120 - y < 5) { + D_8018F120 = y; + } else { + D_8018F120 = D_8018F120 - 4; + } + } + } + if (D_8018F124 != z) { + flag = 1; + if (D_8018F124 < z) { + if (z - D_8018F124 < 5) { + D_8018F124 = z; + } else { + D_8018F124 = D_8018F124 + 4; + } + } else { + if (D_8018F124 - z < 5) { + D_8018F124 = z; + } else { + D_8018F124 = D_8018F124 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018F0FC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017EBE8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018F0EC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018F11C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018F120); + uVar5 = (*(int*)&D_8018F124); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017EBE8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018F104; + +s32 func_8013E054(void) { + return D_8018F104; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F5E4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F5BC; +extern s16 D_8017F5BE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F5E4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F5BC = 2; + D_8017F5BE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F5BE = 0; + D_8017F5BC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018F138; + extern void * D_8018F13C; + extern unsigned char D_8017F25C; + extern unsigned char D_8017F274; + extern unsigned char D_8017F2E8; + extern unsigned char D_8017F2F0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018F138 = &D_8017F25C; + D_8018F13C = &D_8017F2E8; + } else { + D_8018F138 = &D_8017F274; + D_8018F13C = &D_8017F2F0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F5E4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F5E4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F5E4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F5C0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F5C0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F5C0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F5BC; +extern s16 D_8017F5BE; +extern unsigned char D_8017F5C0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F5BE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F5BC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F5BE; + if (*r < 3) { + *r = *r + 1; + } + D_8017F5BC = (u16)D_8017F5BC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F5C0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F5C0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F5C0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_015/nonmatchings/ov_SC02_015_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_016/ov_SC02_016_jr_8012ACE0.c b/src/ov_SC02_016/ov_SC02_016_jr_8012ACE0.c index 824ccc858..6c3a365e8 100644 --- a/src/ov_SC02_016/ov_SC02_016_jr_8012ACE0.c +++ b/src/ov_SC02_016/ov_SC02_016_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184A80[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184A80[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184AC4; -extern u8 D_80184B08; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184AC4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184B08 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184B4C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80184B88[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80184B88; - if (((s16)a1) < 0xC00) { - tbl = D_80184B4C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80184BC4, D_80184BC6, D_80184BC8, D_80184BCA, D_80184BCC, D_80184BCE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80184BC6 < ang)) goto outer_else; - if (!(ang < D_80184BCC)) goto inner_else; - if (ang < D_80184BC8) { *(s16 *)L = D_80184BC8; goto done; } - if (D_80184BCA < ang) { *(s16 *)L = D_80184BCA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80184BC4) { *(s16 *)L = D_80184BC4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80184BCE < ang) { *(s16 *)L = D_80184BCE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B2CF0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B2CF0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B2CF0; -extern s8 D_801B2CF4; -extern s8 D_801B2CF5; - -void func_8013C9C4(void * arg0) -{ - D_801B2CF0 = arg0; - D_801B2CF4 = 0; - D_801B2CF5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B2CF0; -extern s8 D_801B2CF4; -extern s8 D_801B2CF5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B2CF0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B2CF5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B2CF4)) * 2) + D_801B2CF0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B2CF5 = (unsigned char) p[1]; - D_801B2CF4 = D_801B2CF4 + 1; - if (D_801B2CF5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B2CF4 = 0; - *base = 0; - } - } - else - { - D_801B2CF5 = c - 1; - } - } - return; -} - - - -extern s32 D_801B2D14; -extern s32 D_801B2D08; -extern s32 D_801B2D0C; -extern s32 D_801B2D18; - -void func_8013CABC(void) { - D_801B2D14 = 1; - D_801B2D08 = 1; - D_801B2D0C = 0; - D_801B2D18 = 1; -} - - - -extern s32 D_801B2D08; -extern s32 D_801B2D0C; -extern s32 D_801B2D10; -extern s32 D_801B2D14; -extern s32 D_801B2D18; - -void func_8013CAE8(void) { - D_801B2D08 = 1; - D_801B2D14 = 0; - D_801B2D0C = 0; - D_801B2D10 = -1; - D_801B2D18 = 0; -} - - - -extern s32 D_801B2D14; -extern s32 D_801B2D18; -extern s32 D_801B2D40; -extern s32 D_801B2D44; - -void func_8013CB20(void) -{ - D_801B2D40 = D_801B2D18; - D_801B2D44 = D_801B2D14; - D_801B2D18 = 1; - D_801B2D14 = 0; -} - - - -extern s32 D_801B2D40; -extern s32 D_801B2D44; -extern s32 D_801B2D18; -extern s32 D_801B2D14; - -void func_8013CB5C(void) { - D_801B2D18 = D_801B2D40; - D_801B2D14 = D_801B2D44; -} - - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B4980; - extern u8 D_801B4981; - extern u8 D_801B4982; - extern u8 D_801B4983; - extern u8 D_801B4984; - extern u8 D_801B4985; - extern u8 D_801B4986; - extern u8 D_801B4987; - extern u8 D_801B4988; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B4980; t1 = D_801B4981; t2 = D_801B4982; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B4983; t1 = D_801B4984; t2 = D_801B4985; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B4986; t1 = D_801B4987; t2 = D_801B4988; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B2D20; -extern s32 D_801B2D08; -extern s32 D_801B2D24; -extern s32 D_801B2D14; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B2D20 != 0) { - if (D_801B2D20 != 2) { - if (((D_801B2D20 < 3) && (D_801B2D20 == 1)) && - (D_801B2D24 = D_801B2D24 + 1, 0x23a < D_801B2D24)) { - D_801B2D08 = D_801B2D20; - D_801B2D20 = 2; - } - } else { - D_801B2D08 = D_801B2D08 + -1; - if (D_801B2D08 == 0) { - D_801B2D08 = D_801B2D20; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B2D14 == 0) { - D_801B2D20 = D_801B2D20 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B2D14; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B2D14; -} - - - -extern s32 D_801B2D20; - -void func_8013D164(void) { - D_801B2D20 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B4A62; -extern u8 D_801B4AD6; -extern u8 D_801B498A; -extern u8 D_801B4A44; -extern u8 D_801B4968; -extern u8 D_801B4989; -extern s32 D_801B4A48; - -void func_8013D330(void) { - if ((D_801B4A62 & 0xff) != D_801B4AD6) { - D_801B4A62 = ((D_801B4A62 & 0xff) < D_801B4AD6) ? (D_801B4A62 + 1) : (D_801B4A62 - 1); - } - if ((D_801B498A & 0xff) != D_801B4A44) { - D_801B498A = ((D_801B498A & 0xff) < D_801B4A44) ? (D_801B498A + 1) : (D_801B498A - 1); - } - if ((D_801B4968 & 0xff) != D_801B4989) { - D_801B4968 = ((D_801B4968 & 0xff) < D_801B4989) ? (D_801B4968 + 1) : (D_801B4968 - 1); - } - D_801B4A48 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B2CF8; -extern void *D_801B2CFC; -extern void *D_801B2D00; -extern s32 D_801B2D28; -extern s32 D_801B2D2C; -extern s32 D_801B2D30; -extern s32 D_801B49BC[]; - -extern u8 D_80184CBC[]; -extern u8 D_80184D64[]; -extern u8 D_80184C14[]; -extern u8 D_80184D10[]; -extern u8 D_80184D90[]; -extern u8 D_80184C68[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B2D28 = param_2; - D_801B2D2C = (param_2 >> 2) & 3; - D_801B2D30 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B2CF8 = D_80184CBC; - D_801B2CFC = D_80184D64; - D_801B2D00 = D_80184C14; - } else { - D_801B2CF8 = D_80184D10; - D_801B2CFC = D_80184D90; - D_801B2D00 = D_80184C68; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B2D30 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B2D28 & 2) != 0) { - D_801B49BC[0] = 0x140; - D_801B49BC[3] = 0x80; - if (p[0x37] == 4) { - D_801B49BC[0] = 0x140; - D_801B49BC[3] = 0; - } - if (p[0x37] == 0) { - D_801B49BC[0] = 0x140; - D_801B49BC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B2D00)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B2D00; -extern s16 *D_801B2D04; -extern s32 D_801B2D14; -extern s32 D_801B2D34; -extern s32 D_801B2D38; -extern s32 D_801B2D3C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B2D04 != 0) { - D_801B2D14 = 0; - p = (int *)(param_1 * 12 + (int)D_801B2D00); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B2D34 != x) { - flag = 1; - if (D_801B2D34 < x) { - if (x - D_801B2D34 < 5) { - D_801B2D34 = x; - } else { - D_801B2D34 = D_801B2D34 + 4; - } - } else { - if (D_801B2D34 - x < 5) { - D_801B2D34 = x; - } else { - D_801B2D34 = D_801B2D34 - 4; - } - } - } - if (D_801B2D38 != y) { - flag = 1; - if (D_801B2D38 < y) { - if (y - D_801B2D38 < 5) { - D_801B2D38 = y; - } else { - D_801B2D38 = D_801B2D38 + 4; - } - } else { - if (D_801B2D38 - y < 5) { - D_801B2D38 = y; - } else { - D_801B2D38 = D_801B2D38 - 4; - } - } - } - if (D_801B2D3C != z) { - flag = 1; - if (D_801B2D3C < z) { - if (z - D_801B2D3C < 5) { - D_801B2D3C = z; - } else { - D_801B2D3C = D_801B2D3C + 4; - } - } else { - if (D_801B2D3C - z < 5) { - D_801B2D3C = z; - } else { - D_801B2D3C = D_801B2D3C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B2D14 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80184E20[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B2D04); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B2D34); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B2D38); - uVar5 = (*(int*)&D_801B2D3C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80184E20); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B2D1C; - -s32 func_8013E054(void) { - return D_801B2D1C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018581C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801857F4; -extern s16 D_801857F6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018581C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801857F4 = 2; - D_801857F6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801857F6 = 0; - D_801857F4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B2D50; - extern void * D_801B2D54; - extern unsigned char D_80185494; - extern unsigned char D_801854AC; - extern unsigned char D_80185520; - extern unsigned char D_80185528; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B2D50 = &D_80185494; - D_801B2D54 = &D_80185520; - } else { - D_801B2D50 = &D_801854AC; - D_801B2D54 = &D_80185528; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018581C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018581C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018581C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801857F8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801857F8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801857F8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801857F4; -extern s16 D_801857F6; -extern unsigned char D_801857F8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801857F6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801857F4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801857F6; - if (*r < 3) { - *r = *r + 1; - } - D_801857F4 = (u16)D_801857F4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801857F8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801857F8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801857F8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_016/ov_SC02_016_jr_801380E0.c b/src/ov_SC02_016/ov_SC02_016_jr_801380E0.c new file mode 100644 index 000000000..5496d7429 --- /dev/null +++ b/src/ov_SC02_016/ov_SC02_016_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B1A6C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184714[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B2C0C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B4A68; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B1A6C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184450)(); +extern s16 (*D_80184454)(); +extern M2C_UNK (*D_8018445C)(); +extern s32 (*D_80184460)(); +extern s32 D_801B2C08; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B1A70; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801847A8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187C8C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801847C0; +extern M2C_UNK D_801847C8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801847D0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801847EC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801847F8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018480C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018485C[]; +extern s16 D_8018488C[]; +extern s16 D_801848EC[]; +extern s16 D_801848F4[]; +extern s16 D_80184914[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018494C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801849A4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801849EC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801849F4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801849FC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184A04[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801849AC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801849CC; +extern void func_801321B0(int param_1); +extern int D_801849DC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B2C78; +extern s32 D_801B2C7C[]; +extern int D_801B2C80; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184A10; +extern u8 D_80184A0C; +extern s16 *D_80184A14; +extern u8 D_80184A18; +extern int D_801B2C78; +extern u16 D_801B2C88; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184A14; /* holds a pointer value (*(u16**)&D_80184A14) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184A28[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184A7C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184A80[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184A80[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184AC4; +extern u8 D_80184B08; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184AC4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184B08 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184B4C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80184B88[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80184B88; + if (((s16)a1) < 0xC00) { + tbl = D_80184B4C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80184BC4, D_80184BC6, D_80184BC8, D_80184BCA, D_80184BCC, D_80184BCE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184BC6 < ang)) goto outer_else; + if (!(ang < D_80184BCC)) goto inner_else; + if (ang < D_80184BC8) { *(s16 *)L = D_80184BC8; goto done; } + if (D_80184BCA < ang) { *(s16 *)L = D_80184BCA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184BC4) { *(s16 *)L = D_80184BC4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184BCE < ang) { *(s16 *)L = D_80184BCE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B2CF0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B2CF0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B2CF0; +extern s8 D_801B2CF4; +extern s8 D_801B2CF5; + +void func_8013C9C4(void * arg0) +{ + D_801B2CF0 = arg0; + D_801B2CF4 = 0; + D_801B2CF5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B2CF0; +extern s8 D_801B2CF4; +extern s8 D_801B2CF5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B2CF0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B2CF5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B2CF4)) * 2) + D_801B2CF0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B2CF5 = (unsigned char) p[1]; + D_801B2CF4 = D_801B2CF4 + 1; + if (D_801B2CF5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B2CF4 = 0; + *base = 0; + } + } + else + { + D_801B2CF5 = c - 1; + } + } + return; +} + + + +extern s32 D_801B2D14; +extern s32 D_801B2D08; +extern s32 D_801B2D0C; +extern s32 D_801B2D18; + +void func_8013CABC(void) { + D_801B2D14 = 1; + D_801B2D08 = 1; + D_801B2D0C = 0; + D_801B2D18 = 1; +} + + + +extern s32 D_801B2D08; +extern s32 D_801B2D0C; +extern s32 D_801B2D10; +extern s32 D_801B2D14; +extern s32 D_801B2D18; + +void func_8013CAE8(void) { + D_801B2D08 = 1; + D_801B2D14 = 0; + D_801B2D0C = 0; + D_801B2D10 = -1; + D_801B2D18 = 0; +} + + + +extern s32 D_801B2D14; +extern s32 D_801B2D18; +extern s32 D_801B2D40; +extern s32 D_801B2D44; + +void func_8013CB20(void) +{ + D_801B2D40 = D_801B2D18; + D_801B2D44 = D_801B2D14; + D_801B2D18 = 1; + D_801B2D14 = 0; +} + + + +extern s32 D_801B2D40; +extern s32 D_801B2D44; +extern s32 D_801B2D18; +extern s32 D_801B2D14; + +void func_8013CB5C(void) { + D_801B2D18 = D_801B2D40; + D_801B2D14 = D_801B2D44; +} + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B4980; + extern u8 D_801B4981; + extern u8 D_801B4982; + extern u8 D_801B4983; + extern u8 D_801B4984; + extern u8 D_801B4985; + extern u8 D_801B4986; + extern u8 D_801B4987; + extern u8 D_801B4988; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B4980; t1 = D_801B4981; t2 = D_801B4982; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B4983; t1 = D_801B4984; t2 = D_801B4985; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B4986; t1 = D_801B4987; t2 = D_801B4988; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B2D20; +extern s32 D_801B2D08; +extern s32 D_801B2D24; +extern s32 D_801B2D14; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B2D20 != 0) { + if (D_801B2D20 != 2) { + if (((D_801B2D20 < 3) && (D_801B2D20 == 1)) && + (D_801B2D24 = D_801B2D24 + 1, 0x23a < D_801B2D24)) { + D_801B2D08 = D_801B2D20; + D_801B2D20 = 2; + } + } else { + D_801B2D08 = D_801B2D08 + -1; + if (D_801B2D08 == 0) { + D_801B2D08 = D_801B2D20; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B2D14 == 0) { + D_801B2D20 = D_801B2D20 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B2D14; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B2D14; +} + + + +extern s32 D_801B2D20; + +void func_8013D164(void) { + D_801B2D20 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B4A62; +extern u8 D_801B4AD6; +extern u8 D_801B498A; +extern u8 D_801B4A44; +extern u8 D_801B4968; +extern u8 D_801B4989; +extern s32 D_801B4A48; + +void func_8013D330(void) { + if ((D_801B4A62 & 0xff) != D_801B4AD6) { + D_801B4A62 = ((D_801B4A62 & 0xff) < D_801B4AD6) ? (D_801B4A62 + 1) : (D_801B4A62 - 1); + } + if ((D_801B498A & 0xff) != D_801B4A44) { + D_801B498A = ((D_801B498A & 0xff) < D_801B4A44) ? (D_801B498A + 1) : (D_801B498A - 1); + } + if ((D_801B4968 & 0xff) != D_801B4989) { + D_801B4968 = ((D_801B4968 & 0xff) < D_801B4989) ? (D_801B4968 + 1) : (D_801B4968 - 1); + } + D_801B4A48 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B2CF8; +extern void *D_801B2CFC; +extern void *D_801B2D00; +extern s32 D_801B2D28; +extern s32 D_801B2D2C; +extern s32 D_801B2D30; +extern s32 D_801B49BC[]; + +extern u8 D_80184CBC[]; +extern u8 D_80184D64[]; +extern u8 D_80184C14[]; +extern u8 D_80184D10[]; +extern u8 D_80184D90[]; +extern u8 D_80184C68[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B2D28 = param_2; + D_801B2D2C = (param_2 >> 2) & 3; + D_801B2D30 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B2CF8 = D_80184CBC; + D_801B2CFC = D_80184D64; + D_801B2D00 = D_80184C14; + } else { + D_801B2CF8 = D_80184D10; + D_801B2CFC = D_80184D90; + D_801B2D00 = D_80184C68; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B2D30 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B2D28 & 2) != 0) { + D_801B49BC[0] = 0x140; + D_801B49BC[3] = 0x80; + if (p[0x37] == 4) { + D_801B49BC[0] = 0x140; + D_801B49BC[3] = 0; + } + if (p[0x37] == 0) { + D_801B49BC[0] = 0x140; + D_801B49BC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B2D00)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B2D00; +extern s16 *D_801B2D04; +extern s32 D_801B2D14; +extern s32 D_801B2D34; +extern s32 D_801B2D38; +extern s32 D_801B2D3C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B2D04 != 0) { + D_801B2D14 = 0; + p = (int *)(param_1 * 12 + (int)D_801B2D00); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B2D34 != x) { + flag = 1; + if (D_801B2D34 < x) { + if (x - D_801B2D34 < 5) { + D_801B2D34 = x; + } else { + D_801B2D34 = D_801B2D34 + 4; + } + } else { + if (D_801B2D34 - x < 5) { + D_801B2D34 = x; + } else { + D_801B2D34 = D_801B2D34 - 4; + } + } + } + if (D_801B2D38 != y) { + flag = 1; + if (D_801B2D38 < y) { + if (y - D_801B2D38 < 5) { + D_801B2D38 = y; + } else { + D_801B2D38 = D_801B2D38 + 4; + } + } else { + if (D_801B2D38 - y < 5) { + D_801B2D38 = y; + } else { + D_801B2D38 = D_801B2D38 - 4; + } + } + } + if (D_801B2D3C != z) { + flag = 1; + if (D_801B2D3C < z) { + if (z - D_801B2D3C < 5) { + D_801B2D3C = z; + } else { + D_801B2D3C = D_801B2D3C + 4; + } + } else { + if (D_801B2D3C - z < 5) { + D_801B2D3C = z; + } else { + D_801B2D3C = D_801B2D3C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B2D14 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80184E20[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B2D04); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B2D34); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B2D38); + uVar5 = (*(int*)&D_801B2D3C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80184E20); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B2D1C; + +s32 func_8013E054(void) { + return D_801B2D1C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018581C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801857F4; +extern s16 D_801857F6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018581C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801857F4 = 2; + D_801857F6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801857F6 = 0; + D_801857F4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B2D50; + extern void * D_801B2D54; + extern unsigned char D_80185494; + extern unsigned char D_801854AC; + extern unsigned char D_80185520; + extern unsigned char D_80185528; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B2D50 = &D_80185494; + D_801B2D54 = &D_80185520; + } else { + D_801B2D50 = &D_801854AC; + D_801B2D54 = &D_80185528; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018581C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018581C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018581C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801857F8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801857F8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801857F8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801857F4; +extern s16 D_801857F6; +extern unsigned char D_801857F8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801857F6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801857F4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801857F6; + if (*r < 3) { + *r = *r + 1; + } + D_801857F4 = (u16)D_801857F4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801857F8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801857F8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801857F8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_016/nonmatchings/ov_SC02_016_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_017/ov_SC02_017_jr_8012ACE0.c b/src/ov_SC02_017/ov_SC02_017_jr_8012ACE0.c index 2b36c22b1..a3d843bc8 100644 --- a/src/ov_SC02_017/ov_SC02_017_jr_8012ACE0.c +++ b/src/ov_SC02_017/ov_SC02_017_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018AAD8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018AAD8[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018AB1C; -extern u8 D_8018AB60; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018AB1C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018AB60 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018ABA4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018ABE0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018ABE0; - if (((s16)a1) < 0xC00) { - tbl = D_8018ABA4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018AC1C, D_8018AC1E, D_8018AC20, D_8018AC22, D_8018AC24, D_8018AC26; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018AC1E < ang)) goto outer_else; - if (!(ang < D_8018AC24)) goto inner_else; - if (ang < D_8018AC20) { *(s16 *)L = D_8018AC20; goto done; } - if (D_8018AC22 < ang) { *(s16 *)L = D_8018AC22; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018AC1C) { *(s16 *)L = D_8018AC1C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018AC26 < ang) { *(s16 *)L = D_8018AC26; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801EE518; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801EE518, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801EE518; -extern s8 D_801EE51C; -extern s8 D_801EE51D; - -void func_8013C9C4(void * arg0) -{ - D_801EE518 = arg0; - D_801EE51C = 0; - D_801EE51D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801EE518; -extern s8 D_801EE51C; -extern s8 D_801EE51D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801EE518; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801EE51D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801EE51C)) * 2) + D_801EE518); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801EE51D = (unsigned char) p[1]; - D_801EE51C = D_801EE51C + 1; - if (D_801EE51D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801EE51C = 0; - *base = 0; - } - } - else - { - D_801EE51D = c - 1; - } - } - return; -} - - - -extern s32 D_801EE53C; -extern s32 D_801EE530; -extern s32 D_801EE534; -extern s32 D_801EE540; - -void func_8013CABC(void) { - D_801EE53C = 1; - D_801EE530 = 1; - D_801EE534 = 0; - D_801EE540 = 1; -} - - - -extern s32 D_801EE530; -extern s32 D_801EE534; -extern s32 D_801EE538; -extern s32 D_801EE53C; -extern s32 D_801EE540; - -void func_8013CAE8(void) { - D_801EE530 = 1; - D_801EE53C = 0; - D_801EE534 = 0; - D_801EE538 = -1; - D_801EE540 = 0; -} - - - -extern s32 D_801EE53C; -extern s32 D_801EE540; -extern s32 D_801EE568; -extern s32 D_801EE56C; - -void func_8013CB20(void) -{ - D_801EE568 = D_801EE540; - D_801EE56C = D_801EE53C; - D_801EE540 = 1; - D_801EE53C = 0; -} - - - -extern s32 D_801EE568; -extern s32 D_801EE56C; -extern s32 D_801EE540; -extern s32 D_801EE53C; - -void func_8013CB5C(void) { - D_801EE540 = D_801EE568; - D_801EE53C = D_801EE56C; -} - - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EFBE0; - extern u8 D_801EFBE1; - extern u8 D_801EFBE2; - extern u8 D_801EFBE3; - extern u8 D_801EFBE4; - extern u8 D_801EFBE5; - extern u8 D_801EFBE6; - extern u8 D_801EFBE7; - extern u8 D_801EFBE8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EFBE0; t1 = D_801EFBE1; t2 = D_801EFBE2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EFBE3; t1 = D_801EFBE4; t2 = D_801EFBE5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EFBE6; t1 = D_801EFBE7; t2 = D_801EFBE8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801EE548; -extern s32 D_801EE530; -extern s32 D_801EE54C; -extern s32 D_801EE53C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801EE548 != 0) { - if (D_801EE548 != 2) { - if (((D_801EE548 < 3) && (D_801EE548 == 1)) && - (D_801EE54C = D_801EE54C + 1, 0x23a < D_801EE54C)) { - D_801EE530 = D_801EE548; - D_801EE548 = 2; - } - } else { - D_801EE530 = D_801EE530 + -1; - if (D_801EE530 == 0) { - D_801EE530 = D_801EE548; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801EE53C == 0) { - D_801EE548 = D_801EE548 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801EE53C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801EE53C; -} - - - -extern s32 D_801EE548; - -void func_8013D164(void) { - D_801EE548 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EFCC2; -extern u8 D_801EFD36; -extern u8 D_801EFBEA; -extern u8 D_801EFCA4; -extern u8 D_801EFBC8; -extern u8 D_801EFBE9; -extern s32 D_801EFCA8; - -void func_8013D330(void) { - if ((D_801EFCC2 & 0xff) != D_801EFD36) { - D_801EFCC2 = ((D_801EFCC2 & 0xff) < D_801EFD36) ? (D_801EFCC2 + 1) : (D_801EFCC2 - 1); - } - if ((D_801EFBEA & 0xff) != D_801EFCA4) { - D_801EFBEA = ((D_801EFBEA & 0xff) < D_801EFCA4) ? (D_801EFBEA + 1) : (D_801EFBEA - 1); - } - if ((D_801EFBC8 & 0xff) != D_801EFBE9) { - D_801EFBC8 = ((D_801EFBC8 & 0xff) < D_801EFBE9) ? (D_801EFBC8 + 1) : (D_801EFBC8 - 1); - } - D_801EFCA8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801EE520; -extern void *D_801EE524; -extern void *D_801EE528; -extern s32 D_801EE550; -extern s32 D_801EE554; -extern s32 D_801EE558; -extern s32 D_801EFC1C[]; - -extern u8 D_8018AD14[]; -extern u8 D_8018ADBC[]; -extern u8 D_8018AC6C[]; -extern u8 D_8018AD68[]; -extern u8 D_8018ADE8[]; -extern u8 D_8018ACC0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801EE550 = param_2; - D_801EE554 = (param_2 >> 2) & 3; - D_801EE558 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801EE520 = D_8018AD14; - D_801EE524 = D_8018ADBC; - D_801EE528 = D_8018AC6C; - } else { - D_801EE520 = D_8018AD68; - D_801EE524 = D_8018ADE8; - D_801EE528 = D_8018ACC0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801EE558 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801EE550 & 2) != 0) { - D_801EFC1C[0] = 0x140; - D_801EFC1C[3] = 0x80; - if (p[0x37] == 4) { - D_801EFC1C[0] = 0x140; - D_801EFC1C[3] = 0; - } - if (p[0x37] == 0) { - D_801EFC1C[0] = 0x140; - D_801EFC1C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801EE528)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801EE528; -extern s16 *D_801EE52C; -extern s32 D_801EE53C; -extern s32 D_801EE55C; -extern s32 D_801EE560; -extern s32 D_801EE564; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801EE52C != 0) { - D_801EE53C = 0; - p = (int *)(param_1 * 12 + (int)D_801EE528); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801EE55C != x) { - flag = 1; - if (D_801EE55C < x) { - if (x - D_801EE55C < 5) { - D_801EE55C = x; - } else { - D_801EE55C = D_801EE55C + 4; - } - } else { - if (D_801EE55C - x < 5) { - D_801EE55C = x; - } else { - D_801EE55C = D_801EE55C - 4; - } - } - } - if (D_801EE560 != y) { - flag = 1; - if (D_801EE560 < y) { - if (y - D_801EE560 < 5) { - D_801EE560 = y; - } else { - D_801EE560 = D_801EE560 + 4; - } - } else { - if (D_801EE560 - y < 5) { - D_801EE560 = y; - } else { - D_801EE560 = D_801EE560 - 4; - } - } - } - if (D_801EE564 != z) { - flag = 1; - if (D_801EE564 < z) { - if (z - D_801EE564 < 5) { - D_801EE564 = z; - } else { - D_801EE564 = D_801EE564 + 4; - } - } else { - if (D_801EE564 - z < 5) { - D_801EE564 = z; - } else { - D_801EE564 = D_801EE564 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801EE53C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018AE78[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801EE52C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EE55C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EE560); - uVar5 = (*(int*)&D_801EE564); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018AE78); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801EE544; - -s32 func_8013E054(void) { - return D_801EE544; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018B874; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018B84C; -extern s16 D_8018B84E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018B874; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018B84C = 2; - D_8018B84E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018B84E = 0; - D_8018B84C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801EE578; - extern void * D_801EE57C; - extern unsigned char D_8018B4EC; - extern unsigned char D_8018B504; - extern unsigned char D_8018B578; - extern unsigned char D_8018B580; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801EE578 = &D_8018B4EC; - D_801EE57C = &D_8018B578; - } else { - D_801EE578 = &D_8018B504; - D_801EE57C = &D_8018B580; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018B874/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018B874 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018B874)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018B850; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018B850)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018B850)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018B84C; -extern s16 D_8018B84E; -extern unsigned char D_8018B850; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018B84E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018B84C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018B84E; - if (*r < 3) { - *r = *r + 1; - } - D_8018B84C = (u16)D_8018B84C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B850); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018B850; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B850); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_017/ov_SC02_017_jr_801380E0.c b/src/ov_SC02_017/ov_SC02_017_jr_801380E0.c new file mode 100644 index 000000000..789ff3a09 --- /dev/null +++ b/src/ov_SC02_017/ov_SC02_017_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801ED28C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018A76C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801EE434; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EFCC8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801ED28C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018A4A8)(); +extern s16 (*D_8018A4AC)(); +extern M2C_UNK (*D_8018A4B4)(); +extern s32 (*D_8018A4B8)(); +extern s32 D_801EE430; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801ED290; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018A800; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018DCE4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018A818; +extern M2C_UNK D_8018A820; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018A828; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018A844[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018A850[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018A864[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018A8B4[]; +extern s16 D_8018A8E4[]; +extern s16 D_8018A944[]; +extern s16 D_8018A94C[]; +extern s16 D_8018A96C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018A9A4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018A9FC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018AA44[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018AA4C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018AA54[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018AA5C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018AA04; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018AA24; +extern void func_801321B0(int param_1); +extern int D_8018AA34; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801EE4A0; +extern s32 D_801EE4A4[]; +extern int D_801EE4A8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018AA68; +extern u8 D_8018AA64; +extern s16 *D_8018AA6C; +extern u8 D_8018AA70; +extern int D_801EE4A0; +extern u16 D_801EE4B0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018AA6C; /* holds a pointer value (*(u16**)&D_8018AA6C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018AA80[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018AAD4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018AAD8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018AAD8[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018AB1C; +extern u8 D_8018AB60; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018AB1C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018AB60 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018ABA4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018ABE0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018ABE0; + if (((s16)a1) < 0xC00) { + tbl = D_8018ABA4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018AC1C, D_8018AC1E, D_8018AC20, D_8018AC22, D_8018AC24, D_8018AC26; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018AC1E < ang)) goto outer_else; + if (!(ang < D_8018AC24)) goto inner_else; + if (ang < D_8018AC20) { *(s16 *)L = D_8018AC20; goto done; } + if (D_8018AC22 < ang) { *(s16 *)L = D_8018AC22; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018AC1C) { *(s16 *)L = D_8018AC1C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018AC26 < ang) { *(s16 *)L = D_8018AC26; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801EE518; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801EE518, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801EE518; +extern s8 D_801EE51C; +extern s8 D_801EE51D; + +void func_8013C9C4(void * arg0) +{ + D_801EE518 = arg0; + D_801EE51C = 0; + D_801EE51D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801EE518; +extern s8 D_801EE51C; +extern s8 D_801EE51D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801EE518; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801EE51D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801EE51C)) * 2) + D_801EE518); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801EE51D = (unsigned char) p[1]; + D_801EE51C = D_801EE51C + 1; + if (D_801EE51D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801EE51C = 0; + *base = 0; + } + } + else + { + D_801EE51D = c - 1; + } + } + return; +} + + + +extern s32 D_801EE53C; +extern s32 D_801EE530; +extern s32 D_801EE534; +extern s32 D_801EE540; + +void func_8013CABC(void) { + D_801EE53C = 1; + D_801EE530 = 1; + D_801EE534 = 0; + D_801EE540 = 1; +} + + + +extern s32 D_801EE530; +extern s32 D_801EE534; +extern s32 D_801EE538; +extern s32 D_801EE53C; +extern s32 D_801EE540; + +void func_8013CAE8(void) { + D_801EE530 = 1; + D_801EE53C = 0; + D_801EE534 = 0; + D_801EE538 = -1; + D_801EE540 = 0; +} + + + +extern s32 D_801EE53C; +extern s32 D_801EE540; +extern s32 D_801EE568; +extern s32 D_801EE56C; + +void func_8013CB20(void) +{ + D_801EE568 = D_801EE540; + D_801EE56C = D_801EE53C; + D_801EE540 = 1; + D_801EE53C = 0; +} + + + +extern s32 D_801EE568; +extern s32 D_801EE56C; +extern s32 D_801EE540; +extern s32 D_801EE53C; + +void func_8013CB5C(void) { + D_801EE540 = D_801EE568; + D_801EE53C = D_801EE56C; +} + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EFBE0; + extern u8 D_801EFBE1; + extern u8 D_801EFBE2; + extern u8 D_801EFBE3; + extern u8 D_801EFBE4; + extern u8 D_801EFBE5; + extern u8 D_801EFBE6; + extern u8 D_801EFBE7; + extern u8 D_801EFBE8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EFBE0; t1 = D_801EFBE1; t2 = D_801EFBE2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EFBE3; t1 = D_801EFBE4; t2 = D_801EFBE5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EFBE6; t1 = D_801EFBE7; t2 = D_801EFBE8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801EE548; +extern s32 D_801EE530; +extern s32 D_801EE54C; +extern s32 D_801EE53C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801EE548 != 0) { + if (D_801EE548 != 2) { + if (((D_801EE548 < 3) && (D_801EE548 == 1)) && + (D_801EE54C = D_801EE54C + 1, 0x23a < D_801EE54C)) { + D_801EE530 = D_801EE548; + D_801EE548 = 2; + } + } else { + D_801EE530 = D_801EE530 + -1; + if (D_801EE530 == 0) { + D_801EE530 = D_801EE548; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801EE53C == 0) { + D_801EE548 = D_801EE548 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801EE53C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801EE53C; +} + + + +extern s32 D_801EE548; + +void func_8013D164(void) { + D_801EE548 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EFCC2; +extern u8 D_801EFD36; +extern u8 D_801EFBEA; +extern u8 D_801EFCA4; +extern u8 D_801EFBC8; +extern u8 D_801EFBE9; +extern s32 D_801EFCA8; + +void func_8013D330(void) { + if ((D_801EFCC2 & 0xff) != D_801EFD36) { + D_801EFCC2 = ((D_801EFCC2 & 0xff) < D_801EFD36) ? (D_801EFCC2 + 1) : (D_801EFCC2 - 1); + } + if ((D_801EFBEA & 0xff) != D_801EFCA4) { + D_801EFBEA = ((D_801EFBEA & 0xff) < D_801EFCA4) ? (D_801EFBEA + 1) : (D_801EFBEA - 1); + } + if ((D_801EFBC8 & 0xff) != D_801EFBE9) { + D_801EFBC8 = ((D_801EFBC8 & 0xff) < D_801EFBE9) ? (D_801EFBC8 + 1) : (D_801EFBC8 - 1); + } + D_801EFCA8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801EE520; +extern void *D_801EE524; +extern void *D_801EE528; +extern s32 D_801EE550; +extern s32 D_801EE554; +extern s32 D_801EE558; +extern s32 D_801EFC1C[]; + +extern u8 D_8018AD14[]; +extern u8 D_8018ADBC[]; +extern u8 D_8018AC6C[]; +extern u8 D_8018AD68[]; +extern u8 D_8018ADE8[]; +extern u8 D_8018ACC0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801EE550 = param_2; + D_801EE554 = (param_2 >> 2) & 3; + D_801EE558 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801EE520 = D_8018AD14; + D_801EE524 = D_8018ADBC; + D_801EE528 = D_8018AC6C; + } else { + D_801EE520 = D_8018AD68; + D_801EE524 = D_8018ADE8; + D_801EE528 = D_8018ACC0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801EE558 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801EE550 & 2) != 0) { + D_801EFC1C[0] = 0x140; + D_801EFC1C[3] = 0x80; + if (p[0x37] == 4) { + D_801EFC1C[0] = 0x140; + D_801EFC1C[3] = 0; + } + if (p[0x37] == 0) { + D_801EFC1C[0] = 0x140; + D_801EFC1C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801EE528)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801EE528; +extern s16 *D_801EE52C; +extern s32 D_801EE53C; +extern s32 D_801EE55C; +extern s32 D_801EE560; +extern s32 D_801EE564; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801EE52C != 0) { + D_801EE53C = 0; + p = (int *)(param_1 * 12 + (int)D_801EE528); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801EE55C != x) { + flag = 1; + if (D_801EE55C < x) { + if (x - D_801EE55C < 5) { + D_801EE55C = x; + } else { + D_801EE55C = D_801EE55C + 4; + } + } else { + if (D_801EE55C - x < 5) { + D_801EE55C = x; + } else { + D_801EE55C = D_801EE55C - 4; + } + } + } + if (D_801EE560 != y) { + flag = 1; + if (D_801EE560 < y) { + if (y - D_801EE560 < 5) { + D_801EE560 = y; + } else { + D_801EE560 = D_801EE560 + 4; + } + } else { + if (D_801EE560 - y < 5) { + D_801EE560 = y; + } else { + D_801EE560 = D_801EE560 - 4; + } + } + } + if (D_801EE564 != z) { + flag = 1; + if (D_801EE564 < z) { + if (z - D_801EE564 < 5) { + D_801EE564 = z; + } else { + D_801EE564 = D_801EE564 + 4; + } + } else { + if (D_801EE564 - z < 5) { + D_801EE564 = z; + } else { + D_801EE564 = D_801EE564 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801EE53C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018AE78[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801EE52C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EE55C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EE560); + uVar5 = (*(int*)&D_801EE564); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018AE78); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801EE544; + +s32 func_8013E054(void) { + return D_801EE544; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018B874; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018B84C; +extern s16 D_8018B84E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018B874; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018B84C = 2; + D_8018B84E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018B84E = 0; + D_8018B84C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801EE578; + extern void * D_801EE57C; + extern unsigned char D_8018B4EC; + extern unsigned char D_8018B504; + extern unsigned char D_8018B578; + extern unsigned char D_8018B580; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801EE578 = &D_8018B4EC; + D_801EE57C = &D_8018B578; + } else { + D_801EE578 = &D_8018B504; + D_801EE57C = &D_8018B580; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018B874/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018B874 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018B874)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018B850; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018B850)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018B850)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018B84C; +extern s16 D_8018B84E; +extern unsigned char D_8018B850; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018B84E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018B84C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018B84E; + if (*r < 3) { + *r = *r + 1; + } + D_8018B84C = (u16)D_8018B84C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B850); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018B850; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B850); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_017/nonmatchings/ov_SC02_017_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_021/ov_SC02_021_jr_8012ACE0.c b/src/ov_SC02_021/ov_SC02_021_jr_8012ACE0.c index 347e54959..6a1c84762 100644 --- a/src/ov_SC02_021/ov_SC02_021_jr_8012ACE0.c +++ b/src/ov_SC02_021/ov_SC02_021_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801800CC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801800CC[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180110; -extern u8 D_80180154; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180110; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80180154 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80180198[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801801D4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801801D4; - if (((s16)a1) < 0xC00) { - tbl = D_80180198; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180210, D_80180212, D_80180214, D_80180216, D_80180218, D_8018021A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80180212 < ang)) goto outer_else; - if (!(ang < D_80180218)) goto inner_else; - if (ang < D_80180214) { *(s16 *)L = D_80180214; goto done; } - if (D_80180216 < ang) { *(s16 *)L = D_80180216; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180210) { *(s16 *)L = D_80180210; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018021A < ang) { *(s16 *)L = D_8018021A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80191A88; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80191A88, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80191A88; -extern s8 D_80191A8C; -extern s8 D_80191A8D; - -void func_8013C9C4(void * arg0) -{ - D_80191A88 = arg0; - D_80191A8C = 0; - D_80191A8D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80191A88; -extern s8 D_80191A8C; -extern s8 D_80191A8D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80191A88; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80191A8D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80191A8C)) * 2) + D_80191A88); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80191A8D = (unsigned char) p[1]; - D_80191A8C = D_80191A8C + 1; - if (D_80191A8D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80191A8C = 0; - *base = 0; - } - } - else - { - D_80191A8D = c - 1; - } - } - return; -} - - - -extern s32 D_80191AAC; -extern s32 D_80191AA0; -extern s32 D_80191AA4; -extern s32 D_80191AB0; - -void func_8013CABC(void) { - D_80191AAC = 1; - D_80191AA0 = 1; - D_80191AA4 = 0; - D_80191AB0 = 1; -} - - - -extern s32 D_80191AA0; -extern s32 D_80191AA4; -extern s32 D_80191AA8; -extern s32 D_80191AAC; -extern s32 D_80191AB0; - -void func_8013CAE8(void) { - D_80191AA0 = 1; - D_80191AAC = 0; - D_80191AA4 = 0; - D_80191AA8 = -1; - D_80191AB0 = 0; -} - - - -extern s32 D_80191AAC; -extern s32 D_80191AB0; -extern s32 D_80191AD8; -extern s32 D_80191ADC; - -void func_8013CB20(void) -{ - D_80191AD8 = D_80191AB0; - D_80191ADC = D_80191AAC; - D_80191AB0 = 1; - D_80191AAC = 0; -} - - - -extern s32 D_80191AD8; -extern s32 D_80191ADC; -extern s32 D_80191AB0; -extern s32 D_80191AAC; - -void func_8013CB5C(void) { - D_80191AB0 = D_80191AD8; - D_80191AAC = D_80191ADC; -} - - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80193748; - extern u8 D_80193749; - extern u8 D_8019374A; - extern u8 D_8019374B; - extern u8 D_8019374C; - extern u8 D_8019374D; - extern u8 D_8019374E; - extern u8 D_8019374F; - extern u8 D_80193750; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80193748; t1 = D_80193749; t2 = D_8019374A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019374B; t1 = D_8019374C; t2 = D_8019374D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019374E; t1 = D_8019374F; t2 = D_80193750; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80191AB8; -extern s32 D_80191AA0; -extern s32 D_80191ABC; -extern s32 D_80191AAC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80191AB8 != 0) { - if (D_80191AB8 != 2) { - if (((D_80191AB8 < 3) && (D_80191AB8 == 1)) && - (D_80191ABC = D_80191ABC + 1, 0x23a < D_80191ABC)) { - D_80191AA0 = D_80191AB8; - D_80191AB8 = 2; - } - } else { - D_80191AA0 = D_80191AA0 + -1; - if (D_80191AA0 == 0) { - D_80191AA0 = D_80191AB8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80191AAC == 0) { - D_80191AB8 = D_80191AB8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80191AAC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80191AAC; -} - - - -extern s32 D_80191AB8; - -void func_8013D164(void) { - D_80191AB8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019382A; -extern u8 D_8019389E; -extern u8 D_80193752; -extern u8 D_8019380C; -extern u8 D_80193730; -extern u8 D_80193751; -extern s32 D_80193810; - -void func_8013D330(void) { - if ((D_8019382A & 0xff) != D_8019389E) { - D_8019382A = ((D_8019382A & 0xff) < D_8019389E) ? (D_8019382A + 1) : (D_8019382A - 1); - } - if ((D_80193752 & 0xff) != D_8019380C) { - D_80193752 = ((D_80193752 & 0xff) < D_8019380C) ? (D_80193752 + 1) : (D_80193752 - 1); - } - if ((D_80193730 & 0xff) != D_80193751) { - D_80193730 = ((D_80193730 & 0xff) < D_80193751) ? (D_80193730 + 1) : (D_80193730 - 1); - } - D_80193810 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80191A90; -extern void *D_80191A94; -extern void *D_80191A98; -extern s32 D_80191AC0; -extern s32 D_80191AC4; -extern s32 D_80191AC8; -extern s32 D_80193784[]; - -extern u8 D_80180308[]; -extern u8 D_801803B0[]; -extern u8 D_80180260[]; -extern u8 D_8018035C[]; -extern u8 D_801803DC[]; -extern u8 D_801802B4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80191AC0 = param_2; - D_80191AC4 = (param_2 >> 2) & 3; - D_80191AC8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80191A90 = D_80180308; - D_80191A94 = D_801803B0; - D_80191A98 = D_80180260; - } else { - D_80191A90 = D_8018035C; - D_80191A94 = D_801803DC; - D_80191A98 = D_801802B4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80191AC8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80191AC0 & 2) != 0) { - D_80193784[0] = 0x140; - D_80193784[3] = 0x80; - if (p[0x37] == 4) { - D_80193784[0] = 0x140; - D_80193784[3] = 0; - } - if (p[0x37] == 0) { - D_80193784[0] = 0x140; - D_80193784[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80191A98)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80191A98; -extern s16 *D_80191A9C; -extern s32 D_80191AAC; -extern s32 D_80191ACC; -extern s32 D_80191AD0; -extern s32 D_80191AD4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80191A9C != 0) { - D_80191AAC = 0; - p = (int *)(param_1 * 12 + (int)D_80191A98); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80191ACC != x) { - flag = 1; - if (D_80191ACC < x) { - if (x - D_80191ACC < 5) { - D_80191ACC = x; - } else { - D_80191ACC = D_80191ACC + 4; - } - } else { - if (D_80191ACC - x < 5) { - D_80191ACC = x; - } else { - D_80191ACC = D_80191ACC - 4; - } - } - } - if (D_80191AD0 != y) { - flag = 1; - if (D_80191AD0 < y) { - if (y - D_80191AD0 < 5) { - D_80191AD0 = y; - } else { - D_80191AD0 = D_80191AD0 + 4; - } - } else { - if (D_80191AD0 - y < 5) { - D_80191AD0 = y; - } else { - D_80191AD0 = D_80191AD0 - 4; - } - } - } - if (D_80191AD4 != z) { - flag = 1; - if (D_80191AD4 < z) { - if (z - D_80191AD4 < 5) { - D_80191AD4 = z; - } else { - D_80191AD4 = D_80191AD4 + 4; - } - } else { - if (D_80191AD4 - z < 5) { - D_80191AD4 = z; - } else { - D_80191AD4 = D_80191AD4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80191AAC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018046C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80191A9C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80191ACC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80191AD0); - uVar5 = (*(int*)&D_80191AD4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018046C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80191AB4; - -s32 func_8013E054(void) { - return D_80191AB4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180E68; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80180E40; -extern s16 D_80180E42; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180E68; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80180E40 = 2; - D_80180E42 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80180E42 = 0; - D_80180E40 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80191AE8; - extern void * D_80191AEC; - extern unsigned char D_80180AE0; - extern unsigned char D_80180AF8; - extern unsigned char D_80180B6C; - extern unsigned char D_80180B74; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80191AE8 = &D_80180AE0; - D_80191AEC = &D_80180B6C; - } else { - D_80191AE8 = &D_80180AF8; - D_80191AEC = &D_80180B74; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180E68/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180E68 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180E68)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180E44; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180E44)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180E44)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80180E40; -extern s16 D_80180E42; -extern unsigned char D_80180E44; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180E42` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80180E40` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80180E42; - if (*r < 3) { - *r = *r + 1; - } - D_80180E40 = (u16)D_80180E40 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180E44); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180E44; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180E44); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_021/ov_SC02_021_jr_801380E0.c b/src/ov_SC02_021/ov_SC02_021_jr_801380E0.c new file mode 100644 index 000000000..cc0632405 --- /dev/null +++ b/src/ov_SC02_021/ov_SC02_021_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80190808; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017FD60[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801919A4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80193830; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80190808; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017FA9C)(); +extern s16 (*D_8017FAA0)(); +extern M2C_UNK (*D_8017FAA8)(); +extern s32 (*D_8017FAAC)(); +extern s32 D_801919A0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019080C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017FDF4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801832D8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017FE0C; +extern M2C_UNK D_8017FE14; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017FE1C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017FE38[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017FE44[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017FE58[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017FEA8[]; +extern s16 D_8017FED8[]; +extern s16 D_8017FF38[]; +extern s16 D_8017FF40[]; +extern s16 D_8017FF60[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017FF98[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017FFF0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80180038[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80180040[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80180048[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80180050[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017FFF8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80180018; +extern void func_801321B0(int param_1); +extern int D_80180028; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80191A10; +extern s32 D_80191A14[]; +extern int D_80191A18; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018005C; +extern u8 D_80180058; +extern s16 *D_80180060; +extern u8 D_80180064; +extern int D_80191A10; +extern u16 D_80191A20; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80180060; /* holds a pointer value (*(u16**)&D_80180060) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80180074[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801800C8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801800CC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801800CC[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180110; +extern u8 D_80180154; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180110; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80180154 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80180198[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801801D4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801801D4; + if (((s16)a1) < 0xC00) { + tbl = D_80180198; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180210, D_80180212, D_80180214, D_80180216, D_80180218, D_8018021A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180212 < ang)) goto outer_else; + if (!(ang < D_80180218)) goto inner_else; + if (ang < D_80180214) { *(s16 *)L = D_80180214; goto done; } + if (D_80180216 < ang) { *(s16 *)L = D_80180216; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180210) { *(s16 *)L = D_80180210; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018021A < ang) { *(s16 *)L = D_8018021A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80191A88; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80191A88, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80191A88; +extern s8 D_80191A8C; +extern s8 D_80191A8D; + +void func_8013C9C4(void * arg0) +{ + D_80191A88 = arg0; + D_80191A8C = 0; + D_80191A8D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80191A88; +extern s8 D_80191A8C; +extern s8 D_80191A8D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80191A88; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80191A8D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80191A8C)) * 2) + D_80191A88); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80191A8D = (unsigned char) p[1]; + D_80191A8C = D_80191A8C + 1; + if (D_80191A8D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80191A8C = 0; + *base = 0; + } + } + else + { + D_80191A8D = c - 1; + } + } + return; +} + + + +extern s32 D_80191AAC; +extern s32 D_80191AA0; +extern s32 D_80191AA4; +extern s32 D_80191AB0; + +void func_8013CABC(void) { + D_80191AAC = 1; + D_80191AA0 = 1; + D_80191AA4 = 0; + D_80191AB0 = 1; +} + + + +extern s32 D_80191AA0; +extern s32 D_80191AA4; +extern s32 D_80191AA8; +extern s32 D_80191AAC; +extern s32 D_80191AB0; + +void func_8013CAE8(void) { + D_80191AA0 = 1; + D_80191AAC = 0; + D_80191AA4 = 0; + D_80191AA8 = -1; + D_80191AB0 = 0; +} + + + +extern s32 D_80191AAC; +extern s32 D_80191AB0; +extern s32 D_80191AD8; +extern s32 D_80191ADC; + +void func_8013CB20(void) +{ + D_80191AD8 = D_80191AB0; + D_80191ADC = D_80191AAC; + D_80191AB0 = 1; + D_80191AAC = 0; +} + + + +extern s32 D_80191AD8; +extern s32 D_80191ADC; +extern s32 D_80191AB0; +extern s32 D_80191AAC; + +void func_8013CB5C(void) { + D_80191AB0 = D_80191AD8; + D_80191AAC = D_80191ADC; +} + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80193748; + extern u8 D_80193749; + extern u8 D_8019374A; + extern u8 D_8019374B; + extern u8 D_8019374C; + extern u8 D_8019374D; + extern u8 D_8019374E; + extern u8 D_8019374F; + extern u8 D_80193750; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80193748; t1 = D_80193749; t2 = D_8019374A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019374B; t1 = D_8019374C; t2 = D_8019374D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019374E; t1 = D_8019374F; t2 = D_80193750; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80191AB8; +extern s32 D_80191AA0; +extern s32 D_80191ABC; +extern s32 D_80191AAC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80191AB8 != 0) { + if (D_80191AB8 != 2) { + if (((D_80191AB8 < 3) && (D_80191AB8 == 1)) && + (D_80191ABC = D_80191ABC + 1, 0x23a < D_80191ABC)) { + D_80191AA0 = D_80191AB8; + D_80191AB8 = 2; + } + } else { + D_80191AA0 = D_80191AA0 + -1; + if (D_80191AA0 == 0) { + D_80191AA0 = D_80191AB8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80191AAC == 0) { + D_80191AB8 = D_80191AB8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80191AAC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80191AAC; +} + + + +extern s32 D_80191AB8; + +void func_8013D164(void) { + D_80191AB8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019382A; +extern u8 D_8019389E; +extern u8 D_80193752; +extern u8 D_8019380C; +extern u8 D_80193730; +extern u8 D_80193751; +extern s32 D_80193810; + +void func_8013D330(void) { + if ((D_8019382A & 0xff) != D_8019389E) { + D_8019382A = ((D_8019382A & 0xff) < D_8019389E) ? (D_8019382A + 1) : (D_8019382A - 1); + } + if ((D_80193752 & 0xff) != D_8019380C) { + D_80193752 = ((D_80193752 & 0xff) < D_8019380C) ? (D_80193752 + 1) : (D_80193752 - 1); + } + if ((D_80193730 & 0xff) != D_80193751) { + D_80193730 = ((D_80193730 & 0xff) < D_80193751) ? (D_80193730 + 1) : (D_80193730 - 1); + } + D_80193810 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80191A90; +extern void *D_80191A94; +extern void *D_80191A98; +extern s32 D_80191AC0; +extern s32 D_80191AC4; +extern s32 D_80191AC8; +extern s32 D_80193784[]; + +extern u8 D_80180308[]; +extern u8 D_801803B0[]; +extern u8 D_80180260[]; +extern u8 D_8018035C[]; +extern u8 D_801803DC[]; +extern u8 D_801802B4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80191AC0 = param_2; + D_80191AC4 = (param_2 >> 2) & 3; + D_80191AC8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80191A90 = D_80180308; + D_80191A94 = D_801803B0; + D_80191A98 = D_80180260; + } else { + D_80191A90 = D_8018035C; + D_80191A94 = D_801803DC; + D_80191A98 = D_801802B4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80191AC8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80191AC0 & 2) != 0) { + D_80193784[0] = 0x140; + D_80193784[3] = 0x80; + if (p[0x37] == 4) { + D_80193784[0] = 0x140; + D_80193784[3] = 0; + } + if (p[0x37] == 0) { + D_80193784[0] = 0x140; + D_80193784[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80191A98)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80191A98; +extern s16 *D_80191A9C; +extern s32 D_80191AAC; +extern s32 D_80191ACC; +extern s32 D_80191AD0; +extern s32 D_80191AD4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80191A9C != 0) { + D_80191AAC = 0; + p = (int *)(param_1 * 12 + (int)D_80191A98); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80191ACC != x) { + flag = 1; + if (D_80191ACC < x) { + if (x - D_80191ACC < 5) { + D_80191ACC = x; + } else { + D_80191ACC = D_80191ACC + 4; + } + } else { + if (D_80191ACC - x < 5) { + D_80191ACC = x; + } else { + D_80191ACC = D_80191ACC - 4; + } + } + } + if (D_80191AD0 != y) { + flag = 1; + if (D_80191AD0 < y) { + if (y - D_80191AD0 < 5) { + D_80191AD0 = y; + } else { + D_80191AD0 = D_80191AD0 + 4; + } + } else { + if (D_80191AD0 - y < 5) { + D_80191AD0 = y; + } else { + D_80191AD0 = D_80191AD0 - 4; + } + } + } + if (D_80191AD4 != z) { + flag = 1; + if (D_80191AD4 < z) { + if (z - D_80191AD4 < 5) { + D_80191AD4 = z; + } else { + D_80191AD4 = D_80191AD4 + 4; + } + } else { + if (D_80191AD4 - z < 5) { + D_80191AD4 = z; + } else { + D_80191AD4 = D_80191AD4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80191AAC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018046C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80191A9C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80191ACC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80191AD0); + uVar5 = (*(int*)&D_80191AD4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018046C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80191AB4; + +s32 func_8013E054(void) { + return D_80191AB4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180E68; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80180E40; +extern s16 D_80180E42; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180E68; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80180E40 = 2; + D_80180E42 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80180E42 = 0; + D_80180E40 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80191AE8; + extern void * D_80191AEC; + extern unsigned char D_80180AE0; + extern unsigned char D_80180AF8; + extern unsigned char D_80180B6C; + extern unsigned char D_80180B74; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80191AE8 = &D_80180AE0; + D_80191AEC = &D_80180B6C; + } else { + D_80191AE8 = &D_80180AF8; + D_80191AEC = &D_80180B74; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180E68/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180E68 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180E68)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180E44; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180E44)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180E44)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80180E40; +extern s16 D_80180E42; +extern unsigned char D_80180E44; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180E42` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80180E40` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80180E42; + if (*r < 3) { + *r = *r + 1; + } + D_80180E40 = (u16)D_80180E40 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180E44); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180E44; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180E44); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_021/nonmatchings/ov_SC02_021_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_026/ov_SC02_026_jr_8012ACE0.c b/src/ov_SC02_026/ov_SC02_026_jr_8012ACE0.c index a8660277d..ffac6f229 100644 --- a/src/ov_SC02_026/ov_SC02_026_jr_8012ACE0.c +++ b/src/ov_SC02_026/ov_SC02_026_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186720[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186720[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80186764; -extern u8 D_801867A8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80186764; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801867A8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801867EC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80186828[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80186828; - if (((s16)a1) < 0xC00) { - tbl = D_801867EC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80186864, D_80186866, D_80186868, D_8018686A, D_8018686C, D_8018686E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80186866 < ang)) goto outer_else; - if (!(ang < D_8018686C)) goto inner_else; - if (ang < D_80186868) { *(s16 *)L = D_80186868; goto done; } - if (D_8018686A < ang) { *(s16 *)L = D_8018686A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80186864) { *(s16 *)L = D_80186864; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018686E < ang) { *(s16 *)L = D_8018686E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CEEC8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CEEC8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CEEC8; -extern s8 D_801CEECC; -extern s8 D_801CEECD; - -void func_8013C9C4(void * arg0) -{ - D_801CEEC8 = arg0; - D_801CEECC = 0; - D_801CEECD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CEEC8; -extern s8 D_801CEECC; -extern s8 D_801CEECD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CEEC8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CEECD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CEECC)) * 2) + D_801CEEC8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CEECD = (unsigned char) p[1]; - D_801CEECC = D_801CEECC + 1; - if (D_801CEECD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CEECC = 0; - *base = 0; - } - } - else - { - D_801CEECD = c - 1; - } - } - return; -} - - - -extern s32 D_801CEEEC; -extern s32 D_801CEEE0; -extern s32 D_801CEEE4; -extern s32 D_801CEEF0; - -void func_8013CABC(void) { - D_801CEEEC = 1; - D_801CEEE0 = 1; - D_801CEEE4 = 0; - D_801CEEF0 = 1; -} - - - -extern s32 D_801CEEE0; -extern s32 D_801CEEE4; -extern s32 D_801CEEE8; -extern s32 D_801CEEEC; -extern s32 D_801CEEF0; - -void func_8013CAE8(void) { - D_801CEEE0 = 1; - D_801CEEEC = 0; - D_801CEEE4 = 0; - D_801CEEE8 = -1; - D_801CEEF0 = 0; -} - - - -extern s32 D_801CEEEC; -extern s32 D_801CEEF0; -extern s32 D_801CEF18; -extern s32 D_801CEF1C; - -void func_8013CB20(void) -{ - D_801CEF18 = D_801CEEF0; - D_801CEF1C = D_801CEEEC; - D_801CEEF0 = 1; - D_801CEEEC = 0; -} - - - -extern s32 D_801CEF18; -extern s32 D_801CEF1C; -extern s32 D_801CEEF0; -extern s32 D_801CEEEC; - -void func_8013CB5C(void) { - D_801CEEF0 = D_801CEF18; - D_801CEEEC = D_801CEF1C; -} - - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D0168; - extern u8 D_801D0169; - extern u8 D_801D016A; - extern u8 D_801D016B; - extern u8 D_801D016C; - extern u8 D_801D016D; - extern u8 D_801D016E; - extern u8 D_801D016F; - extern u8 D_801D0170; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D0168; t1 = D_801D0169; t2 = D_801D016A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D016B; t1 = D_801D016C; t2 = D_801D016D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D016E; t1 = D_801D016F; t2 = D_801D0170; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CEEF8; -extern s32 D_801CEEE0; -extern s32 D_801CEEFC; -extern s32 D_801CEEEC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CEEF8 != 0) { - if (D_801CEEF8 != 2) { - if (((D_801CEEF8 < 3) && (D_801CEEF8 == 1)) && - (D_801CEEFC = D_801CEEFC + 1, 0x23a < D_801CEEFC)) { - D_801CEEE0 = D_801CEEF8; - D_801CEEF8 = 2; - } - } else { - D_801CEEE0 = D_801CEEE0 + -1; - if (D_801CEEE0 == 0) { - D_801CEEE0 = D_801CEEF8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CEEEC == 0) { - D_801CEEF8 = D_801CEEF8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CEEEC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CEEEC; -} - - - -extern s32 D_801CEEF8; - -void func_8013D164(void) { - D_801CEEF8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D024A; -extern u8 D_801D02BE; -extern u8 D_801D0172; -extern u8 D_801D022C; -extern u8 D_801D0150; -extern u8 D_801D0171; -extern s32 D_801D0230; - -void func_8013D330(void) { - if ((D_801D024A & 0xff) != D_801D02BE) { - D_801D024A = ((D_801D024A & 0xff) < D_801D02BE) ? (D_801D024A + 1) : (D_801D024A - 1); - } - if ((D_801D0172 & 0xff) != D_801D022C) { - D_801D0172 = ((D_801D0172 & 0xff) < D_801D022C) ? (D_801D0172 + 1) : (D_801D0172 - 1); - } - if ((D_801D0150 & 0xff) != D_801D0171) { - D_801D0150 = ((D_801D0150 & 0xff) < D_801D0171) ? (D_801D0150 + 1) : (D_801D0150 - 1); - } - D_801D0230 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CEED0; -extern void *D_801CEED4; -extern void *D_801CEED8; -extern s32 D_801CEF00; -extern s32 D_801CEF04; -extern s32 D_801CEF08; -extern s32 D_801D01A4[]; - -extern u8 D_8018695C[]; -extern u8 D_80186A04[]; -extern u8 D_801868B4[]; -extern u8 D_801869B0[]; -extern u8 D_80186A30[]; -extern u8 D_80186908[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CEF00 = param_2; - D_801CEF04 = (param_2 >> 2) & 3; - D_801CEF08 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CEED0 = D_8018695C; - D_801CEED4 = D_80186A04; - D_801CEED8 = D_801868B4; - } else { - D_801CEED0 = D_801869B0; - D_801CEED4 = D_80186A30; - D_801CEED8 = D_80186908; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CEF08 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CEF00 & 2) != 0) { - D_801D01A4[0] = 0x140; - D_801D01A4[3] = 0x80; - if (p[0x37] == 4) { - D_801D01A4[0] = 0x140; - D_801D01A4[3] = 0; - } - if (p[0x37] == 0) { - D_801D01A4[0] = 0x140; - D_801D01A4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CEED8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CEED8; -extern s16 *D_801CEEDC; -extern s32 D_801CEEEC; -extern s32 D_801CEF0C; -extern s32 D_801CEF10; -extern s32 D_801CEF14; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CEEDC != 0) { - D_801CEEEC = 0; - p = (int *)(param_1 * 12 + (int)D_801CEED8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CEF0C != x) { - flag = 1; - if (D_801CEF0C < x) { - if (x - D_801CEF0C < 5) { - D_801CEF0C = x; - } else { - D_801CEF0C = D_801CEF0C + 4; - } - } else { - if (D_801CEF0C - x < 5) { - D_801CEF0C = x; - } else { - D_801CEF0C = D_801CEF0C - 4; - } - } - } - if (D_801CEF10 != y) { - flag = 1; - if (D_801CEF10 < y) { - if (y - D_801CEF10 < 5) { - D_801CEF10 = y; - } else { - D_801CEF10 = D_801CEF10 + 4; - } - } else { - if (D_801CEF10 - y < 5) { - D_801CEF10 = y; - } else { - D_801CEF10 = D_801CEF10 - 4; - } - } - } - if (D_801CEF14 != z) { - flag = 1; - if (D_801CEF14 < z) { - if (z - D_801CEF14 < 5) { - D_801CEF14 = z; - } else { - D_801CEF14 = D_801CEF14 + 4; - } - } else { - if (D_801CEF14 - z < 5) { - D_801CEF14 = z; - } else { - D_801CEF14 = D_801CEF14 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CEEEC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80186AC0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CEEDC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CEF0C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CEF10); - uVar5 = (*(int*)&D_801CEF14); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80186AC0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CEEF4; - -s32 func_8013E054(void) { - return D_801CEEF4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801874BC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80187494; -extern s16 D_80187496; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801874BC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80187494 = 2; - D_80187496 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80187496 = 0; - D_80187494 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CEF28; - extern void * D_801CEF2C; - extern unsigned char D_80187134; - extern unsigned char D_8018714C; - extern unsigned char D_801871C0; - extern unsigned char D_801871C8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CEF28 = &D_80187134; - D_801CEF2C = &D_801871C0; - } else { - D_801CEF28 = &D_8018714C; - D_801CEF2C = &D_801871C8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801874BC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801874BC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801874BC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187498; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187498)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187498)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80187494; -extern s16 D_80187496; -extern unsigned char D_80187498; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187496` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80187494` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80187496; - if (*r < 3) { - *r = *r + 1; - } - D_80187494 = (u16)D_80187494 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187498); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187498; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187498); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_026/ov_SC02_026_jr_801380E0.c b/src/ov_SC02_026/ov_SC02_026_jr_801380E0.c new file mode 100644 index 000000000..0b6221e34 --- /dev/null +++ b/src/ov_SC02_026/ov_SC02_026_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CDC3C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801863B4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CEDE4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D0250; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CDC3C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801860F0)(); +extern s16 (*D_801860F4)(); +extern M2C_UNK (*D_801860FC)(); +extern s32 (*D_80186100)(); +extern s32 D_801CEDE0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CDC40; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186448; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018992C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80186460; +extern M2C_UNK D_80186468; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80186470; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018648C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186498[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801864AC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801864FC[]; +extern s16 D_8018652C[]; +extern s16 D_8018658C[]; +extern s16 D_80186594[]; +extern s16 D_801865B4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801865EC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80186644[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018668C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186694[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018669C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801866A4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018664C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018666C; +extern void func_801321B0(int param_1); +extern int D_8018667C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CEE50; +extern s32 D_801CEE54[]; +extern int D_801CEE58; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801866B0; +extern u8 D_801866AC; +extern s16 *D_801866B4; +extern u8 D_801866B8; +extern int D_801CEE50; +extern u16 D_801CEE60; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801866B4; /* holds a pointer value (*(u16**)&D_801866B4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801866C8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018671C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186720[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186720[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80186764; +extern u8 D_801867A8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80186764; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801867A8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801867EC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80186828[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80186828; + if (((s16)a1) < 0xC00) { + tbl = D_801867EC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80186864, D_80186866, D_80186868, D_8018686A, D_8018686C, D_8018686E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186866 < ang)) goto outer_else; + if (!(ang < D_8018686C)) goto inner_else; + if (ang < D_80186868) { *(s16 *)L = D_80186868; goto done; } + if (D_8018686A < ang) { *(s16 *)L = D_8018686A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186864) { *(s16 *)L = D_80186864; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018686E < ang) { *(s16 *)L = D_8018686E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CEEC8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CEEC8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CEEC8; +extern s8 D_801CEECC; +extern s8 D_801CEECD; + +void func_8013C9C4(void * arg0) +{ + D_801CEEC8 = arg0; + D_801CEECC = 0; + D_801CEECD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CEEC8; +extern s8 D_801CEECC; +extern s8 D_801CEECD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CEEC8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CEECD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CEECC)) * 2) + D_801CEEC8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CEECD = (unsigned char) p[1]; + D_801CEECC = D_801CEECC + 1; + if (D_801CEECD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CEECC = 0; + *base = 0; + } + } + else + { + D_801CEECD = c - 1; + } + } + return; +} + + + +extern s32 D_801CEEEC; +extern s32 D_801CEEE0; +extern s32 D_801CEEE4; +extern s32 D_801CEEF0; + +void func_8013CABC(void) { + D_801CEEEC = 1; + D_801CEEE0 = 1; + D_801CEEE4 = 0; + D_801CEEF0 = 1; +} + + + +extern s32 D_801CEEE0; +extern s32 D_801CEEE4; +extern s32 D_801CEEE8; +extern s32 D_801CEEEC; +extern s32 D_801CEEF0; + +void func_8013CAE8(void) { + D_801CEEE0 = 1; + D_801CEEEC = 0; + D_801CEEE4 = 0; + D_801CEEE8 = -1; + D_801CEEF0 = 0; +} + + + +extern s32 D_801CEEEC; +extern s32 D_801CEEF0; +extern s32 D_801CEF18; +extern s32 D_801CEF1C; + +void func_8013CB20(void) +{ + D_801CEF18 = D_801CEEF0; + D_801CEF1C = D_801CEEEC; + D_801CEEF0 = 1; + D_801CEEEC = 0; +} + + + +extern s32 D_801CEF18; +extern s32 D_801CEF1C; +extern s32 D_801CEEF0; +extern s32 D_801CEEEC; + +void func_8013CB5C(void) { + D_801CEEF0 = D_801CEF18; + D_801CEEEC = D_801CEF1C; +} + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D0168; + extern u8 D_801D0169; + extern u8 D_801D016A; + extern u8 D_801D016B; + extern u8 D_801D016C; + extern u8 D_801D016D; + extern u8 D_801D016E; + extern u8 D_801D016F; + extern u8 D_801D0170; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D0168; t1 = D_801D0169; t2 = D_801D016A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D016B; t1 = D_801D016C; t2 = D_801D016D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D016E; t1 = D_801D016F; t2 = D_801D0170; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CEEF8; +extern s32 D_801CEEE0; +extern s32 D_801CEEFC; +extern s32 D_801CEEEC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CEEF8 != 0) { + if (D_801CEEF8 != 2) { + if (((D_801CEEF8 < 3) && (D_801CEEF8 == 1)) && + (D_801CEEFC = D_801CEEFC + 1, 0x23a < D_801CEEFC)) { + D_801CEEE0 = D_801CEEF8; + D_801CEEF8 = 2; + } + } else { + D_801CEEE0 = D_801CEEE0 + -1; + if (D_801CEEE0 == 0) { + D_801CEEE0 = D_801CEEF8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CEEEC == 0) { + D_801CEEF8 = D_801CEEF8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CEEEC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CEEEC; +} + + + +extern s32 D_801CEEF8; + +void func_8013D164(void) { + D_801CEEF8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D024A; +extern u8 D_801D02BE; +extern u8 D_801D0172; +extern u8 D_801D022C; +extern u8 D_801D0150; +extern u8 D_801D0171; +extern s32 D_801D0230; + +void func_8013D330(void) { + if ((D_801D024A & 0xff) != D_801D02BE) { + D_801D024A = ((D_801D024A & 0xff) < D_801D02BE) ? (D_801D024A + 1) : (D_801D024A - 1); + } + if ((D_801D0172 & 0xff) != D_801D022C) { + D_801D0172 = ((D_801D0172 & 0xff) < D_801D022C) ? (D_801D0172 + 1) : (D_801D0172 - 1); + } + if ((D_801D0150 & 0xff) != D_801D0171) { + D_801D0150 = ((D_801D0150 & 0xff) < D_801D0171) ? (D_801D0150 + 1) : (D_801D0150 - 1); + } + D_801D0230 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CEED0; +extern void *D_801CEED4; +extern void *D_801CEED8; +extern s32 D_801CEF00; +extern s32 D_801CEF04; +extern s32 D_801CEF08; +extern s32 D_801D01A4[]; + +extern u8 D_8018695C[]; +extern u8 D_80186A04[]; +extern u8 D_801868B4[]; +extern u8 D_801869B0[]; +extern u8 D_80186A30[]; +extern u8 D_80186908[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CEF00 = param_2; + D_801CEF04 = (param_2 >> 2) & 3; + D_801CEF08 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CEED0 = D_8018695C; + D_801CEED4 = D_80186A04; + D_801CEED8 = D_801868B4; + } else { + D_801CEED0 = D_801869B0; + D_801CEED4 = D_80186A30; + D_801CEED8 = D_80186908; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CEF08 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CEF00 & 2) != 0) { + D_801D01A4[0] = 0x140; + D_801D01A4[3] = 0x80; + if (p[0x37] == 4) { + D_801D01A4[0] = 0x140; + D_801D01A4[3] = 0; + } + if (p[0x37] == 0) { + D_801D01A4[0] = 0x140; + D_801D01A4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CEED8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CEED8; +extern s16 *D_801CEEDC; +extern s32 D_801CEEEC; +extern s32 D_801CEF0C; +extern s32 D_801CEF10; +extern s32 D_801CEF14; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CEEDC != 0) { + D_801CEEEC = 0; + p = (int *)(param_1 * 12 + (int)D_801CEED8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CEF0C != x) { + flag = 1; + if (D_801CEF0C < x) { + if (x - D_801CEF0C < 5) { + D_801CEF0C = x; + } else { + D_801CEF0C = D_801CEF0C + 4; + } + } else { + if (D_801CEF0C - x < 5) { + D_801CEF0C = x; + } else { + D_801CEF0C = D_801CEF0C - 4; + } + } + } + if (D_801CEF10 != y) { + flag = 1; + if (D_801CEF10 < y) { + if (y - D_801CEF10 < 5) { + D_801CEF10 = y; + } else { + D_801CEF10 = D_801CEF10 + 4; + } + } else { + if (D_801CEF10 - y < 5) { + D_801CEF10 = y; + } else { + D_801CEF10 = D_801CEF10 - 4; + } + } + } + if (D_801CEF14 != z) { + flag = 1; + if (D_801CEF14 < z) { + if (z - D_801CEF14 < 5) { + D_801CEF14 = z; + } else { + D_801CEF14 = D_801CEF14 + 4; + } + } else { + if (D_801CEF14 - z < 5) { + D_801CEF14 = z; + } else { + D_801CEF14 = D_801CEF14 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CEEEC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80186AC0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CEEDC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CEF0C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CEF10); + uVar5 = (*(int*)&D_801CEF14); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80186AC0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CEEF4; + +s32 func_8013E054(void) { + return D_801CEEF4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801874BC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80187494; +extern s16 D_80187496; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801874BC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80187494 = 2; + D_80187496 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80187496 = 0; + D_80187494 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CEF28; + extern void * D_801CEF2C; + extern unsigned char D_80187134; + extern unsigned char D_8018714C; + extern unsigned char D_801871C0; + extern unsigned char D_801871C8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CEF28 = &D_80187134; + D_801CEF2C = &D_801871C0; + } else { + D_801CEF28 = &D_8018714C; + D_801CEF2C = &D_801871C8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801874BC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801874BC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801874BC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187498; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187498)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187498)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80187494; +extern s16 D_80187496; +extern unsigned char D_80187498; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187496` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80187494` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80187496; + if (*r < 3) { + *r = *r + 1; + } + D_80187494 = (u16)D_80187494 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187498); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187498; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187498); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_026/nonmatchings/ov_SC02_026_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_027/ov_SC02_027_jr_8012ACE0.c b/src/ov_SC02_027/ov_SC02_027_jr_8012ACE0.c index 3d8d668c9..847f4d328 100644 --- a/src/ov_SC02_027/ov_SC02_027_jr_8012ACE0.c +++ b/src/ov_SC02_027/ov_SC02_027_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018B844[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018B844[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018B888; -extern u8 D_8018B8CC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018B888; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018B8CC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018B910[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018B94C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018B94C; - if (((s16)a1) < 0xC00) { - tbl = D_8018B910; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018B988, D_8018B98A, D_8018B98C, D_8018B98E, D_8018B990, D_8018B992; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018B98A < ang)) goto outer_else; - if (!(ang < D_8018B990)) goto inner_else; - if (ang < D_8018B98C) { *(s16 *)L = D_8018B98C; goto done; } - if (D_8018B98E < ang) { *(s16 *)L = D_8018B98E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018B988) { *(s16 *)L = D_8018B988; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018B992 < ang) { *(s16 *)L = D_8018B992; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D8C38; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D8C38, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D8C38; -extern s8 D_801D8C3C; -extern s8 D_801D8C3D; - -void func_8013C9C4(void * arg0) -{ - D_801D8C38 = arg0; - D_801D8C3C = 0; - D_801D8C3D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D8C38; -extern s8 D_801D8C3C; -extern s8 D_801D8C3D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D8C38; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D8C3D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D8C3C)) * 2) + D_801D8C38); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D8C3D = (unsigned char) p[1]; - D_801D8C3C = D_801D8C3C + 1; - if (D_801D8C3D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D8C3C = 0; - *base = 0; - } - } - else - { - D_801D8C3D = c - 1; - } - } - return; -} - - - -extern s32 D_801D8C5C; -extern s32 D_801D8C50; -extern s32 D_801D8C54; -extern s32 D_801D8C60; - -void func_8013CABC(void) { - D_801D8C5C = 1; - D_801D8C50 = 1; - D_801D8C54 = 0; - D_801D8C60 = 1; -} - - - -extern s32 D_801D8C50; -extern s32 D_801D8C54; -extern s32 D_801D8C58; -extern s32 D_801D8C5C; -extern s32 D_801D8C60; - -void func_8013CAE8(void) { - D_801D8C50 = 1; - D_801D8C5C = 0; - D_801D8C54 = 0; - D_801D8C58 = -1; - D_801D8C60 = 0; -} - - - -extern s32 D_801D8C5C; -extern s32 D_801D8C60; -extern s32 D_801D8C88; -extern s32 D_801D8C8C; - -void func_8013CB20(void) -{ - D_801D8C88 = D_801D8C60; - D_801D8C8C = D_801D8C5C; - D_801D8C60 = 1; - D_801D8C5C = 0; -} - - - -extern s32 D_801D8C88; -extern s32 D_801D8C8C; -extern s32 D_801D8C60; -extern s32 D_801D8C5C; - -void func_8013CB5C(void) { - D_801D8C60 = D_801D8C88; - D_801D8C5C = D_801D8C8C; -} - - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801DA8E8; - extern u8 D_801DA8E9; - extern u8 D_801DA8EA; - extern u8 D_801DA8EB; - extern u8 D_801DA8EC; - extern u8 D_801DA8ED; - extern u8 D_801DA8EE; - extern u8 D_801DA8EF; - extern u8 D_801DA8F0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801DA8E8; t1 = D_801DA8E9; t2 = D_801DA8EA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801DA8EB; t1 = D_801DA8EC; t2 = D_801DA8ED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801DA8EE; t1 = D_801DA8EF; t2 = D_801DA8F0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D8C68; -extern s32 D_801D8C50; -extern s32 D_801D8C6C; -extern s32 D_801D8C5C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D8C68 != 0) { - if (D_801D8C68 != 2) { - if (((D_801D8C68 < 3) && (D_801D8C68 == 1)) && - (D_801D8C6C = D_801D8C6C + 1, 0x23a < D_801D8C6C)) { - D_801D8C50 = D_801D8C68; - D_801D8C68 = 2; - } - } else { - D_801D8C50 = D_801D8C50 + -1; - if (D_801D8C50 == 0) { - D_801D8C50 = D_801D8C68; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D8C5C == 0) { - D_801D8C68 = D_801D8C68 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D8C5C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D8C5C; -} - - - -extern s32 D_801D8C68; - -void func_8013D164(void) { - D_801D8C68 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801DA9CA; -extern u8 D_801DAA3E; -extern u8 D_801DA8F2; -extern u8 D_801DA9AC; -extern u8 D_801DA8D0; -extern u8 D_801DA8F1; -extern s32 D_801DA9B0; - -void func_8013D330(void) { - if ((D_801DA9CA & 0xff) != D_801DAA3E) { - D_801DA9CA = ((D_801DA9CA & 0xff) < D_801DAA3E) ? (D_801DA9CA + 1) : (D_801DA9CA - 1); - } - if ((D_801DA8F2 & 0xff) != D_801DA9AC) { - D_801DA8F2 = ((D_801DA8F2 & 0xff) < D_801DA9AC) ? (D_801DA8F2 + 1) : (D_801DA8F2 - 1); - } - if ((D_801DA8D0 & 0xff) != D_801DA8F1) { - D_801DA8D0 = ((D_801DA8D0 & 0xff) < D_801DA8F1) ? (D_801DA8D0 + 1) : (D_801DA8D0 - 1); - } - D_801DA9B0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D8C40; -extern void *D_801D8C44; -extern void *D_801D8C48; -extern s32 D_801D8C70; -extern s32 D_801D8C74; -extern s32 D_801D8C78; -extern s32 D_801DA924[]; - -extern u8 D_8018BA80[]; -extern u8 D_8018BB28[]; -extern u8 D_8018B9D8[]; -extern u8 D_8018BAD4[]; -extern u8 D_8018BB54[]; -extern u8 D_8018BA2C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D8C70 = param_2; - D_801D8C74 = (param_2 >> 2) & 3; - D_801D8C78 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D8C40 = D_8018BA80; - D_801D8C44 = D_8018BB28; - D_801D8C48 = D_8018B9D8; - } else { - D_801D8C40 = D_8018BAD4; - D_801D8C44 = D_8018BB54; - D_801D8C48 = D_8018BA2C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D8C78 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D8C70 & 2) != 0) { - D_801DA924[0] = 0x140; - D_801DA924[3] = 0x80; - if (p[0x37] == 4) { - D_801DA924[0] = 0x140; - D_801DA924[3] = 0; - } - if (p[0x37] == 0) { - D_801DA924[0] = 0x140; - D_801DA924[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D8C48)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D8C48; -extern s16 *D_801D8C4C; -extern s32 D_801D8C5C; -extern s32 D_801D8C7C; -extern s32 D_801D8C80; -extern s32 D_801D8C84; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D8C4C != 0) { - D_801D8C5C = 0; - p = (int *)(param_1 * 12 + (int)D_801D8C48); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D8C7C != x) { - flag = 1; - if (D_801D8C7C < x) { - if (x - D_801D8C7C < 5) { - D_801D8C7C = x; - } else { - D_801D8C7C = D_801D8C7C + 4; - } - } else { - if (D_801D8C7C - x < 5) { - D_801D8C7C = x; - } else { - D_801D8C7C = D_801D8C7C - 4; - } - } - } - if (D_801D8C80 != y) { - flag = 1; - if (D_801D8C80 < y) { - if (y - D_801D8C80 < 5) { - D_801D8C80 = y; - } else { - D_801D8C80 = D_801D8C80 + 4; - } - } else { - if (D_801D8C80 - y < 5) { - D_801D8C80 = y; - } else { - D_801D8C80 = D_801D8C80 - 4; - } - } - } - if (D_801D8C84 != z) { - flag = 1; - if (D_801D8C84 < z) { - if (z - D_801D8C84 < 5) { - D_801D8C84 = z; - } else { - D_801D8C84 = D_801D8C84 + 4; - } - } else { - if (D_801D8C84 - z < 5) { - D_801D8C84 = z; - } else { - D_801D8C84 = D_801D8C84 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D8C5C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018BBE4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D8C4C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D8C7C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D8C80); - uVar5 = (*(int*)&D_801D8C84); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018BBE4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D8C64; - -s32 func_8013E054(void) { - return D_801D8C64; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018C5E0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018C5B8; -extern s16 D_8018C5BA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018C5E0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018C5B8 = 2; - D_8018C5BA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018C5BA = 0; - D_8018C5B8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D8C98; - extern void * D_801D8C9C; - extern unsigned char D_8018C258; - extern unsigned char D_8018C270; - extern unsigned char D_8018C2E4; - extern unsigned char D_8018C2EC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D8C98 = &D_8018C258; - D_801D8C9C = &D_8018C2E4; - } else { - D_801D8C98 = &D_8018C270; - D_801D8C9C = &D_8018C2EC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018C5E0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C5E0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018C5E0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018C5BC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C5BC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C5BC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018C5B8; -extern s16 D_8018C5BA; -extern unsigned char D_8018C5BC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C5BA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018C5B8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018C5BA; - if (*r < 3) { - *r = *r + 1; - } - D_8018C5B8 = (u16)D_8018C5B8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C5BC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018C5BC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C5BC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_027/ov_SC02_027_jr_801380E0.c b/src/ov_SC02_027/ov_SC02_027_jr_801380E0.c new file mode 100644 index 000000000..4d01fa3be --- /dev/null +++ b/src/ov_SC02_027/ov_SC02_027_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D79A8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018B4D8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D8B54; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801DA9D0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D79A8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018B214)(); +extern s16 (*D_8018B218)(); +extern M2C_UNK (*D_8018B220)(); +extern s32 (*D_8018B224)(); +extern s32 D_801D8B50; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D79AC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018B56C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018EA50; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018B584; +extern M2C_UNK D_8018B58C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018B594; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018B5B0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018B5BC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018B5D0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B620[]; +extern s16 D_8018B650[]; +extern s16 D_8018B6B0[]; +extern s16 D_8018B6B8[]; +extern s16 D_8018B6D8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018B710[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018B768[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018B7B0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018B7B8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018B7C0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018B7C8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018B770; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018B790; +extern void func_801321B0(int param_1); +extern int D_8018B7A0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D8BC0; +extern s32 D_801D8BC4[]; +extern int D_801D8BC8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018B7D4; +extern u8 D_8018B7D0; +extern s16 *D_8018B7D8; +extern u8 D_8018B7DC; +extern int D_801D8BC0; +extern u16 D_801D8BD0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018B7D8; /* holds a pointer value (*(u16**)&D_8018B7D8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018B7EC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018B840; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018B844[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018B844[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018B888; +extern u8 D_8018B8CC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018B888; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018B8CC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018B910[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018B94C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018B94C; + if (((s16)a1) < 0xC00) { + tbl = D_8018B910; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018B988, D_8018B98A, D_8018B98C, D_8018B98E, D_8018B990, D_8018B992; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B98A < ang)) goto outer_else; + if (!(ang < D_8018B990)) goto inner_else; + if (ang < D_8018B98C) { *(s16 *)L = D_8018B98C; goto done; } + if (D_8018B98E < ang) { *(s16 *)L = D_8018B98E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B988) { *(s16 *)L = D_8018B988; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B992 < ang) { *(s16 *)L = D_8018B992; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D8C38; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D8C38, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D8C38; +extern s8 D_801D8C3C; +extern s8 D_801D8C3D; + +void func_8013C9C4(void * arg0) +{ + D_801D8C38 = arg0; + D_801D8C3C = 0; + D_801D8C3D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D8C38; +extern s8 D_801D8C3C; +extern s8 D_801D8C3D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D8C38; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D8C3D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D8C3C)) * 2) + D_801D8C38); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D8C3D = (unsigned char) p[1]; + D_801D8C3C = D_801D8C3C + 1; + if (D_801D8C3D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D8C3C = 0; + *base = 0; + } + } + else + { + D_801D8C3D = c - 1; + } + } + return; +} + + + +extern s32 D_801D8C5C; +extern s32 D_801D8C50; +extern s32 D_801D8C54; +extern s32 D_801D8C60; + +void func_8013CABC(void) { + D_801D8C5C = 1; + D_801D8C50 = 1; + D_801D8C54 = 0; + D_801D8C60 = 1; +} + + + +extern s32 D_801D8C50; +extern s32 D_801D8C54; +extern s32 D_801D8C58; +extern s32 D_801D8C5C; +extern s32 D_801D8C60; + +void func_8013CAE8(void) { + D_801D8C50 = 1; + D_801D8C5C = 0; + D_801D8C54 = 0; + D_801D8C58 = -1; + D_801D8C60 = 0; +} + + + +extern s32 D_801D8C5C; +extern s32 D_801D8C60; +extern s32 D_801D8C88; +extern s32 D_801D8C8C; + +void func_8013CB20(void) +{ + D_801D8C88 = D_801D8C60; + D_801D8C8C = D_801D8C5C; + D_801D8C60 = 1; + D_801D8C5C = 0; +} + + + +extern s32 D_801D8C88; +extern s32 D_801D8C8C; +extern s32 D_801D8C60; +extern s32 D_801D8C5C; + +void func_8013CB5C(void) { + D_801D8C60 = D_801D8C88; + D_801D8C5C = D_801D8C8C; +} + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801DA8E8; + extern u8 D_801DA8E9; + extern u8 D_801DA8EA; + extern u8 D_801DA8EB; + extern u8 D_801DA8EC; + extern u8 D_801DA8ED; + extern u8 D_801DA8EE; + extern u8 D_801DA8EF; + extern u8 D_801DA8F0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801DA8E8; t1 = D_801DA8E9; t2 = D_801DA8EA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801DA8EB; t1 = D_801DA8EC; t2 = D_801DA8ED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801DA8EE; t1 = D_801DA8EF; t2 = D_801DA8F0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D8C68; +extern s32 D_801D8C50; +extern s32 D_801D8C6C; +extern s32 D_801D8C5C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D8C68 != 0) { + if (D_801D8C68 != 2) { + if (((D_801D8C68 < 3) && (D_801D8C68 == 1)) && + (D_801D8C6C = D_801D8C6C + 1, 0x23a < D_801D8C6C)) { + D_801D8C50 = D_801D8C68; + D_801D8C68 = 2; + } + } else { + D_801D8C50 = D_801D8C50 + -1; + if (D_801D8C50 == 0) { + D_801D8C50 = D_801D8C68; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D8C5C == 0) { + D_801D8C68 = D_801D8C68 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D8C5C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D8C5C; +} + + + +extern s32 D_801D8C68; + +void func_8013D164(void) { + D_801D8C68 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801DA9CA; +extern u8 D_801DAA3E; +extern u8 D_801DA8F2; +extern u8 D_801DA9AC; +extern u8 D_801DA8D0; +extern u8 D_801DA8F1; +extern s32 D_801DA9B0; + +void func_8013D330(void) { + if ((D_801DA9CA & 0xff) != D_801DAA3E) { + D_801DA9CA = ((D_801DA9CA & 0xff) < D_801DAA3E) ? (D_801DA9CA + 1) : (D_801DA9CA - 1); + } + if ((D_801DA8F2 & 0xff) != D_801DA9AC) { + D_801DA8F2 = ((D_801DA8F2 & 0xff) < D_801DA9AC) ? (D_801DA8F2 + 1) : (D_801DA8F2 - 1); + } + if ((D_801DA8D0 & 0xff) != D_801DA8F1) { + D_801DA8D0 = ((D_801DA8D0 & 0xff) < D_801DA8F1) ? (D_801DA8D0 + 1) : (D_801DA8D0 - 1); + } + D_801DA9B0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D8C40; +extern void *D_801D8C44; +extern void *D_801D8C48; +extern s32 D_801D8C70; +extern s32 D_801D8C74; +extern s32 D_801D8C78; +extern s32 D_801DA924[]; + +extern u8 D_8018BA80[]; +extern u8 D_8018BB28[]; +extern u8 D_8018B9D8[]; +extern u8 D_8018BAD4[]; +extern u8 D_8018BB54[]; +extern u8 D_8018BA2C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D8C70 = param_2; + D_801D8C74 = (param_2 >> 2) & 3; + D_801D8C78 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D8C40 = D_8018BA80; + D_801D8C44 = D_8018BB28; + D_801D8C48 = D_8018B9D8; + } else { + D_801D8C40 = D_8018BAD4; + D_801D8C44 = D_8018BB54; + D_801D8C48 = D_8018BA2C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D8C78 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D8C70 & 2) != 0) { + D_801DA924[0] = 0x140; + D_801DA924[3] = 0x80; + if (p[0x37] == 4) { + D_801DA924[0] = 0x140; + D_801DA924[3] = 0; + } + if (p[0x37] == 0) { + D_801DA924[0] = 0x140; + D_801DA924[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D8C48)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D8C48; +extern s16 *D_801D8C4C; +extern s32 D_801D8C5C; +extern s32 D_801D8C7C; +extern s32 D_801D8C80; +extern s32 D_801D8C84; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D8C4C != 0) { + D_801D8C5C = 0; + p = (int *)(param_1 * 12 + (int)D_801D8C48); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D8C7C != x) { + flag = 1; + if (D_801D8C7C < x) { + if (x - D_801D8C7C < 5) { + D_801D8C7C = x; + } else { + D_801D8C7C = D_801D8C7C + 4; + } + } else { + if (D_801D8C7C - x < 5) { + D_801D8C7C = x; + } else { + D_801D8C7C = D_801D8C7C - 4; + } + } + } + if (D_801D8C80 != y) { + flag = 1; + if (D_801D8C80 < y) { + if (y - D_801D8C80 < 5) { + D_801D8C80 = y; + } else { + D_801D8C80 = D_801D8C80 + 4; + } + } else { + if (D_801D8C80 - y < 5) { + D_801D8C80 = y; + } else { + D_801D8C80 = D_801D8C80 - 4; + } + } + } + if (D_801D8C84 != z) { + flag = 1; + if (D_801D8C84 < z) { + if (z - D_801D8C84 < 5) { + D_801D8C84 = z; + } else { + D_801D8C84 = D_801D8C84 + 4; + } + } else { + if (D_801D8C84 - z < 5) { + D_801D8C84 = z; + } else { + D_801D8C84 = D_801D8C84 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D8C5C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018BBE4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D8C4C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D8C7C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D8C80); + uVar5 = (*(int*)&D_801D8C84); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018BBE4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D8C64; + +s32 func_8013E054(void) { + return D_801D8C64; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018C5E0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018C5B8; +extern s16 D_8018C5BA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018C5E0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018C5B8 = 2; + D_8018C5BA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018C5BA = 0; + D_8018C5B8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D8C98; + extern void * D_801D8C9C; + extern unsigned char D_8018C258; + extern unsigned char D_8018C270; + extern unsigned char D_8018C2E4; + extern unsigned char D_8018C2EC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D8C98 = &D_8018C258; + D_801D8C9C = &D_8018C2E4; + } else { + D_801D8C98 = &D_8018C270; + D_801D8C9C = &D_8018C2EC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018C5E0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C5E0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018C5E0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018C5BC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C5BC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C5BC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018C5B8; +extern s16 D_8018C5BA; +extern unsigned char D_8018C5BC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C5BA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018C5B8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018C5BA; + if (*r < 3) { + *r = *r + 1; + } + D_8018C5B8 = (u16)D_8018C5B8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C5BC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018C5BC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C5BC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_028/ov_SC02_028_jr_8012ACE0.c b/src/ov_SC02_028/ov_SC02_028_jr_8012ACE0.c index 00ebe2201..275d9fb59 100644 --- a/src/ov_SC02_028/ov_SC02_028_jr_8012ACE0.c +++ b/src/ov_SC02_028/ov_SC02_028_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018BA48[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018BA48[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018BA8C; -extern u8 D_8018BAD0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018BA8C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018BAD0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018BB14[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018BB50[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018BB50; - if (((s16)a1) < 0xC00) { - tbl = D_8018BB14; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018BB8C, D_8018BB8E, D_8018BB90, D_8018BB92, D_8018BB94, D_8018BB96; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018BB8E < ang)) goto outer_else; - if (!(ang < D_8018BB94)) goto inner_else; - if (ang < D_8018BB90) { *(s16 *)L = D_8018BB90; goto done; } - if (D_8018BB92 < ang) { *(s16 *)L = D_8018BB92; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018BB8C) { *(s16 *)L = D_8018BB8C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018BB96 < ang) { *(s16 *)L = D_8018BB96; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D1BD8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D1BD8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D1BD8; -extern s8 D_801D1BDC; -extern s8 D_801D1BDD; - -void func_8013C9C4(void * arg0) -{ - D_801D1BD8 = arg0; - D_801D1BDC = 0; - D_801D1BDD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D1BD8; -extern s8 D_801D1BDC; -extern s8 D_801D1BDD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D1BD8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D1BDD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D1BDC)) * 2) + D_801D1BD8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D1BDD = (unsigned char) p[1]; - D_801D1BDC = D_801D1BDC + 1; - if (D_801D1BDD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D1BDC = 0; - *base = 0; - } - } - else - { - D_801D1BDD = c - 1; - } - } - return; -} - - - -extern s32 D_801D1BFC; -extern s32 D_801D1BF0; -extern s32 D_801D1BF4; -extern s32 D_801D1C00; - -void func_8013CABC(void) { - D_801D1BFC = 1; - D_801D1BF0 = 1; - D_801D1BF4 = 0; - D_801D1C00 = 1; -} - - - -extern s32 D_801D1BF0; -extern s32 D_801D1BF4; -extern s32 D_801D1BF8; -extern s32 D_801D1BFC; -extern s32 D_801D1C00; - -void func_8013CAE8(void) { - D_801D1BF0 = 1; - D_801D1BFC = 0; - D_801D1BF4 = 0; - D_801D1BF8 = -1; - D_801D1C00 = 0; -} - - - -extern s32 D_801D1BFC; -extern s32 D_801D1C00; -extern s32 D_801D1C28; -extern s32 D_801D1C2C; - -void func_8013CB20(void) -{ - D_801D1C28 = D_801D1C00; - D_801D1C2C = D_801D1BFC; - D_801D1C00 = 1; - D_801D1BFC = 0; -} - - - -extern s32 D_801D1C28; -extern s32 D_801D1C2C; -extern s32 D_801D1C00; -extern s32 D_801D1BFC; - -void func_8013CB5C(void) { - D_801D1C00 = D_801D1C28; - D_801D1BFC = D_801D1C2C; -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D34E8; - extern u8 D_801D34E9; - extern u8 D_801D34EA; - extern u8 D_801D34EB; - extern u8 D_801D34EC; - extern u8 D_801D34ED; - extern u8 D_801D34EE; - extern u8 D_801D34EF; - extern u8 D_801D34F0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D34E8; t1 = D_801D34E9; t2 = D_801D34EA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D34EB; t1 = D_801D34EC; t2 = D_801D34ED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D34EE; t1 = D_801D34EF; t2 = D_801D34F0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D1C08; -extern s32 D_801D1BF0; -extern s32 D_801D1C0C; -extern s32 D_801D1BFC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D1C08 != 0) { - if (D_801D1C08 != 2) { - if (((D_801D1C08 < 3) && (D_801D1C08 == 1)) && - (D_801D1C0C = D_801D1C0C + 1, 0x23a < D_801D1C0C)) { - D_801D1BF0 = D_801D1C08; - D_801D1C08 = 2; - } - } else { - D_801D1BF0 = D_801D1BF0 + -1; - if (D_801D1BF0 == 0) { - D_801D1BF0 = D_801D1C08; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D1BFC == 0) { - D_801D1C08 = D_801D1C08 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D1BFC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D1BFC; -} - - - -extern s32 D_801D1C08; - -void func_8013D164(void) { - D_801D1C08 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D35CA; -extern u8 D_801D363E; -extern u8 D_801D34F2; -extern u8 D_801D35AC; -extern u8 D_801D34D0; -extern u8 D_801D34F1; -extern s32 D_801D35B0; - -void func_8013D330(void) { - if ((D_801D35CA & 0xff) != D_801D363E) { - D_801D35CA = ((D_801D35CA & 0xff) < D_801D363E) ? (D_801D35CA + 1) : (D_801D35CA - 1); - } - if ((D_801D34F2 & 0xff) != D_801D35AC) { - D_801D34F2 = ((D_801D34F2 & 0xff) < D_801D35AC) ? (D_801D34F2 + 1) : (D_801D34F2 - 1); - } - if ((D_801D34D0 & 0xff) != D_801D34F1) { - D_801D34D0 = ((D_801D34D0 & 0xff) < D_801D34F1) ? (D_801D34D0 + 1) : (D_801D34D0 - 1); - } - D_801D35B0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D1BE0; -extern void *D_801D1BE4; -extern void *D_801D1BE8; -extern s32 D_801D1C10; -extern s32 D_801D1C14; -extern s32 D_801D1C18; -extern s32 D_801D3524[]; - -extern u8 D_8018BC84[]; -extern u8 D_8018BD2C[]; -extern u8 D_8018BBDC[]; -extern u8 D_8018BCD8[]; -extern u8 D_8018BD58[]; -extern u8 D_8018BC30[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D1C10 = param_2; - D_801D1C14 = (param_2 >> 2) & 3; - D_801D1C18 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D1BE0 = D_8018BC84; - D_801D1BE4 = D_8018BD2C; - D_801D1BE8 = D_8018BBDC; - } else { - D_801D1BE0 = D_8018BCD8; - D_801D1BE4 = D_8018BD58; - D_801D1BE8 = D_8018BC30; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D1C18 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D1C10 & 2) != 0) { - D_801D3524[0] = 0x140; - D_801D3524[3] = 0x80; - if (p[0x37] == 4) { - D_801D3524[0] = 0x140; - D_801D3524[3] = 0; - } - if (p[0x37] == 0) { - D_801D3524[0] = 0x140; - D_801D3524[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D1BE8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D1BE8; -extern s16 *D_801D1BEC; -extern s32 D_801D1BFC; -extern s32 D_801D1C1C; -extern s32 D_801D1C20; -extern s32 D_801D1C24; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D1BEC != 0) { - D_801D1BFC = 0; - p = (int *)(param_1 * 12 + (int)D_801D1BE8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D1C1C != x) { - flag = 1; - if (D_801D1C1C < x) { - if (x - D_801D1C1C < 5) { - D_801D1C1C = x; - } else { - D_801D1C1C = D_801D1C1C + 4; - } - } else { - if (D_801D1C1C - x < 5) { - D_801D1C1C = x; - } else { - D_801D1C1C = D_801D1C1C - 4; - } - } - } - if (D_801D1C20 != y) { - flag = 1; - if (D_801D1C20 < y) { - if (y - D_801D1C20 < 5) { - D_801D1C20 = y; - } else { - D_801D1C20 = D_801D1C20 + 4; - } - } else { - if (D_801D1C20 - y < 5) { - D_801D1C20 = y; - } else { - D_801D1C20 = D_801D1C20 - 4; - } - } - } - if (D_801D1C24 != z) { - flag = 1; - if (D_801D1C24 < z) { - if (z - D_801D1C24 < 5) { - D_801D1C24 = z; - } else { - D_801D1C24 = D_801D1C24 + 4; - } - } else { - if (D_801D1C24 - z < 5) { - D_801D1C24 = z; - } else { - D_801D1C24 = D_801D1C24 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D1BFC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018BDE8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D1BEC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D1C1C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D1C20); - uVar5 = (*(int*)&D_801D1C24); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018BDE8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D1C04; - -s32 func_8013E054(void) { - return D_801D1C04; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018C7E4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018C7BC; -extern s16 D_8018C7BE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018C7E4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018C7BC = 2; - D_8018C7BE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018C7BE = 0; - D_8018C7BC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D1C38; - extern void * D_801D1C3C; - extern unsigned char D_8018C45C; - extern unsigned char D_8018C474; - extern unsigned char D_8018C4E8; - extern unsigned char D_8018C4F0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D1C38 = &D_8018C45C; - D_801D1C3C = &D_8018C4E8; - } else { - D_801D1C38 = &D_8018C474; - D_801D1C3C = &D_8018C4F0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018C7E4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C7E4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018C7E4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018C7C0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C7C0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C7C0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018C7BC; -extern s16 D_8018C7BE; -extern unsigned char D_8018C7C0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C7BE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018C7BC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018C7BE; - if (*r < 3) { - *r = *r + 1; - } - D_8018C7BC = (u16)D_8018C7BC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C7C0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018C7C0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C7C0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_028/ov_SC02_028_jr_801380E0.c b/src/ov_SC02_028/ov_SC02_028_jr_801380E0.c new file mode 100644 index 000000000..a3355ff41 --- /dev/null +++ b/src/ov_SC02_028/ov_SC02_028_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D092C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018B6DC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D1AF4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D35D0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D092C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018B418)(); +extern s16 (*D_8018B41C)(); +extern M2C_UNK (*D_8018B424)(); +extern s32 (*D_8018B428)(); +extern s32 D_801D1AF0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D0930; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018B770; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018EC54; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018B788; +extern M2C_UNK D_8018B790; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018B798; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018B7B4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018B7C0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018B7D4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B824[]; +extern s16 D_8018B854[]; +extern s16 D_8018B8B4[]; +extern s16 D_8018B8BC[]; +extern s16 D_8018B8DC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018B914[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018B96C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018B9B4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018B9BC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018B9C4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018B9CC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018B974; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018B994; +extern void func_801321B0(int param_1); +extern int D_8018B9A4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D1B60; +extern s32 D_801D1B64[]; +extern int D_801D1B68; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018B9D8; +extern u8 D_8018B9D4; +extern s16 *D_8018B9DC; +extern u8 D_8018B9E0; +extern int D_801D1B60; +extern u16 D_801D1B70; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018B9DC; /* holds a pointer value (*(u16**)&D_8018B9DC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018B9F0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018BA44; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018BA48[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018BA48[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018BA8C; +extern u8 D_8018BAD0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018BA8C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018BAD0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018BB14[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018BB50[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018BB50; + if (((s16)a1) < 0xC00) { + tbl = D_8018BB14; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018BB8C, D_8018BB8E, D_8018BB90, D_8018BB92, D_8018BB94, D_8018BB96; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018BB8E < ang)) goto outer_else; + if (!(ang < D_8018BB94)) goto inner_else; + if (ang < D_8018BB90) { *(s16 *)L = D_8018BB90; goto done; } + if (D_8018BB92 < ang) { *(s16 *)L = D_8018BB92; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018BB8C) { *(s16 *)L = D_8018BB8C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018BB96 < ang) { *(s16 *)L = D_8018BB96; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D1BD8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D1BD8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D1BD8; +extern s8 D_801D1BDC; +extern s8 D_801D1BDD; + +void func_8013C9C4(void * arg0) +{ + D_801D1BD8 = arg0; + D_801D1BDC = 0; + D_801D1BDD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D1BD8; +extern s8 D_801D1BDC; +extern s8 D_801D1BDD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D1BD8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D1BDD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D1BDC)) * 2) + D_801D1BD8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D1BDD = (unsigned char) p[1]; + D_801D1BDC = D_801D1BDC + 1; + if (D_801D1BDD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D1BDC = 0; + *base = 0; + } + } + else + { + D_801D1BDD = c - 1; + } + } + return; +} + + + +extern s32 D_801D1BFC; +extern s32 D_801D1BF0; +extern s32 D_801D1BF4; +extern s32 D_801D1C00; + +void func_8013CABC(void) { + D_801D1BFC = 1; + D_801D1BF0 = 1; + D_801D1BF4 = 0; + D_801D1C00 = 1; +} + + + +extern s32 D_801D1BF0; +extern s32 D_801D1BF4; +extern s32 D_801D1BF8; +extern s32 D_801D1BFC; +extern s32 D_801D1C00; + +void func_8013CAE8(void) { + D_801D1BF0 = 1; + D_801D1BFC = 0; + D_801D1BF4 = 0; + D_801D1BF8 = -1; + D_801D1C00 = 0; +} + + + +extern s32 D_801D1BFC; +extern s32 D_801D1C00; +extern s32 D_801D1C28; +extern s32 D_801D1C2C; + +void func_8013CB20(void) +{ + D_801D1C28 = D_801D1C00; + D_801D1C2C = D_801D1BFC; + D_801D1C00 = 1; + D_801D1BFC = 0; +} + + + +extern s32 D_801D1C28; +extern s32 D_801D1C2C; +extern s32 D_801D1C00; +extern s32 D_801D1BFC; + +void func_8013CB5C(void) { + D_801D1C00 = D_801D1C28; + D_801D1BFC = D_801D1C2C; +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D34E8; + extern u8 D_801D34E9; + extern u8 D_801D34EA; + extern u8 D_801D34EB; + extern u8 D_801D34EC; + extern u8 D_801D34ED; + extern u8 D_801D34EE; + extern u8 D_801D34EF; + extern u8 D_801D34F0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D34E8; t1 = D_801D34E9; t2 = D_801D34EA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D34EB; t1 = D_801D34EC; t2 = D_801D34ED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D34EE; t1 = D_801D34EF; t2 = D_801D34F0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D1C08; +extern s32 D_801D1BF0; +extern s32 D_801D1C0C; +extern s32 D_801D1BFC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D1C08 != 0) { + if (D_801D1C08 != 2) { + if (((D_801D1C08 < 3) && (D_801D1C08 == 1)) && + (D_801D1C0C = D_801D1C0C + 1, 0x23a < D_801D1C0C)) { + D_801D1BF0 = D_801D1C08; + D_801D1C08 = 2; + } + } else { + D_801D1BF0 = D_801D1BF0 + -1; + if (D_801D1BF0 == 0) { + D_801D1BF0 = D_801D1C08; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D1BFC == 0) { + D_801D1C08 = D_801D1C08 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D1BFC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D1BFC; +} + + + +extern s32 D_801D1C08; + +void func_8013D164(void) { + D_801D1C08 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D35CA; +extern u8 D_801D363E; +extern u8 D_801D34F2; +extern u8 D_801D35AC; +extern u8 D_801D34D0; +extern u8 D_801D34F1; +extern s32 D_801D35B0; + +void func_8013D330(void) { + if ((D_801D35CA & 0xff) != D_801D363E) { + D_801D35CA = ((D_801D35CA & 0xff) < D_801D363E) ? (D_801D35CA + 1) : (D_801D35CA - 1); + } + if ((D_801D34F2 & 0xff) != D_801D35AC) { + D_801D34F2 = ((D_801D34F2 & 0xff) < D_801D35AC) ? (D_801D34F2 + 1) : (D_801D34F2 - 1); + } + if ((D_801D34D0 & 0xff) != D_801D34F1) { + D_801D34D0 = ((D_801D34D0 & 0xff) < D_801D34F1) ? (D_801D34D0 + 1) : (D_801D34D0 - 1); + } + D_801D35B0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D1BE0; +extern void *D_801D1BE4; +extern void *D_801D1BE8; +extern s32 D_801D1C10; +extern s32 D_801D1C14; +extern s32 D_801D1C18; +extern s32 D_801D3524[]; + +extern u8 D_8018BC84[]; +extern u8 D_8018BD2C[]; +extern u8 D_8018BBDC[]; +extern u8 D_8018BCD8[]; +extern u8 D_8018BD58[]; +extern u8 D_8018BC30[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D1C10 = param_2; + D_801D1C14 = (param_2 >> 2) & 3; + D_801D1C18 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D1BE0 = D_8018BC84; + D_801D1BE4 = D_8018BD2C; + D_801D1BE8 = D_8018BBDC; + } else { + D_801D1BE0 = D_8018BCD8; + D_801D1BE4 = D_8018BD58; + D_801D1BE8 = D_8018BC30; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D1C18 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D1C10 & 2) != 0) { + D_801D3524[0] = 0x140; + D_801D3524[3] = 0x80; + if (p[0x37] == 4) { + D_801D3524[0] = 0x140; + D_801D3524[3] = 0; + } + if (p[0x37] == 0) { + D_801D3524[0] = 0x140; + D_801D3524[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D1BE8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D1BE8; +extern s16 *D_801D1BEC; +extern s32 D_801D1BFC; +extern s32 D_801D1C1C; +extern s32 D_801D1C20; +extern s32 D_801D1C24; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D1BEC != 0) { + D_801D1BFC = 0; + p = (int *)(param_1 * 12 + (int)D_801D1BE8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D1C1C != x) { + flag = 1; + if (D_801D1C1C < x) { + if (x - D_801D1C1C < 5) { + D_801D1C1C = x; + } else { + D_801D1C1C = D_801D1C1C + 4; + } + } else { + if (D_801D1C1C - x < 5) { + D_801D1C1C = x; + } else { + D_801D1C1C = D_801D1C1C - 4; + } + } + } + if (D_801D1C20 != y) { + flag = 1; + if (D_801D1C20 < y) { + if (y - D_801D1C20 < 5) { + D_801D1C20 = y; + } else { + D_801D1C20 = D_801D1C20 + 4; + } + } else { + if (D_801D1C20 - y < 5) { + D_801D1C20 = y; + } else { + D_801D1C20 = D_801D1C20 - 4; + } + } + } + if (D_801D1C24 != z) { + flag = 1; + if (D_801D1C24 < z) { + if (z - D_801D1C24 < 5) { + D_801D1C24 = z; + } else { + D_801D1C24 = D_801D1C24 + 4; + } + } else { + if (D_801D1C24 - z < 5) { + D_801D1C24 = z; + } else { + D_801D1C24 = D_801D1C24 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D1BFC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018BDE8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D1BEC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D1C1C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D1C20); + uVar5 = (*(int*)&D_801D1C24); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018BDE8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D1C04; + +s32 func_8013E054(void) { + return D_801D1C04; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018C7E4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018C7BC; +extern s16 D_8018C7BE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018C7E4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018C7BC = 2; + D_8018C7BE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018C7BE = 0; + D_8018C7BC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D1C38; + extern void * D_801D1C3C; + extern unsigned char D_8018C45C; + extern unsigned char D_8018C474; + extern unsigned char D_8018C4E8; + extern unsigned char D_8018C4F0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D1C38 = &D_8018C45C; + D_801D1C3C = &D_8018C4E8; + } else { + D_801D1C38 = &D_8018C474; + D_801D1C3C = &D_8018C4F0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018C7E4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C7E4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018C7E4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018C7C0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C7C0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C7C0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018C7BC; +extern s16 D_8018C7BE; +extern unsigned char D_8018C7C0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C7BE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018C7BC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018C7BE; + if (*r < 3) { + *r = *r + 1; + } + D_8018C7BC = (u16)D_8018C7BC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C7C0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018C7C0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C7C0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_031/ov_SC02_031_jr_8012ACE0.c b/src/ov_SC02_031/ov_SC02_031_jr_8012ACE0.c index dde3750fb..33347dc38 100644 --- a/src/ov_SC02_031/ov_SC02_031_jr_8012ACE0.c +++ b/src/ov_SC02_031/ov_SC02_031_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185274[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185274[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801852B8; -extern u8 D_801852FC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801852B8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801852FC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80185340[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018537C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018537C; - if (((s16)a1) < 0xC00) { - tbl = D_80185340; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801853B8, D_801853BA, D_801853BC, D_801853BE, D_801853C0, D_801853C2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801853BA < ang)) goto outer_else; - if (!(ang < D_801853C0)) goto inner_else; - if (ang < D_801853BC) { *(s16 *)L = D_801853BC; goto done; } - if (D_801853BE < ang) { *(s16 *)L = D_801853BE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801853B8) { *(s16 *)L = D_801853B8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801853C2 < ang) { *(s16 *)L = D_801853C2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B6350; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B6350, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B6350; -extern s8 D_801B6354; -extern s8 D_801B6355; - -void func_8013C9C4(void * arg0) -{ - D_801B6350 = arg0; - D_801B6354 = 0; - D_801B6355 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B6350; -extern s8 D_801B6354; -extern s8 D_801B6355; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B6350; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B6355; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B6354)) * 2) + D_801B6350); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B6355 = (unsigned char) p[1]; - D_801B6354 = D_801B6354 + 1; - if (D_801B6355 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B6354 = 0; - *base = 0; - } - } - else - { - D_801B6355 = c - 1; - } - } - return; -} - - - -extern s32 D_801B6374; -extern s32 D_801B6368; -extern s32 D_801B636C; -extern s32 D_801B6378; - -void func_8013CABC(void) { - D_801B6374 = 1; - D_801B6368 = 1; - D_801B636C = 0; - D_801B6378 = 1; -} - - - -extern s32 D_801B6368; -extern s32 D_801B636C; -extern s32 D_801B6370; -extern s32 D_801B6374; -extern s32 D_801B6378; - -void func_8013CAE8(void) { - D_801B6368 = 1; - D_801B6374 = 0; - D_801B636C = 0; - D_801B6370 = -1; - D_801B6378 = 0; -} - - - -extern s32 D_801B6374; -extern s32 D_801B6378; -extern s32 D_801B63A0; -extern s32 D_801B63A4; - -void func_8013CB20(void) -{ - D_801B63A0 = D_801B6378; - D_801B63A4 = D_801B6374; - D_801B6378 = 1; - D_801B6374 = 0; -} - - - -extern s32 D_801B63A0; -extern s32 D_801B63A4; -extern s32 D_801B6378; -extern s32 D_801B6374; - -void func_8013CB5C(void) { - D_801B6378 = D_801B63A0; - D_801B6374 = D_801B63A4; -} - - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B79B8; - extern u8 D_801B79B9; - extern u8 D_801B79BA; - extern u8 D_801B79BB; - extern u8 D_801B79BC; - extern u8 D_801B79BD; - extern u8 D_801B79BE; - extern u8 D_801B79BF; - extern u8 D_801B79C0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B79B8; t1 = D_801B79B9; t2 = D_801B79BA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B79BB; t1 = D_801B79BC; t2 = D_801B79BD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B79BE; t1 = D_801B79BF; t2 = D_801B79C0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B6380; -extern s32 D_801B6368; -extern s32 D_801B6384; -extern s32 D_801B6374; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B6380 != 0) { - if (D_801B6380 != 2) { - if (((D_801B6380 < 3) && (D_801B6380 == 1)) && - (D_801B6384 = D_801B6384 + 1, 0x23a < D_801B6384)) { - D_801B6368 = D_801B6380; - D_801B6380 = 2; - } - } else { - D_801B6368 = D_801B6368 + -1; - if (D_801B6368 == 0) { - D_801B6368 = D_801B6380; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B6374 == 0) { - D_801B6380 = D_801B6380 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B6374; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B6374; -} - - - -extern s32 D_801B6380; - -void func_8013D164(void) { - D_801B6380 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B7A9A; -extern u8 D_801B7B0E; -extern u8 D_801B79C2; -extern u8 D_801B7A7C; -extern u8 D_801B79A0; -extern u8 D_801B79C1; -extern s32 D_801B7A80; - -void func_8013D330(void) { - if ((D_801B7A9A & 0xff) != D_801B7B0E) { - D_801B7A9A = ((D_801B7A9A & 0xff) < D_801B7B0E) ? (D_801B7A9A + 1) : (D_801B7A9A - 1); - } - if ((D_801B79C2 & 0xff) != D_801B7A7C) { - D_801B79C2 = ((D_801B79C2 & 0xff) < D_801B7A7C) ? (D_801B79C2 + 1) : (D_801B79C2 - 1); - } - if ((D_801B79A0 & 0xff) != D_801B79C1) { - D_801B79A0 = ((D_801B79A0 & 0xff) < D_801B79C1) ? (D_801B79A0 + 1) : (D_801B79A0 - 1); - } - D_801B7A80 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B6358; -extern void *D_801B635C; -extern void *D_801B6360; -extern s32 D_801B6388; -extern s32 D_801B638C; -extern s32 D_801B6390; -extern s32 D_801B79F4[]; - -extern u8 D_801854B0[]; -extern u8 D_80185558[]; -extern u8 D_80185408[]; -extern u8 D_80185504[]; -extern u8 D_80185584[]; -extern u8 D_8018545C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B6388 = param_2; - D_801B638C = (param_2 >> 2) & 3; - D_801B6390 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B6358 = D_801854B0; - D_801B635C = D_80185558; - D_801B6360 = D_80185408; - } else { - D_801B6358 = D_80185504; - D_801B635C = D_80185584; - D_801B6360 = D_8018545C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B6390 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B6388 & 2) != 0) { - D_801B79F4[0] = 0x140; - D_801B79F4[3] = 0x80; - if (p[0x37] == 4) { - D_801B79F4[0] = 0x140; - D_801B79F4[3] = 0; - } - if (p[0x37] == 0) { - D_801B79F4[0] = 0x140; - D_801B79F4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B6360)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B6360; -extern s16 *D_801B6364; -extern s32 D_801B6374; -extern s32 D_801B6394; -extern s32 D_801B6398; -extern s32 D_801B639C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B6364 != 0) { - D_801B6374 = 0; - p = (int *)(param_1 * 12 + (int)D_801B6360); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B6394 != x) { - flag = 1; - if (D_801B6394 < x) { - if (x - D_801B6394 < 5) { - D_801B6394 = x; - } else { - D_801B6394 = D_801B6394 + 4; - } - } else { - if (D_801B6394 - x < 5) { - D_801B6394 = x; - } else { - D_801B6394 = D_801B6394 - 4; - } - } - } - if (D_801B6398 != y) { - flag = 1; - if (D_801B6398 < y) { - if (y - D_801B6398 < 5) { - D_801B6398 = y; - } else { - D_801B6398 = D_801B6398 + 4; - } - } else { - if (D_801B6398 - y < 5) { - D_801B6398 = y; - } else { - D_801B6398 = D_801B6398 - 4; - } - } - } - if (D_801B639C != z) { - flag = 1; - if (D_801B639C < z) { - if (z - D_801B639C < 5) { - D_801B639C = z; - } else { - D_801B639C = D_801B639C + 4; - } - } else { - if (D_801B639C - z < 5) { - D_801B639C = z; - } else { - D_801B639C = D_801B639C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B6374 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185614[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B6364); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B6394); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B6398); - uVar5 = (*(int*)&D_801B639C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185614); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B637C; - -s32 func_8013E054(void) { - return D_801B637C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186010; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80185FE8; -extern s16 D_80185FEA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186010; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80185FE8 = 2; - D_80185FEA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80185FEA = 0; - D_80185FE8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B63B0; - extern void * D_801B63B4; - extern unsigned char D_80185C88; - extern unsigned char D_80185CA0; - extern unsigned char D_80185D14; - extern unsigned char D_80185D1C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B63B0 = &D_80185C88; - D_801B63B4 = &D_80185D14; - } else { - D_801B63B0 = &D_80185CA0; - D_801B63B4 = &D_80185D1C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186010/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186010 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186010)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80185FEC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185FEC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185FEC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80185FE8; -extern s16 D_80185FEA; -extern unsigned char D_80185FEC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185FEA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80185FE8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80185FEA; - if (*r < 3) { - *r = *r + 1; - } - D_80185FE8 = (u16)D_80185FE8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185FEC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80185FEC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185FEC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_031/ov_SC02_031_jr_801380E0.c b/src/ov_SC02_031/ov_SC02_031_jr_801380E0.c new file mode 100644 index 000000000..820846010 --- /dev/null +++ b/src/ov_SC02_031/ov_SC02_031_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B5128; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184F08[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B626C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B7AA0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B5128; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184C44)(); +extern s16 (*D_80184C48)(); +extern M2C_UNK (*D_80184C50)(); +extern s32 (*D_80184C54)(); +extern s32 D_801B6268; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B512C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80184F9C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80188480; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184FB4; +extern M2C_UNK D_80184FBC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184FC4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80184FE0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80184FEC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185000[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185050[]; +extern s16 D_80185080[]; +extern s16 D_801850E0[]; +extern s16 D_801850E8[]; +extern s16 D_80185108[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80185140[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185198[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801851E0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801851E8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801851F0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801851F8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801851A0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801851C0; +extern void func_801321B0(int param_1); +extern int D_801851D0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B62D8; +extern s32 D_801B62DC[]; +extern int D_801B62E0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185204; +extern u8 D_80185200; +extern s16 *D_80185208; +extern u8 D_8018520C; +extern int D_801B62D8; +extern u16 D_801B62E8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185208; /* holds a pointer value (*(u16**)&D_80185208) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018521C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185270; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185274[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185274[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801852B8; +extern u8 D_801852FC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801852B8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801852FC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80185340[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018537C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018537C; + if (((s16)a1) < 0xC00) { + tbl = D_80185340; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801853B8, D_801853BA, D_801853BC, D_801853BE, D_801853C0, D_801853C2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801853BA < ang)) goto outer_else; + if (!(ang < D_801853C0)) goto inner_else; + if (ang < D_801853BC) { *(s16 *)L = D_801853BC; goto done; } + if (D_801853BE < ang) { *(s16 *)L = D_801853BE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801853B8) { *(s16 *)L = D_801853B8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801853C2 < ang) { *(s16 *)L = D_801853C2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B6350; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B6350, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B6350; +extern s8 D_801B6354; +extern s8 D_801B6355; + +void func_8013C9C4(void * arg0) +{ + D_801B6350 = arg0; + D_801B6354 = 0; + D_801B6355 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B6350; +extern s8 D_801B6354; +extern s8 D_801B6355; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B6350; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B6355; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B6354)) * 2) + D_801B6350); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B6355 = (unsigned char) p[1]; + D_801B6354 = D_801B6354 + 1; + if (D_801B6355 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B6354 = 0; + *base = 0; + } + } + else + { + D_801B6355 = c - 1; + } + } + return; +} + + + +extern s32 D_801B6374; +extern s32 D_801B6368; +extern s32 D_801B636C; +extern s32 D_801B6378; + +void func_8013CABC(void) { + D_801B6374 = 1; + D_801B6368 = 1; + D_801B636C = 0; + D_801B6378 = 1; +} + + + +extern s32 D_801B6368; +extern s32 D_801B636C; +extern s32 D_801B6370; +extern s32 D_801B6374; +extern s32 D_801B6378; + +void func_8013CAE8(void) { + D_801B6368 = 1; + D_801B6374 = 0; + D_801B636C = 0; + D_801B6370 = -1; + D_801B6378 = 0; +} + + + +extern s32 D_801B6374; +extern s32 D_801B6378; +extern s32 D_801B63A0; +extern s32 D_801B63A4; + +void func_8013CB20(void) +{ + D_801B63A0 = D_801B6378; + D_801B63A4 = D_801B6374; + D_801B6378 = 1; + D_801B6374 = 0; +} + + + +extern s32 D_801B63A0; +extern s32 D_801B63A4; +extern s32 D_801B6378; +extern s32 D_801B6374; + +void func_8013CB5C(void) { + D_801B6378 = D_801B63A0; + D_801B6374 = D_801B63A4; +} + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B79B8; + extern u8 D_801B79B9; + extern u8 D_801B79BA; + extern u8 D_801B79BB; + extern u8 D_801B79BC; + extern u8 D_801B79BD; + extern u8 D_801B79BE; + extern u8 D_801B79BF; + extern u8 D_801B79C0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B79B8; t1 = D_801B79B9; t2 = D_801B79BA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B79BB; t1 = D_801B79BC; t2 = D_801B79BD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B79BE; t1 = D_801B79BF; t2 = D_801B79C0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B6380; +extern s32 D_801B6368; +extern s32 D_801B6384; +extern s32 D_801B6374; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B6380 != 0) { + if (D_801B6380 != 2) { + if (((D_801B6380 < 3) && (D_801B6380 == 1)) && + (D_801B6384 = D_801B6384 + 1, 0x23a < D_801B6384)) { + D_801B6368 = D_801B6380; + D_801B6380 = 2; + } + } else { + D_801B6368 = D_801B6368 + -1; + if (D_801B6368 == 0) { + D_801B6368 = D_801B6380; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B6374 == 0) { + D_801B6380 = D_801B6380 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B6374; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B6374; +} + + + +extern s32 D_801B6380; + +void func_8013D164(void) { + D_801B6380 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B7A9A; +extern u8 D_801B7B0E; +extern u8 D_801B79C2; +extern u8 D_801B7A7C; +extern u8 D_801B79A0; +extern u8 D_801B79C1; +extern s32 D_801B7A80; + +void func_8013D330(void) { + if ((D_801B7A9A & 0xff) != D_801B7B0E) { + D_801B7A9A = ((D_801B7A9A & 0xff) < D_801B7B0E) ? (D_801B7A9A + 1) : (D_801B7A9A - 1); + } + if ((D_801B79C2 & 0xff) != D_801B7A7C) { + D_801B79C2 = ((D_801B79C2 & 0xff) < D_801B7A7C) ? (D_801B79C2 + 1) : (D_801B79C2 - 1); + } + if ((D_801B79A0 & 0xff) != D_801B79C1) { + D_801B79A0 = ((D_801B79A0 & 0xff) < D_801B79C1) ? (D_801B79A0 + 1) : (D_801B79A0 - 1); + } + D_801B7A80 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B6358; +extern void *D_801B635C; +extern void *D_801B6360; +extern s32 D_801B6388; +extern s32 D_801B638C; +extern s32 D_801B6390; +extern s32 D_801B79F4[]; + +extern u8 D_801854B0[]; +extern u8 D_80185558[]; +extern u8 D_80185408[]; +extern u8 D_80185504[]; +extern u8 D_80185584[]; +extern u8 D_8018545C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B6388 = param_2; + D_801B638C = (param_2 >> 2) & 3; + D_801B6390 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B6358 = D_801854B0; + D_801B635C = D_80185558; + D_801B6360 = D_80185408; + } else { + D_801B6358 = D_80185504; + D_801B635C = D_80185584; + D_801B6360 = D_8018545C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B6390 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B6388 & 2) != 0) { + D_801B79F4[0] = 0x140; + D_801B79F4[3] = 0x80; + if (p[0x37] == 4) { + D_801B79F4[0] = 0x140; + D_801B79F4[3] = 0; + } + if (p[0x37] == 0) { + D_801B79F4[0] = 0x140; + D_801B79F4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B6360)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B6360; +extern s16 *D_801B6364; +extern s32 D_801B6374; +extern s32 D_801B6394; +extern s32 D_801B6398; +extern s32 D_801B639C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B6364 != 0) { + D_801B6374 = 0; + p = (int *)(param_1 * 12 + (int)D_801B6360); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B6394 != x) { + flag = 1; + if (D_801B6394 < x) { + if (x - D_801B6394 < 5) { + D_801B6394 = x; + } else { + D_801B6394 = D_801B6394 + 4; + } + } else { + if (D_801B6394 - x < 5) { + D_801B6394 = x; + } else { + D_801B6394 = D_801B6394 - 4; + } + } + } + if (D_801B6398 != y) { + flag = 1; + if (D_801B6398 < y) { + if (y - D_801B6398 < 5) { + D_801B6398 = y; + } else { + D_801B6398 = D_801B6398 + 4; + } + } else { + if (D_801B6398 - y < 5) { + D_801B6398 = y; + } else { + D_801B6398 = D_801B6398 - 4; + } + } + } + if (D_801B639C != z) { + flag = 1; + if (D_801B639C < z) { + if (z - D_801B639C < 5) { + D_801B639C = z; + } else { + D_801B639C = D_801B639C + 4; + } + } else { + if (D_801B639C - z < 5) { + D_801B639C = z; + } else { + D_801B639C = D_801B639C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B6374 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185614[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B6364); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B6394); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B6398); + uVar5 = (*(int*)&D_801B639C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185614); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B637C; + +s32 func_8013E054(void) { + return D_801B637C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186010; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80185FE8; +extern s16 D_80185FEA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186010; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80185FE8 = 2; + D_80185FEA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80185FEA = 0; + D_80185FE8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B63B0; + extern void * D_801B63B4; + extern unsigned char D_80185C88; + extern unsigned char D_80185CA0; + extern unsigned char D_80185D14; + extern unsigned char D_80185D1C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B63B0 = &D_80185C88; + D_801B63B4 = &D_80185D14; + } else { + D_801B63B0 = &D_80185CA0; + D_801B63B4 = &D_80185D1C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186010/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186010 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186010)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80185FEC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185FEC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185FEC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80185FE8; +extern s16 D_80185FEA; +extern unsigned char D_80185FEC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185FEA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80185FE8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80185FEA; + if (*r < 3) { + *r = *r + 1; + } + D_80185FE8 = (u16)D_80185FE8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185FEC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80185FEC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185FEC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_031/nonmatchings/ov_SC02_031_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_035/ov_SC02_035_jr_8012ACE0.c b/src/ov_SC02_035/ov_SC02_035_jr_8012ACE0.c index 7c35a4d0d..284890ff3 100644 --- a/src/ov_SC02_035/ov_SC02_035_jr_8012ACE0.c +++ b/src/ov_SC02_035/ov_SC02_035_jr_8012ACE0.c @@ -2824,1343 +2824,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184AD4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184AD4[*(short *)(p + 4)](); -} - - -void func_80138C30(void * a0) -{ - s16 v1 = *(s16 *)((s32)a0 + 0x4); - if (v1 == 4) { - *(s16 *)((s32)a0 + 0x4) = 2; - } else { - *(s32 *)((s32)a0 + 0x8) |= 0x800; - } - } - - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184B18; -extern u8 D_80184B5C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184B18; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184B5C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184BA0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80184BDC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80184BDC; - if (((s16)a1) < 0xC00) { - tbl = D_80184BA0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80184C18, D_80184C1A, D_80184C1C, D_80184C1E, D_80184C20, D_80184C22; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80184C1A < ang)) goto outer_else; - if (!(ang < D_80184C20)) goto inner_else; - if (ang < D_80184C1C) { *(s16 *)L = D_80184C1C; goto done; } - if (D_80184C1E < ang) { *(s16 *)L = D_80184C1E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80184C18) { *(s16 *)L = D_80184C18; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80184C22 < ang) { *(s16 *)L = D_80184C22; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801BD680; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801BD680, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801BD680; -extern s8 D_801BD684; -extern s8 D_801BD685; - -void func_8013C9C4(void * arg0) -{ - D_801BD680 = arg0; - D_801BD684 = 0; - D_801BD685 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801BD680; -extern s8 D_801BD684; -extern s8 D_801BD685; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801BD680; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801BD685; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801BD684)) * 2) + D_801BD680); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801BD685 = (unsigned char) p[1]; - D_801BD684 = D_801BD684 + 1; - if (D_801BD685 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801BD684 = 0; - *base = 0; - } - } - else - { - D_801BD685 = c - 1; - } - } - return; -} - - - -extern s32 D_801BD6A4; -extern s32 D_801BD698; -extern s32 D_801BD69C; -extern s32 D_801BD6A8; - -void func_8013CABC(void) { - D_801BD6A4 = 1; - D_801BD698 = 1; - D_801BD69C = 0; - D_801BD6A8 = 1; -} - - - -extern s32 D_801BD698; -extern s32 D_801BD69C; -extern s32 D_801BD6A0; -extern s32 D_801BD6A4; -extern s32 D_801BD6A8; - -void func_8013CAE8(void) { - D_801BD698 = 1; - D_801BD6A4 = 0; - D_801BD69C = 0; - D_801BD6A0 = -1; - D_801BD6A8 = 0; -} - - - -extern s32 D_801BD6A4; -extern s32 D_801BD6A8; -extern s32 D_801BD6D0; -extern s32 D_801BD6D4; - -void func_8013CB20(void) -{ - D_801BD6D0 = D_801BD6A8; - D_801BD6D4 = D_801BD6A4; - D_801BD6A8 = 1; - D_801BD6A4 = 0; -} - - - -extern s32 D_801BD6D0; -extern s32 D_801BD6D4; -extern s32 D_801BD6A8; -extern s32 D_801BD6A4; - -void func_8013CB5C(void) { - D_801BD6A8 = D_801BD6D0; - D_801BD6A4 = D_801BD6D4; -} - - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801BE8F0; - extern u8 D_801BE8F1; - extern u8 D_801BE8F2; - extern u8 D_801BE8F3; - extern u8 D_801BE8F4; - extern u8 D_801BE8F5; - extern u8 D_801BE8F6; - extern u8 D_801BE8F7; - extern u8 D_801BE8F8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801BE8F0; t1 = D_801BE8F1; t2 = D_801BE8F2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801BE8F3; t1 = D_801BE8F4; t2 = D_801BE8F5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801BE8F6; t1 = D_801BE8F7; t2 = D_801BE8F8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801BD6B0; -extern s32 D_801BD698; -extern s32 D_801BD6B4; -extern s32 D_801BD6A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801BD6B0 != 0) { - if (D_801BD6B0 != 2) { - if (((D_801BD6B0 < 3) && (D_801BD6B0 == 1)) && - (D_801BD6B4 = D_801BD6B4 + 1, 0x23a < D_801BD6B4)) { - D_801BD698 = D_801BD6B0; - D_801BD6B0 = 2; - } - } else { - D_801BD698 = D_801BD698 + -1; - if (D_801BD698 == 0) { - D_801BD698 = D_801BD6B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801BD6A4 == 0) { - D_801BD6B0 = D_801BD6B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801BD6A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801BD6A4; -} - - - -extern s32 D_801BD6B0; - -void func_8013D164(void) { - D_801BD6B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801BE9D2; -extern u8 D_801BEA46; -extern u8 D_801BE8FA; -extern u8 D_801BE9B4; -extern u8 D_801BE8D8; -extern u8 D_801BE8F9; -extern s32 D_801BE9B8; - -void func_8013D330(void) { - if ((D_801BE9D2 & 0xff) != D_801BEA46) { - D_801BE9D2 = ((D_801BE9D2 & 0xff) < D_801BEA46) ? (D_801BE9D2 + 1) : (D_801BE9D2 - 1); - } - if ((D_801BE8FA & 0xff) != D_801BE9B4) { - D_801BE8FA = ((D_801BE8FA & 0xff) < D_801BE9B4) ? (D_801BE8FA + 1) : (D_801BE8FA - 1); - } - if ((D_801BE8D8 & 0xff) != D_801BE8F9) { - D_801BE8D8 = ((D_801BE8D8 & 0xff) < D_801BE8F9) ? (D_801BE8D8 + 1) : (D_801BE8D8 - 1); - } - D_801BE9B8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801BD688; -extern void *D_801BD68C; -extern void *D_801BD690; -extern s32 D_801BD6B8; -extern s32 D_801BD6BC; -extern s32 D_801BD6C0; -extern s32 D_801BE92C[]; - -extern u8 D_80184D10[]; -extern u8 D_80184DB8[]; -extern u8 D_80184C68[]; -extern u8 D_80184D64[]; -extern u8 D_80184DE4[]; -extern u8 D_80184CBC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801BD6B8 = param_2; - D_801BD6BC = (param_2 >> 2) & 3; - D_801BD6C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801BD688 = D_80184D10; - D_801BD68C = D_80184DB8; - D_801BD690 = D_80184C68; - } else { - D_801BD688 = D_80184D64; - D_801BD68C = D_80184DE4; - D_801BD690 = D_80184CBC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801BD6C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801BD6B8 & 2) != 0) { - D_801BE92C[0] = 0x140; - D_801BE92C[3] = 0x80; - if (p[0x37] == 4) { - D_801BE92C[0] = 0x140; - D_801BE92C[3] = 0; - } - if (p[0x37] == 0) { - D_801BE92C[0] = 0x140; - D_801BE92C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801BD690)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801BD690; -extern s16 *D_801BD694; -extern s32 D_801BD6A4; -extern s32 D_801BD6C4; -extern s32 D_801BD6C8; -extern s32 D_801BD6CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801BD694 != 0) { - D_801BD6A4 = 0; - p = (int *)(param_1 * 12 + (int)D_801BD690); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801BD6C4 != x) { - flag = 1; - if (D_801BD6C4 < x) { - if (x - D_801BD6C4 < 5) { - D_801BD6C4 = x; - } else { - D_801BD6C4 = D_801BD6C4 + 4; - } - } else { - if (D_801BD6C4 - x < 5) { - D_801BD6C4 = x; - } else { - D_801BD6C4 = D_801BD6C4 - 4; - } - } - } - if (D_801BD6C8 != y) { - flag = 1; - if (D_801BD6C8 < y) { - if (y - D_801BD6C8 < 5) { - D_801BD6C8 = y; - } else { - D_801BD6C8 = D_801BD6C8 + 4; - } - } else { - if (D_801BD6C8 - y < 5) { - D_801BD6C8 = y; - } else { - D_801BD6C8 = D_801BD6C8 - 4; - } - } - } - if (D_801BD6CC != z) { - flag = 1; - if (D_801BD6CC < z) { - if (z - D_801BD6CC < 5) { - D_801BD6CC = z; - } else { - D_801BD6CC = D_801BD6CC + 4; - } - } else { - if (D_801BD6CC - z < 5) { - D_801BD6CC = z; - } else { - D_801BD6CC = D_801BD6CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801BD6A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80184E74[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801BD694); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BD6C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BD6C8); - uVar5 = (*(int*)&D_801BD6CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80184E74); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801BD6AC; - -s32 func_8013E054(void) { - return D_801BD6AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80185870; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80185848; -extern s16 D_8018584A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80185870; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80185848 = 2; - D_8018584A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018584A = 0; - D_80185848 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801BD6E0; - extern void * D_801BD6E4; - extern unsigned char D_801854E8; - extern unsigned char D_80185500; - extern unsigned char D_80185574; - extern unsigned char D_8018557C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801BD6E0 = &D_801854E8; - D_801BD6E4 = &D_80185574; - } else { - D_801BD6E0 = &D_80185500; - D_801BD6E4 = &D_8018557C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80185870/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185870 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80185870)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018584C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018584C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018584C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80185848; -extern s16 D_8018584A; -extern unsigned char D_8018584C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018584A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80185848` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018584A; - if (*r < 3) { - *r = *r + 1; - } - D_80185848 = (u16)D_80185848 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018584C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018584C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018584C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_035/ov_SC02_035_jr_801380E0.c b/src/ov_SC02_035/ov_SC02_035_jr_801380E0.c new file mode 100644 index 000000000..de541f4c6 --- /dev/null +++ b/src/ov_SC02_035/ov_SC02_035_jr_801380E0.c @@ -0,0 +1,2396 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801BC3F0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184768[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801BD59C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801BE9D8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801BC3F0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801844A4)(); +extern s16 (*D_801844A8)(); +extern M2C_UNK (*D_801844B0)(); +extern s32 (*D_801844B4)(); +extern s32 D_801BD598; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801BC3F4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801847FC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187CE0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184814; +extern M2C_UNK D_8018481C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184824; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80184840[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018484C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80184860[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801848B0[]; +extern s16 D_801848E0[]; +extern s16 D_80184940[]; +extern s16 D_80184948[]; +extern s16 D_80184968[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801849A0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801849F8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80184A40[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80184A48[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184A50[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184A58[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184A00; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184A20; +extern void func_801321B0(int param_1); +extern int D_80184A30; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801BD608; +extern s32 D_801BD60C[]; +extern int D_801BD610; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184A64; +extern u8 D_80184A60; +extern s16 *D_80184A68; +extern u8 D_80184A6C; +extern int D_801BD608; +extern u16 D_801BD618; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184A68; /* holds a pointer value (*(u16**)&D_80184A68) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184A7C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184AD0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184AD4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184AD4[*(short *)(p + 4)](); +} + + +void func_80138C30(void * a0) +{ + s16 v1 = *(s16 *)((s32)a0 + 0x4); + if (v1 == 4) { + *(s16 *)((s32)a0 + 0x4) = 2; + } else { + *(s32 *)((s32)a0 + 0x8) |= 0x800; + } + } + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184B18; +extern u8 D_80184B5C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184B18; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184B5C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184BA0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80184BDC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80184BDC; + if (((s16)a1) < 0xC00) { + tbl = D_80184BA0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80184C18, D_80184C1A, D_80184C1C, D_80184C1E, D_80184C20, D_80184C22; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184C1A < ang)) goto outer_else; + if (!(ang < D_80184C20)) goto inner_else; + if (ang < D_80184C1C) { *(s16 *)L = D_80184C1C; goto done; } + if (D_80184C1E < ang) { *(s16 *)L = D_80184C1E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184C18) { *(s16 *)L = D_80184C18; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184C22 < ang) { *(s16 *)L = D_80184C22; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801BD680; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801BD680, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801BD680; +extern s8 D_801BD684; +extern s8 D_801BD685; + +void func_8013C9C4(void * arg0) +{ + D_801BD680 = arg0; + D_801BD684 = 0; + D_801BD685 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801BD680; +extern s8 D_801BD684; +extern s8 D_801BD685; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801BD680; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801BD685; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801BD684)) * 2) + D_801BD680); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801BD685 = (unsigned char) p[1]; + D_801BD684 = D_801BD684 + 1; + if (D_801BD685 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801BD684 = 0; + *base = 0; + } + } + else + { + D_801BD685 = c - 1; + } + } + return; +} + + + +extern s32 D_801BD6A4; +extern s32 D_801BD698; +extern s32 D_801BD69C; +extern s32 D_801BD6A8; + +void func_8013CABC(void) { + D_801BD6A4 = 1; + D_801BD698 = 1; + D_801BD69C = 0; + D_801BD6A8 = 1; +} + + + +extern s32 D_801BD698; +extern s32 D_801BD69C; +extern s32 D_801BD6A0; +extern s32 D_801BD6A4; +extern s32 D_801BD6A8; + +void func_8013CAE8(void) { + D_801BD698 = 1; + D_801BD6A4 = 0; + D_801BD69C = 0; + D_801BD6A0 = -1; + D_801BD6A8 = 0; +} + + + +extern s32 D_801BD6A4; +extern s32 D_801BD6A8; +extern s32 D_801BD6D0; +extern s32 D_801BD6D4; + +void func_8013CB20(void) +{ + D_801BD6D0 = D_801BD6A8; + D_801BD6D4 = D_801BD6A4; + D_801BD6A8 = 1; + D_801BD6A4 = 0; +} + + + +extern s32 D_801BD6D0; +extern s32 D_801BD6D4; +extern s32 D_801BD6A8; +extern s32 D_801BD6A4; + +void func_8013CB5C(void) { + D_801BD6A8 = D_801BD6D0; + D_801BD6A4 = D_801BD6D4; +} + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801BE8F0; + extern u8 D_801BE8F1; + extern u8 D_801BE8F2; + extern u8 D_801BE8F3; + extern u8 D_801BE8F4; + extern u8 D_801BE8F5; + extern u8 D_801BE8F6; + extern u8 D_801BE8F7; + extern u8 D_801BE8F8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801BE8F0; t1 = D_801BE8F1; t2 = D_801BE8F2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801BE8F3; t1 = D_801BE8F4; t2 = D_801BE8F5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801BE8F6; t1 = D_801BE8F7; t2 = D_801BE8F8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801BD6B0; +extern s32 D_801BD698; +extern s32 D_801BD6B4; +extern s32 D_801BD6A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801BD6B0 != 0) { + if (D_801BD6B0 != 2) { + if (((D_801BD6B0 < 3) && (D_801BD6B0 == 1)) && + (D_801BD6B4 = D_801BD6B4 + 1, 0x23a < D_801BD6B4)) { + D_801BD698 = D_801BD6B0; + D_801BD6B0 = 2; + } + } else { + D_801BD698 = D_801BD698 + -1; + if (D_801BD698 == 0) { + D_801BD698 = D_801BD6B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801BD6A4 == 0) { + D_801BD6B0 = D_801BD6B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801BD6A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801BD6A4; +} + + + +extern s32 D_801BD6B0; + +void func_8013D164(void) { + D_801BD6B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801BE9D2; +extern u8 D_801BEA46; +extern u8 D_801BE8FA; +extern u8 D_801BE9B4; +extern u8 D_801BE8D8; +extern u8 D_801BE8F9; +extern s32 D_801BE9B8; + +void func_8013D330(void) { + if ((D_801BE9D2 & 0xff) != D_801BEA46) { + D_801BE9D2 = ((D_801BE9D2 & 0xff) < D_801BEA46) ? (D_801BE9D2 + 1) : (D_801BE9D2 - 1); + } + if ((D_801BE8FA & 0xff) != D_801BE9B4) { + D_801BE8FA = ((D_801BE8FA & 0xff) < D_801BE9B4) ? (D_801BE8FA + 1) : (D_801BE8FA - 1); + } + if ((D_801BE8D8 & 0xff) != D_801BE8F9) { + D_801BE8D8 = ((D_801BE8D8 & 0xff) < D_801BE8F9) ? (D_801BE8D8 + 1) : (D_801BE8D8 - 1); + } + D_801BE9B8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801BD688; +extern void *D_801BD68C; +extern void *D_801BD690; +extern s32 D_801BD6B8; +extern s32 D_801BD6BC; +extern s32 D_801BD6C0; +extern s32 D_801BE92C[]; + +extern u8 D_80184D10[]; +extern u8 D_80184DB8[]; +extern u8 D_80184C68[]; +extern u8 D_80184D64[]; +extern u8 D_80184DE4[]; +extern u8 D_80184CBC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801BD6B8 = param_2; + D_801BD6BC = (param_2 >> 2) & 3; + D_801BD6C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801BD688 = D_80184D10; + D_801BD68C = D_80184DB8; + D_801BD690 = D_80184C68; + } else { + D_801BD688 = D_80184D64; + D_801BD68C = D_80184DE4; + D_801BD690 = D_80184CBC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801BD6C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801BD6B8 & 2) != 0) { + D_801BE92C[0] = 0x140; + D_801BE92C[3] = 0x80; + if (p[0x37] == 4) { + D_801BE92C[0] = 0x140; + D_801BE92C[3] = 0; + } + if (p[0x37] == 0) { + D_801BE92C[0] = 0x140; + D_801BE92C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801BD690)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801BD690; +extern s16 *D_801BD694; +extern s32 D_801BD6A4; +extern s32 D_801BD6C4; +extern s32 D_801BD6C8; +extern s32 D_801BD6CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801BD694 != 0) { + D_801BD6A4 = 0; + p = (int *)(param_1 * 12 + (int)D_801BD690); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801BD6C4 != x) { + flag = 1; + if (D_801BD6C4 < x) { + if (x - D_801BD6C4 < 5) { + D_801BD6C4 = x; + } else { + D_801BD6C4 = D_801BD6C4 + 4; + } + } else { + if (D_801BD6C4 - x < 5) { + D_801BD6C4 = x; + } else { + D_801BD6C4 = D_801BD6C4 - 4; + } + } + } + if (D_801BD6C8 != y) { + flag = 1; + if (D_801BD6C8 < y) { + if (y - D_801BD6C8 < 5) { + D_801BD6C8 = y; + } else { + D_801BD6C8 = D_801BD6C8 + 4; + } + } else { + if (D_801BD6C8 - y < 5) { + D_801BD6C8 = y; + } else { + D_801BD6C8 = D_801BD6C8 - 4; + } + } + } + if (D_801BD6CC != z) { + flag = 1; + if (D_801BD6CC < z) { + if (z - D_801BD6CC < 5) { + D_801BD6CC = z; + } else { + D_801BD6CC = D_801BD6CC + 4; + } + } else { + if (D_801BD6CC - z < 5) { + D_801BD6CC = z; + } else { + D_801BD6CC = D_801BD6CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801BD6A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80184E74[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801BD694); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BD6C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BD6C8); + uVar5 = (*(int*)&D_801BD6CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80184E74); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801BD6AC; + +s32 func_8013E054(void) { + return D_801BD6AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80185870; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80185848; +extern s16 D_8018584A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80185870; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80185848 = 2; + D_8018584A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018584A = 0; + D_80185848 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801BD6E0; + extern void * D_801BD6E4; + extern unsigned char D_801854E8; + extern unsigned char D_80185500; + extern unsigned char D_80185574; + extern unsigned char D_8018557C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801BD6E0 = &D_801854E8; + D_801BD6E4 = &D_80185574; + } else { + D_801BD6E0 = &D_80185500; + D_801BD6E4 = &D_8018557C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80185870/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185870 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80185870)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018584C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018584C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018584C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80185848; +extern s16 D_8018584A; +extern unsigned char D_8018584C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018584A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80185848` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018584A; + if (*r < 3) { + *r = *r + 1; + } + D_80185848 = (u16)D_80185848 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018584C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018584C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018584C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_039/ov_SC02_039_jr_8012ACE0.c b/src/ov_SC02_039/ov_SC02_039_jr_8012ACE0.c index 8d14000f0..10c152aad 100644 --- a/src/ov_SC02_039/ov_SC02_039_jr_8012ACE0.c +++ b/src/ov_SC02_039/ov_SC02_039_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F700[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F700[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F744; -extern u8 D_8017F788; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F744; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F788 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F7CC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F808[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F808; - if (((s16)a1) < 0xC00) { - tbl = D_8017F7CC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F844, D_8017F846, D_8017F848, D_8017F84A, D_8017F84C, D_8017F84E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F846 < ang)) goto outer_else; - if (!(ang < D_8017F84C)) goto inner_else; - if (ang < D_8017F848) { *(s16 *)L = D_8017F848; goto done; } - if (D_8017F84A < ang) { *(s16 *)L = D_8017F84A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F844) { *(s16 *)L = D_8017F844; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F84E < ang) { *(s16 *)L = D_8017F84E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019FA30; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019FA30, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019FA30; -extern s8 D_8019FA34; -extern s8 D_8019FA35; - -void func_8013C9C4(void * arg0) -{ - D_8019FA30 = arg0; - D_8019FA34 = 0; - D_8019FA35 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019FA30; -extern s8 D_8019FA34; -extern s8 D_8019FA35; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019FA30; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019FA35; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019FA34)) * 2) + D_8019FA30); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019FA35 = (unsigned char) p[1]; - D_8019FA34 = D_8019FA34 + 1; - if (D_8019FA35 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019FA34 = 0; - *base = 0; - } - } - else - { - D_8019FA35 = c - 1; - } - } - return; -} - - - -extern s32 D_8019FA54; -extern s32 D_8019FA48; -extern s32 D_8019FA4C; -extern s32 D_8019FA58; - -void func_8013CABC(void) { - D_8019FA54 = 1; - D_8019FA48 = 1; - D_8019FA4C = 0; - D_8019FA58 = 1; -} - - - -extern s32 D_8019FA48; -extern s32 D_8019FA4C; -extern s32 D_8019FA50; -extern s32 D_8019FA54; -extern s32 D_8019FA58; - -void func_8013CAE8(void) { - D_8019FA48 = 1; - D_8019FA54 = 0; - D_8019FA4C = 0; - D_8019FA50 = -1; - D_8019FA58 = 0; -} - - - -extern s32 D_8019FA54; -extern s32 D_8019FA58; -extern s32 D_8019FA80; -extern s32 D_8019FA84; - -void func_8013CB20(void) -{ - D_8019FA80 = D_8019FA58; - D_8019FA84 = D_8019FA54; - D_8019FA58 = 1; - D_8019FA54 = 0; -} - - - -extern s32 D_8019FA80; -extern s32 D_8019FA84; -extern s32 D_8019FA58; -extern s32 D_8019FA54; - -void func_8013CB5C(void) { - D_8019FA58 = D_8019FA80; - D_8019FA54 = D_8019FA84; -} - - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A0CA8; - extern u8 D_801A0CA9; - extern u8 D_801A0CAA; - extern u8 D_801A0CAB; - extern u8 D_801A0CAC; - extern u8 D_801A0CAD; - extern u8 D_801A0CAE; - extern u8 D_801A0CAF; - extern u8 D_801A0CB0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A0CA8; t1 = D_801A0CA9; t2 = D_801A0CAA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A0CAB; t1 = D_801A0CAC; t2 = D_801A0CAD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A0CAE; t1 = D_801A0CAF; t2 = D_801A0CB0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019FA60; -extern s32 D_8019FA48; -extern s32 D_8019FA64; -extern s32 D_8019FA54; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019FA60 != 0) { - if (D_8019FA60 != 2) { - if (((D_8019FA60 < 3) && (D_8019FA60 == 1)) && - (D_8019FA64 = D_8019FA64 + 1, 0x23a < D_8019FA64)) { - D_8019FA48 = D_8019FA60; - D_8019FA60 = 2; - } - } else { - D_8019FA48 = D_8019FA48 + -1; - if (D_8019FA48 == 0) { - D_8019FA48 = D_8019FA60; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019FA54 == 0) { - D_8019FA60 = D_8019FA60 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019FA54; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019FA54; -} - - - -extern s32 D_8019FA60; - -void func_8013D164(void) { - D_8019FA60 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A0D8A; -extern u8 D_801A0DFE; -extern u8 D_801A0CB2; -extern u8 D_801A0D6C; -extern u8 D_801A0C90; -extern u8 D_801A0CB1; -extern s32 D_801A0D70; - -void func_8013D330(void) { - if ((D_801A0D8A & 0xff) != D_801A0DFE) { - D_801A0D8A = ((D_801A0D8A & 0xff) < D_801A0DFE) ? (D_801A0D8A + 1) : (D_801A0D8A - 1); - } - if ((D_801A0CB2 & 0xff) != D_801A0D6C) { - D_801A0CB2 = ((D_801A0CB2 & 0xff) < D_801A0D6C) ? (D_801A0CB2 + 1) : (D_801A0CB2 - 1); - } - if ((D_801A0C90 & 0xff) != D_801A0CB1) { - D_801A0C90 = ((D_801A0C90 & 0xff) < D_801A0CB1) ? (D_801A0C90 + 1) : (D_801A0C90 - 1); - } - D_801A0D70 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019FA38; -extern void *D_8019FA3C; -extern void *D_8019FA40; -extern s32 D_8019FA68; -extern s32 D_8019FA6C; -extern s32 D_8019FA70; -extern s32 D_801A0CE4[]; - -extern u8 D_8017F93C[]; -extern u8 D_8017F9E4[]; -extern u8 D_8017F894[]; -extern u8 D_8017F990[]; -extern u8 D_8017FA10[]; -extern u8 D_8017F8E8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019FA68 = param_2; - D_8019FA6C = (param_2 >> 2) & 3; - D_8019FA70 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019FA38 = D_8017F93C; - D_8019FA3C = D_8017F9E4; - D_8019FA40 = D_8017F894; - } else { - D_8019FA38 = D_8017F990; - D_8019FA3C = D_8017FA10; - D_8019FA40 = D_8017F8E8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019FA70 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019FA68 & 2) != 0) { - D_801A0CE4[0] = 0x140; - D_801A0CE4[3] = 0x80; - if (p[0x37] == 4) { - D_801A0CE4[0] = 0x140; - D_801A0CE4[3] = 0; - } - if (p[0x37] == 0) { - D_801A0CE4[0] = 0x140; - D_801A0CE4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019FA40)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019FA40; -extern s16 *D_8019FA44; -extern s32 D_8019FA54; -extern s32 D_8019FA74; -extern s32 D_8019FA78; -extern s32 D_8019FA7C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019FA44 != 0) { - D_8019FA54 = 0; - p = (int *)(param_1 * 12 + (int)D_8019FA40); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019FA74 != x) { - flag = 1; - if (D_8019FA74 < x) { - if (x - D_8019FA74 < 5) { - D_8019FA74 = x; - } else { - D_8019FA74 = D_8019FA74 + 4; - } - } else { - if (D_8019FA74 - x < 5) { - D_8019FA74 = x; - } else { - D_8019FA74 = D_8019FA74 - 4; - } - } - } - if (D_8019FA78 != y) { - flag = 1; - if (D_8019FA78 < y) { - if (y - D_8019FA78 < 5) { - D_8019FA78 = y; - } else { - D_8019FA78 = D_8019FA78 + 4; - } - } else { - if (D_8019FA78 - y < 5) { - D_8019FA78 = y; - } else { - D_8019FA78 = D_8019FA78 - 4; - } - } - } - if (D_8019FA7C != z) { - flag = 1; - if (D_8019FA7C < z) { - if (z - D_8019FA7C < 5) { - D_8019FA7C = z; - } else { - D_8019FA7C = D_8019FA7C + 4; - } - } else { - if (D_8019FA7C - z < 5) { - D_8019FA7C = z; - } else { - D_8019FA7C = D_8019FA7C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019FA54 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FAA0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019FA44); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019FA74); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019FA78); - uVar5 = (*(int*)&D_8019FA7C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FAA0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019FA5C; - -s32 func_8013E054(void) { - return D_8019FA5C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018049C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80180474; -extern s16 D_80180476; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018049C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80180474 = 2; - D_80180476 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80180476 = 0; - D_80180474 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019FA90; - extern void * D_8019FA94; - extern unsigned char D_80180114; - extern unsigned char D_8018012C; - extern unsigned char D_801801A0; - extern unsigned char D_801801A8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019FA90 = &D_80180114; - D_8019FA94 = &D_801801A0; - } else { - D_8019FA90 = &D_8018012C; - D_8019FA94 = &D_801801A8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018049C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018049C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018049C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180478; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180478)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180478)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80180474; -extern s16 D_80180476; -extern unsigned char D_80180478; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180476` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80180474` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80180476; - if (*r < 3) { - *r = *r + 1; - } - D_80180474 = (u16)D_80180474 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180478); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180478; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180478); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_039/ov_SC02_039_jr_801380E0.c b/src/ov_SC02_039/ov_SC02_039_jr_801380E0.c new file mode 100644 index 000000000..105eaf5c6 --- /dev/null +++ b/src/ov_SC02_039/ov_SC02_039_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019E7DC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F394[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019F94C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A0D90; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019E7DC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F0D0)(); +extern s16 (*D_8017F0D4)(); +extern M2C_UNK (*D_8017F0DC)(); +extern s32 (*D_8017F0E0)(); +extern s32 D_8019F948; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019E7E0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F428; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018290C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F440; +extern M2C_UNK D_8017F448; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F450; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F46C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F478[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F48C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F4DC[]; +extern s16 D_8017F50C[]; +extern s16 D_8017F56C[]; +extern s16 D_8017F574[]; +extern s16 D_8017F594[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F5CC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F624[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F66C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F674[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F67C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F684[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F62C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F64C; +extern void func_801321B0(int param_1); +extern int D_8017F65C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019F9B8; +extern s32 D_8019F9BC[]; +extern int D_8019F9C0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F690; +extern u8 D_8017F68C; +extern s16 *D_8017F694; +extern u8 D_8017F698; +extern int D_8019F9B8; +extern u16 D_8019F9C8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F694; /* holds a pointer value (*(u16**)&D_8017F694) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F6A8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F6FC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F700[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F700[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F744; +extern u8 D_8017F788; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F744; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F788 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F7CC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F808[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F808; + if (((s16)a1) < 0xC00) { + tbl = D_8017F7CC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F844, D_8017F846, D_8017F848, D_8017F84A, D_8017F84C, D_8017F84E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F846 < ang)) goto outer_else; + if (!(ang < D_8017F84C)) goto inner_else; + if (ang < D_8017F848) { *(s16 *)L = D_8017F848; goto done; } + if (D_8017F84A < ang) { *(s16 *)L = D_8017F84A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F844) { *(s16 *)L = D_8017F844; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F84E < ang) { *(s16 *)L = D_8017F84E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019FA30; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019FA30, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019FA30; +extern s8 D_8019FA34; +extern s8 D_8019FA35; + +void func_8013C9C4(void * arg0) +{ + D_8019FA30 = arg0; + D_8019FA34 = 0; + D_8019FA35 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019FA30; +extern s8 D_8019FA34; +extern s8 D_8019FA35; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019FA30; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019FA35; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019FA34)) * 2) + D_8019FA30); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019FA35 = (unsigned char) p[1]; + D_8019FA34 = D_8019FA34 + 1; + if (D_8019FA35 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019FA34 = 0; + *base = 0; + } + } + else + { + D_8019FA35 = c - 1; + } + } + return; +} + + + +extern s32 D_8019FA54; +extern s32 D_8019FA48; +extern s32 D_8019FA4C; +extern s32 D_8019FA58; + +void func_8013CABC(void) { + D_8019FA54 = 1; + D_8019FA48 = 1; + D_8019FA4C = 0; + D_8019FA58 = 1; +} + + + +extern s32 D_8019FA48; +extern s32 D_8019FA4C; +extern s32 D_8019FA50; +extern s32 D_8019FA54; +extern s32 D_8019FA58; + +void func_8013CAE8(void) { + D_8019FA48 = 1; + D_8019FA54 = 0; + D_8019FA4C = 0; + D_8019FA50 = -1; + D_8019FA58 = 0; +} + + + +extern s32 D_8019FA54; +extern s32 D_8019FA58; +extern s32 D_8019FA80; +extern s32 D_8019FA84; + +void func_8013CB20(void) +{ + D_8019FA80 = D_8019FA58; + D_8019FA84 = D_8019FA54; + D_8019FA58 = 1; + D_8019FA54 = 0; +} + + + +extern s32 D_8019FA80; +extern s32 D_8019FA84; +extern s32 D_8019FA58; +extern s32 D_8019FA54; + +void func_8013CB5C(void) { + D_8019FA58 = D_8019FA80; + D_8019FA54 = D_8019FA84; +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A0CA8; + extern u8 D_801A0CA9; + extern u8 D_801A0CAA; + extern u8 D_801A0CAB; + extern u8 D_801A0CAC; + extern u8 D_801A0CAD; + extern u8 D_801A0CAE; + extern u8 D_801A0CAF; + extern u8 D_801A0CB0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A0CA8; t1 = D_801A0CA9; t2 = D_801A0CAA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A0CAB; t1 = D_801A0CAC; t2 = D_801A0CAD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A0CAE; t1 = D_801A0CAF; t2 = D_801A0CB0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019FA60; +extern s32 D_8019FA48; +extern s32 D_8019FA64; +extern s32 D_8019FA54; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019FA60 != 0) { + if (D_8019FA60 != 2) { + if (((D_8019FA60 < 3) && (D_8019FA60 == 1)) && + (D_8019FA64 = D_8019FA64 + 1, 0x23a < D_8019FA64)) { + D_8019FA48 = D_8019FA60; + D_8019FA60 = 2; + } + } else { + D_8019FA48 = D_8019FA48 + -1; + if (D_8019FA48 == 0) { + D_8019FA48 = D_8019FA60; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019FA54 == 0) { + D_8019FA60 = D_8019FA60 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019FA54; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019FA54; +} + + + +extern s32 D_8019FA60; + +void func_8013D164(void) { + D_8019FA60 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A0D8A; +extern u8 D_801A0DFE; +extern u8 D_801A0CB2; +extern u8 D_801A0D6C; +extern u8 D_801A0C90; +extern u8 D_801A0CB1; +extern s32 D_801A0D70; + +void func_8013D330(void) { + if ((D_801A0D8A & 0xff) != D_801A0DFE) { + D_801A0D8A = ((D_801A0D8A & 0xff) < D_801A0DFE) ? (D_801A0D8A + 1) : (D_801A0D8A - 1); + } + if ((D_801A0CB2 & 0xff) != D_801A0D6C) { + D_801A0CB2 = ((D_801A0CB2 & 0xff) < D_801A0D6C) ? (D_801A0CB2 + 1) : (D_801A0CB2 - 1); + } + if ((D_801A0C90 & 0xff) != D_801A0CB1) { + D_801A0C90 = ((D_801A0C90 & 0xff) < D_801A0CB1) ? (D_801A0C90 + 1) : (D_801A0C90 - 1); + } + D_801A0D70 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019FA38; +extern void *D_8019FA3C; +extern void *D_8019FA40; +extern s32 D_8019FA68; +extern s32 D_8019FA6C; +extern s32 D_8019FA70; +extern s32 D_801A0CE4[]; + +extern u8 D_8017F93C[]; +extern u8 D_8017F9E4[]; +extern u8 D_8017F894[]; +extern u8 D_8017F990[]; +extern u8 D_8017FA10[]; +extern u8 D_8017F8E8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019FA68 = param_2; + D_8019FA6C = (param_2 >> 2) & 3; + D_8019FA70 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019FA38 = D_8017F93C; + D_8019FA3C = D_8017F9E4; + D_8019FA40 = D_8017F894; + } else { + D_8019FA38 = D_8017F990; + D_8019FA3C = D_8017FA10; + D_8019FA40 = D_8017F8E8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019FA70 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019FA68 & 2) != 0) { + D_801A0CE4[0] = 0x140; + D_801A0CE4[3] = 0x80; + if (p[0x37] == 4) { + D_801A0CE4[0] = 0x140; + D_801A0CE4[3] = 0; + } + if (p[0x37] == 0) { + D_801A0CE4[0] = 0x140; + D_801A0CE4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019FA40)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019FA40; +extern s16 *D_8019FA44; +extern s32 D_8019FA54; +extern s32 D_8019FA74; +extern s32 D_8019FA78; +extern s32 D_8019FA7C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019FA44 != 0) { + D_8019FA54 = 0; + p = (int *)(param_1 * 12 + (int)D_8019FA40); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019FA74 != x) { + flag = 1; + if (D_8019FA74 < x) { + if (x - D_8019FA74 < 5) { + D_8019FA74 = x; + } else { + D_8019FA74 = D_8019FA74 + 4; + } + } else { + if (D_8019FA74 - x < 5) { + D_8019FA74 = x; + } else { + D_8019FA74 = D_8019FA74 - 4; + } + } + } + if (D_8019FA78 != y) { + flag = 1; + if (D_8019FA78 < y) { + if (y - D_8019FA78 < 5) { + D_8019FA78 = y; + } else { + D_8019FA78 = D_8019FA78 + 4; + } + } else { + if (D_8019FA78 - y < 5) { + D_8019FA78 = y; + } else { + D_8019FA78 = D_8019FA78 - 4; + } + } + } + if (D_8019FA7C != z) { + flag = 1; + if (D_8019FA7C < z) { + if (z - D_8019FA7C < 5) { + D_8019FA7C = z; + } else { + D_8019FA7C = D_8019FA7C + 4; + } + } else { + if (D_8019FA7C - z < 5) { + D_8019FA7C = z; + } else { + D_8019FA7C = D_8019FA7C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019FA54 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FAA0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019FA44); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019FA74); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019FA78); + uVar5 = (*(int*)&D_8019FA7C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FAA0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019FA5C; + +s32 func_8013E054(void) { + return D_8019FA5C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018049C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80180474; +extern s16 D_80180476; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018049C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80180474 = 2; + D_80180476 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80180476 = 0; + D_80180474 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019FA90; + extern void * D_8019FA94; + extern unsigned char D_80180114; + extern unsigned char D_8018012C; + extern unsigned char D_801801A0; + extern unsigned char D_801801A8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019FA90 = &D_80180114; + D_8019FA94 = &D_801801A0; + } else { + D_8019FA90 = &D_8018012C; + D_8019FA94 = &D_801801A8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018049C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018049C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018049C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180478; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180478)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180478)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80180474; +extern s16 D_80180476; +extern unsigned char D_80180478; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180476` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80180474` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80180476; + if (*r < 3) { + *r = *r + 1; + } + D_80180474 = (u16)D_80180474 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180478); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180478; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180478); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC02_041/ov_SC02_041_jr_8012ACE0.c b/src/ov_SC02_041/ov_SC02_041_jr_8012ACE0.c index 4aa5125b3..456f3a356 100644 --- a/src/ov_SC02_041/ov_SC02_041_jr_8012ACE0.c +++ b/src/ov_SC02_041/ov_SC02_041_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801853D0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801853D0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80185414; -extern u8 D_80185458; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80185414; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80185458 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018549C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801854D8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801854D8; - if (((s16)a1) < 0xC00) { - tbl = D_8018549C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185514, D_80185516, D_80185518, D_8018551A, D_8018551C, D_8018551E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185516 < ang)) goto outer_else; - if (!(ang < D_8018551C)) goto inner_else; - if (ang < D_80185518) { *(s16 *)L = D_80185518; goto done; } - if (D_8018551A < ang) { *(s16 *)L = D_8018551A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185514) { *(s16 *)L = D_80185514; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018551E < ang) { *(s16 *)L = D_8018551E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B7DA8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B7DA8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B7DA8; -extern s8 D_801B7DAC; -extern s8 D_801B7DAD; - -void func_8013C9C4(void * arg0) -{ - D_801B7DA8 = arg0; - D_801B7DAC = 0; - D_801B7DAD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B7DA8; -extern s8 D_801B7DAC; -extern s8 D_801B7DAD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B7DA8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B7DAD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B7DAC)) * 2) + D_801B7DA8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B7DAD = (unsigned char) p[1]; - D_801B7DAC = D_801B7DAC + 1; - if (D_801B7DAD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B7DAC = 0; - *base = 0; - } - } - else - { - D_801B7DAD = c - 1; - } - } - return; -} - - - -extern s32 D_801B7DCC; -extern s32 D_801B7DC0; -extern s32 D_801B7DC4; -extern s32 D_801B7DD0; - -void func_8013CABC(void) { - D_801B7DCC = 1; - D_801B7DC0 = 1; - D_801B7DC4 = 0; - D_801B7DD0 = 1; -} - - - -extern s32 D_801B7DC0; -extern s32 D_801B7DC4; -extern s32 D_801B7DC8; -extern s32 D_801B7DCC; -extern s32 D_801B7DD0; - -void func_8013CAE8(void) { - D_801B7DC0 = 1; - D_801B7DCC = 0; - D_801B7DC4 = 0; - D_801B7DC8 = -1; - D_801B7DD0 = 0; -} - - - -extern s32 D_801B7DCC; -extern s32 D_801B7DD0; -extern s32 D_801B7DF8; -extern s32 D_801B7DFC; - -void func_8013CB20(void) -{ - D_801B7DF8 = D_801B7DD0; - D_801B7DFC = D_801B7DCC; - D_801B7DD0 = 1; - D_801B7DCC = 0; -} - - - -extern s32 D_801B7DF8; -extern s32 D_801B7DFC; -extern s32 D_801B7DD0; -extern s32 D_801B7DCC; - -void func_8013CB5C(void) { - D_801B7DD0 = D_801B7DF8; - D_801B7DCC = D_801B7DFC; -} - - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B9580; - extern u8 D_801B9581; - extern u8 D_801B9582; - extern u8 D_801B9583; - extern u8 D_801B9584; - extern u8 D_801B9585; - extern u8 D_801B9586; - extern u8 D_801B9587; - extern u8 D_801B9588; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B9580; t1 = D_801B9581; t2 = D_801B9582; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B9583; t1 = D_801B9584; t2 = D_801B9585; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B9586; t1 = D_801B9587; t2 = D_801B9588; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B7DD8; -extern s32 D_801B7DC0; -extern s32 D_801B7DDC; -extern s32 D_801B7DCC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B7DD8 != 0) { - if (D_801B7DD8 != 2) { - if (((D_801B7DD8 < 3) && (D_801B7DD8 == 1)) && - (D_801B7DDC = D_801B7DDC + 1, 0x23a < D_801B7DDC)) { - D_801B7DC0 = D_801B7DD8; - D_801B7DD8 = 2; - } - } else { - D_801B7DC0 = D_801B7DC0 + -1; - if (D_801B7DC0 == 0) { - D_801B7DC0 = D_801B7DD8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B7DCC == 0) { - D_801B7DD8 = D_801B7DD8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B7DCC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B7DCC; -} - - - -extern s32 D_801B7DD8; - -void func_8013D164(void) { - D_801B7DD8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B9662; -extern u8 D_801B96D6; -extern u8 D_801B958A; -extern u8 D_801B9644; -extern u8 D_801B9568; -extern u8 D_801B9589; -extern s32 D_801B9648; - -void func_8013D330(void) { - if ((D_801B9662 & 0xff) != D_801B96D6) { - D_801B9662 = ((D_801B9662 & 0xff) < D_801B96D6) ? (D_801B9662 + 1) : (D_801B9662 - 1); - } - if ((D_801B958A & 0xff) != D_801B9644) { - D_801B958A = ((D_801B958A & 0xff) < D_801B9644) ? (D_801B958A + 1) : (D_801B958A - 1); - } - if ((D_801B9568 & 0xff) != D_801B9589) { - D_801B9568 = ((D_801B9568 & 0xff) < D_801B9589) ? (D_801B9568 + 1) : (D_801B9568 - 1); - } - D_801B9648 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B7DB0; -extern void *D_801B7DB4; -extern void *D_801B7DB8; -extern s32 D_801B7DE0; -extern s32 D_801B7DE4; -extern s32 D_801B7DE8; -extern s32 D_801B95BC[]; - -extern u8 D_8018560C[]; -extern u8 D_801856B4[]; -extern u8 D_80185564[]; -extern u8 D_80185660[]; -extern u8 D_801856E0[]; -extern u8 D_801855B8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B7DE0 = param_2; - D_801B7DE4 = (param_2 >> 2) & 3; - D_801B7DE8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B7DB0 = D_8018560C; - D_801B7DB4 = D_801856B4; - D_801B7DB8 = D_80185564; - } else { - D_801B7DB0 = D_80185660; - D_801B7DB4 = D_801856E0; - D_801B7DB8 = D_801855B8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B7DE8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B7DE0 & 2) != 0) { - D_801B95BC[0] = 0x140; - D_801B95BC[3] = 0x80; - if (p[0x37] == 4) { - D_801B95BC[0] = 0x140; - D_801B95BC[3] = 0; - } - if (p[0x37] == 0) { - D_801B95BC[0] = 0x140; - D_801B95BC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B7DB8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B7DB8; -extern s16 *D_801B7DBC; -extern s32 D_801B7DCC; -extern s32 D_801B7DEC; -extern s32 D_801B7DF0; -extern s32 D_801B7DF4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B7DBC != 0) { - D_801B7DCC = 0; - p = (int *)(param_1 * 12 + (int)D_801B7DB8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B7DEC != x) { - flag = 1; - if (D_801B7DEC < x) { - if (x - D_801B7DEC < 5) { - D_801B7DEC = x; - } else { - D_801B7DEC = D_801B7DEC + 4; - } - } else { - if (D_801B7DEC - x < 5) { - D_801B7DEC = x; - } else { - D_801B7DEC = D_801B7DEC - 4; - } - } - } - if (D_801B7DF0 != y) { - flag = 1; - if (D_801B7DF0 < y) { - if (y - D_801B7DF0 < 5) { - D_801B7DF0 = y; - } else { - D_801B7DF0 = D_801B7DF0 + 4; - } - } else { - if (D_801B7DF0 - y < 5) { - D_801B7DF0 = y; - } else { - D_801B7DF0 = D_801B7DF0 - 4; - } - } - } - if (D_801B7DF4 != z) { - flag = 1; - if (D_801B7DF4 < z) { - if (z - D_801B7DF4 < 5) { - D_801B7DF4 = z; - } else { - D_801B7DF4 = D_801B7DF4 + 4; - } - } else { - if (D_801B7DF4 - z < 5) { - D_801B7DF4 = z; - } else { - D_801B7DF4 = D_801B7DF4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B7DCC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185770[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B7DBC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B7DEC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B7DF0); - uVar5 = (*(int*)&D_801B7DF4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185770); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B7DD4; - -s32 func_8013E054(void) { - return D_801B7DD4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018616C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186144; -extern s16 D_80186146; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018616C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186144 = 2; - D_80186146 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186146 = 0; - D_80186144 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B7E08; - extern void * D_801B7E0C; - extern unsigned char D_80185DE4; - extern unsigned char D_80185DFC; - extern unsigned char D_80185E70; - extern unsigned char D_80185E78; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B7E08 = &D_80185DE4; - D_801B7E0C = &D_80185E70; - } else { - D_801B7E08 = &D_80185DFC; - D_801B7E0C = &D_80185E78; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018616C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018616C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018616C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186148; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186148)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186148)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186144; -extern s16 D_80186146; -extern unsigned char D_80186148; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186146` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186144` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186146; - if (*r < 3) { - *r = *r + 1; - } - D_80186144 = (u16)D_80186144 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186148); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186148; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186148); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC02_041/ov_SC02_041_jr_801380E0.c b/src/ov_SC02_041/ov_SC02_041_jr_801380E0.c new file mode 100644 index 000000000..b9b21db47 --- /dev/null +++ b/src/ov_SC02_041/ov_SC02_041_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B6B48; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80185064[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B7CC4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B9668; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B6B48; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184DA0)(); +extern s16 (*D_80184DA4)(); +extern M2C_UNK (*D_80184DAC)(); +extern s32 (*D_80184DB0)(); +extern s32 D_801B7CC0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B6B4C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801850F8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801885DC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185110; +extern M2C_UNK D_80185118; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185120; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018513C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185148[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018515C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801851AC[]; +extern s16 D_801851DC[]; +extern s16 D_8018523C[]; +extern s16 D_80185244[]; +extern s16 D_80185264[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018529C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801852F4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018533C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185344[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018534C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185354[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801852FC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018531C; +extern void func_801321B0(int param_1); +extern int D_8018532C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B7D30; +extern s32 D_801B7D34[]; +extern int D_801B7D38; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185360; +extern u8 D_8018535C; +extern s16 *D_80185364; +extern u8 D_80185368; +extern int D_801B7D30; +extern u16 D_801B7D40; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185364; /* holds a pointer value (*(u16**)&D_80185364) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185378[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801853CC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801853D0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801853D0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80185414; +extern u8 D_80185458; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80185414; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80185458 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018549C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801854D8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801854D8; + if (((s16)a1) < 0xC00) { + tbl = D_8018549C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185514, D_80185516, D_80185518, D_8018551A, D_8018551C, D_8018551E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185516 < ang)) goto outer_else; + if (!(ang < D_8018551C)) goto inner_else; + if (ang < D_80185518) { *(s16 *)L = D_80185518; goto done; } + if (D_8018551A < ang) { *(s16 *)L = D_8018551A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185514) { *(s16 *)L = D_80185514; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018551E < ang) { *(s16 *)L = D_8018551E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B7DA8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B7DA8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B7DA8; +extern s8 D_801B7DAC; +extern s8 D_801B7DAD; + +void func_8013C9C4(void * arg0) +{ + D_801B7DA8 = arg0; + D_801B7DAC = 0; + D_801B7DAD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B7DA8; +extern s8 D_801B7DAC; +extern s8 D_801B7DAD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B7DA8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B7DAD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B7DAC)) * 2) + D_801B7DA8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B7DAD = (unsigned char) p[1]; + D_801B7DAC = D_801B7DAC + 1; + if (D_801B7DAD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B7DAC = 0; + *base = 0; + } + } + else + { + D_801B7DAD = c - 1; + } + } + return; +} + + + +extern s32 D_801B7DCC; +extern s32 D_801B7DC0; +extern s32 D_801B7DC4; +extern s32 D_801B7DD0; + +void func_8013CABC(void) { + D_801B7DCC = 1; + D_801B7DC0 = 1; + D_801B7DC4 = 0; + D_801B7DD0 = 1; +} + + + +extern s32 D_801B7DC0; +extern s32 D_801B7DC4; +extern s32 D_801B7DC8; +extern s32 D_801B7DCC; +extern s32 D_801B7DD0; + +void func_8013CAE8(void) { + D_801B7DC0 = 1; + D_801B7DCC = 0; + D_801B7DC4 = 0; + D_801B7DC8 = -1; + D_801B7DD0 = 0; +} + + + +extern s32 D_801B7DCC; +extern s32 D_801B7DD0; +extern s32 D_801B7DF8; +extern s32 D_801B7DFC; + +void func_8013CB20(void) +{ + D_801B7DF8 = D_801B7DD0; + D_801B7DFC = D_801B7DCC; + D_801B7DD0 = 1; + D_801B7DCC = 0; +} + + + +extern s32 D_801B7DF8; +extern s32 D_801B7DFC; +extern s32 D_801B7DD0; +extern s32 D_801B7DCC; + +void func_8013CB5C(void) { + D_801B7DD0 = D_801B7DF8; + D_801B7DCC = D_801B7DFC; +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B9580; + extern u8 D_801B9581; + extern u8 D_801B9582; + extern u8 D_801B9583; + extern u8 D_801B9584; + extern u8 D_801B9585; + extern u8 D_801B9586; + extern u8 D_801B9587; + extern u8 D_801B9588; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B9580; t1 = D_801B9581; t2 = D_801B9582; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B9583; t1 = D_801B9584; t2 = D_801B9585; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B9586; t1 = D_801B9587; t2 = D_801B9588; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B7DD8; +extern s32 D_801B7DC0; +extern s32 D_801B7DDC; +extern s32 D_801B7DCC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B7DD8 != 0) { + if (D_801B7DD8 != 2) { + if (((D_801B7DD8 < 3) && (D_801B7DD8 == 1)) && + (D_801B7DDC = D_801B7DDC + 1, 0x23a < D_801B7DDC)) { + D_801B7DC0 = D_801B7DD8; + D_801B7DD8 = 2; + } + } else { + D_801B7DC0 = D_801B7DC0 + -1; + if (D_801B7DC0 == 0) { + D_801B7DC0 = D_801B7DD8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B7DCC == 0) { + D_801B7DD8 = D_801B7DD8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B7DCC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B7DCC; +} + + + +extern s32 D_801B7DD8; + +void func_8013D164(void) { + D_801B7DD8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B9662; +extern u8 D_801B96D6; +extern u8 D_801B958A; +extern u8 D_801B9644; +extern u8 D_801B9568; +extern u8 D_801B9589; +extern s32 D_801B9648; + +void func_8013D330(void) { + if ((D_801B9662 & 0xff) != D_801B96D6) { + D_801B9662 = ((D_801B9662 & 0xff) < D_801B96D6) ? (D_801B9662 + 1) : (D_801B9662 - 1); + } + if ((D_801B958A & 0xff) != D_801B9644) { + D_801B958A = ((D_801B958A & 0xff) < D_801B9644) ? (D_801B958A + 1) : (D_801B958A - 1); + } + if ((D_801B9568 & 0xff) != D_801B9589) { + D_801B9568 = ((D_801B9568 & 0xff) < D_801B9589) ? (D_801B9568 + 1) : (D_801B9568 - 1); + } + D_801B9648 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B7DB0; +extern void *D_801B7DB4; +extern void *D_801B7DB8; +extern s32 D_801B7DE0; +extern s32 D_801B7DE4; +extern s32 D_801B7DE8; +extern s32 D_801B95BC[]; + +extern u8 D_8018560C[]; +extern u8 D_801856B4[]; +extern u8 D_80185564[]; +extern u8 D_80185660[]; +extern u8 D_801856E0[]; +extern u8 D_801855B8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B7DE0 = param_2; + D_801B7DE4 = (param_2 >> 2) & 3; + D_801B7DE8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B7DB0 = D_8018560C; + D_801B7DB4 = D_801856B4; + D_801B7DB8 = D_80185564; + } else { + D_801B7DB0 = D_80185660; + D_801B7DB4 = D_801856E0; + D_801B7DB8 = D_801855B8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B7DE8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B7DE0 & 2) != 0) { + D_801B95BC[0] = 0x140; + D_801B95BC[3] = 0x80; + if (p[0x37] == 4) { + D_801B95BC[0] = 0x140; + D_801B95BC[3] = 0; + } + if (p[0x37] == 0) { + D_801B95BC[0] = 0x140; + D_801B95BC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B7DB8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B7DB8; +extern s16 *D_801B7DBC; +extern s32 D_801B7DCC; +extern s32 D_801B7DEC; +extern s32 D_801B7DF0; +extern s32 D_801B7DF4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B7DBC != 0) { + D_801B7DCC = 0; + p = (int *)(param_1 * 12 + (int)D_801B7DB8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B7DEC != x) { + flag = 1; + if (D_801B7DEC < x) { + if (x - D_801B7DEC < 5) { + D_801B7DEC = x; + } else { + D_801B7DEC = D_801B7DEC + 4; + } + } else { + if (D_801B7DEC - x < 5) { + D_801B7DEC = x; + } else { + D_801B7DEC = D_801B7DEC - 4; + } + } + } + if (D_801B7DF0 != y) { + flag = 1; + if (D_801B7DF0 < y) { + if (y - D_801B7DF0 < 5) { + D_801B7DF0 = y; + } else { + D_801B7DF0 = D_801B7DF0 + 4; + } + } else { + if (D_801B7DF0 - y < 5) { + D_801B7DF0 = y; + } else { + D_801B7DF0 = D_801B7DF0 - 4; + } + } + } + if (D_801B7DF4 != z) { + flag = 1; + if (D_801B7DF4 < z) { + if (z - D_801B7DF4 < 5) { + D_801B7DF4 = z; + } else { + D_801B7DF4 = D_801B7DF4 + 4; + } + } else { + if (D_801B7DF4 - z < 5) { + D_801B7DF4 = z; + } else { + D_801B7DF4 = D_801B7DF4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B7DCC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185770[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B7DBC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B7DEC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B7DF0); + uVar5 = (*(int*)&D_801B7DF4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185770); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B7DD4; + +s32 func_8013E054(void) { + return D_801B7DD4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018616C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186144; +extern s16 D_80186146; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018616C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186144 = 2; + D_80186146 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186146 = 0; + D_80186144 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B7E08; + extern void * D_801B7E0C; + extern unsigned char D_80185DE4; + extern unsigned char D_80185DFC; + extern unsigned char D_80185E70; + extern unsigned char D_80185E78; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B7E08 = &D_80185DE4; + D_801B7E0C = &D_80185E70; + } else { + D_801B7E08 = &D_80185DFC; + D_801B7E0C = &D_80185E78; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018616C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018616C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018616C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186148; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186148)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186148)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186144; +extern s16 D_80186146; +extern unsigned char D_80186148; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186146` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186144` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186146; + if (*r < 3) { + *r = *r + 1; + } + D_80186144 = (u16)D_80186144 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186148); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186148; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186148); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC02_041/nonmatchings/ov_SC02_041_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_001/ov_SC03_001_jr_8012ACE0.c b/src/ov_SC03_001/ov_SC03_001_jr_8012ACE0.c index bde5a9b12..f6a9a38e3 100644 --- a/src/ov_SC03_001/ov_SC03_001_jr_8012ACE0.c +++ b/src/ov_SC03_001/ov_SC03_001_jr_8012ACE0.c @@ -2823,1334 +2823,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018DB10[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018DB10[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018DB54; -extern u8 D_8018DB98; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018DB54; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018DB98 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018DBDC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018DC18[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018DC18; - if (((s16)a1) < 0xC00) { - tbl = D_8018DBDC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018DC54, D_8018DC56, D_8018DC58, D_8018DC5A, D_8018DC5C, D_8018DC5E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018DC56 < ang)) goto outer_else; - if (!(ang < D_8018DC5C)) goto inner_else; - if (ang < D_8018DC58) { *(s16 *)L = D_8018DC58; goto done; } - if (D_8018DC5A < ang) { *(s16 *)L = D_8018DC5A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018DC54) { *(s16 *)L = D_8018DC54; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018DC5E < ang) { *(s16 *)L = D_8018DC5E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801ED428; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801ED428, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801ED428; -extern s8 D_801ED42C; -extern s8 D_801ED42D; - -void func_8013C9C4(void * arg0) -{ - D_801ED428 = arg0; - D_801ED42C = 0; - D_801ED42D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801ED428; -extern s8 D_801ED42C; -extern s8 D_801ED42D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801ED428; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801ED42D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801ED42C)) * 2) + D_801ED428); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801ED42D = (unsigned char) p[1]; - D_801ED42C = D_801ED42C + 1; - if (D_801ED42D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801ED42C = 0; - *base = 0; - } - } - else - { - D_801ED42D = c - 1; - } - } - return; -} - - - -extern s32 D_801ED44C; -extern s32 D_801ED440; -extern s32 D_801ED444; -extern s32 D_801ED450; - -void func_8013CABC(void) { - D_801ED44C = 1; - D_801ED440 = 1; - D_801ED444 = 0; - D_801ED450 = 1; -} - - - -extern s32 D_801ED440; -extern s32 D_801ED444; -extern s32 D_801ED448; -extern s32 D_801ED44C; -extern s32 D_801ED450; - -void func_8013CAE8(void) { - D_801ED440 = 1; - D_801ED44C = 0; - D_801ED444 = 0; - D_801ED448 = -1; - D_801ED450 = 0; -} - - - -extern s32 D_801ED44C; -extern s32 D_801ED450; -extern s32 D_801ED478; -extern s32 D_801ED47C; - -void func_8013CB20(void) -{ - D_801ED478 = D_801ED450; - D_801ED47C = D_801ED44C; - D_801ED450 = 1; - D_801ED44C = 0; -} - - - -extern s32 D_801ED478; -extern s32 D_801ED47C; -extern s32 D_801ED450; -extern s32 D_801ED44C; - -void func_8013CB5C(void) { - D_801ED450 = D_801ED478; - D_801ED44C = D_801ED47C; -} - - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EF2E8; - extern u8 D_801EF2E9; - extern u8 D_801EF2EA; - extern u8 D_801EF2EB; - extern u8 D_801EF2EC; - extern u8 D_801EF2ED; - extern u8 D_801EF2EE; - extern u8 D_801EF2EF; - extern u8 D_801EF2F0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EF2E8; t1 = D_801EF2E9; t2 = D_801EF2EA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EF2EB; t1 = D_801EF2EC; t2 = D_801EF2ED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EF2EE; t1 = D_801EF2EF; t2 = D_801EF2F0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801ED458; -extern s32 D_801ED440; -extern s32 D_801ED45C; -extern s32 D_801ED44C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801ED458 != 0) { - if (D_801ED458 != 2) { - if (((D_801ED458 < 3) && (D_801ED458 == 1)) && - (D_801ED45C = D_801ED45C + 1, 0x23a < D_801ED45C)) { - D_801ED440 = D_801ED458; - D_801ED458 = 2; - } - } else { - D_801ED440 = D_801ED440 + -1; - if (D_801ED440 == 0) { - D_801ED440 = D_801ED458; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801ED44C == 0) { - D_801ED458 = D_801ED458 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801ED44C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801ED44C; -} - - - -extern s32 D_801ED458; - -void func_8013D164(void) { - D_801ED458 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EF3F2; -extern u8 D_801EF466; -extern u8 D_801EF2F2; -extern u8 D_801EF3BC; -extern u8 D_801EF2C8; -extern u8 D_801EF2F1; -extern s32 D_801EF3C0; - -void func_8013D330(void) { - if ((D_801EF3F2 & 0xff) != D_801EF466) { - D_801EF3F2 = ((D_801EF3F2 & 0xff) < D_801EF466) ? (D_801EF3F2 + 1) : (D_801EF3F2 - 1); - } - if ((D_801EF2F2 & 0xff) != D_801EF3BC) { - D_801EF2F2 = ((D_801EF2F2 & 0xff) < D_801EF3BC) ? (D_801EF2F2 + 1) : (D_801EF2F2 - 1); - } - if ((D_801EF2C8 & 0xff) != D_801EF2F1) { - D_801EF2C8 = ((D_801EF2C8 & 0xff) < D_801EF2F1) ? (D_801EF2C8 + 1) : (D_801EF2C8 - 1); - } - D_801EF3C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801ED430; -extern void *D_801ED434; -extern void *D_801ED438; -extern s32 D_801ED460; -extern s32 D_801ED464; -extern s32 D_801ED468; -extern s32 D_801EF334[]; - -extern u8 D_8018DD4C[]; -extern u8 D_8018DDF4[]; -extern u8 D_8018DCA4[]; -extern u8 D_8018DDA0[]; -extern u8 D_8018DE20[]; -extern u8 D_8018DCF8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801ED460 = param_2; - D_801ED464 = (param_2 >> 2) & 3; - D_801ED468 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801ED430 = D_8018DD4C; - D_801ED434 = D_8018DDF4; - D_801ED438 = D_8018DCA4; - } else { - D_801ED430 = D_8018DDA0; - D_801ED434 = D_8018DE20; - D_801ED438 = D_8018DCF8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801ED468 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801ED460 & 2) != 0) { - D_801EF334[0] = 0x140; - D_801EF334[3] = 0x80; - if (p[0x37] == 4) { - D_801EF334[0] = 0x140; - D_801EF334[3] = 0; - } - if (p[0x37] == 0) { - D_801EF334[0] = 0x140; - D_801EF334[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801ED438)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801ED438; -extern s16 *D_801ED43C; -extern s32 D_801ED44C; -extern s32 D_801ED46C; -extern s32 D_801ED470; -extern s32 D_801ED474; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801ED43C != 0) { - D_801ED44C = 0; - p = (int *)(param_1 * 12 + (int)D_801ED438); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801ED46C != x) { - flag = 1; - if (D_801ED46C < x) { - if (x - D_801ED46C < 5) { - D_801ED46C = x; - } else { - D_801ED46C = D_801ED46C + 4; - } - } else { - if (D_801ED46C - x < 5) { - D_801ED46C = x; - } else { - D_801ED46C = D_801ED46C - 4; - } - } - } - if (D_801ED470 != y) { - flag = 1; - if (D_801ED470 < y) { - if (y - D_801ED470 < 5) { - D_801ED470 = y; - } else { - D_801ED470 = D_801ED470 + 4; - } - } else { - if (D_801ED470 - y < 5) { - D_801ED470 = y; - } else { - D_801ED470 = D_801ED470 - 4; - } - } - } - if (D_801ED474 != z) { - flag = 1; - if (D_801ED474 < z) { - if (z - D_801ED474 < 5) { - D_801ED474 = z; - } else { - D_801ED474 = D_801ED474 + 4; - } - } else { - if (D_801ED474 - z < 5) { - D_801ED474 = z; - } else { - D_801ED474 = D_801ED474 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801ED44C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018DEB0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801ED43C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801ED46C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801ED470); - uVar5 = (*(int*)&D_801ED474); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018DEB0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801ED454; - -s32 func_8013E054(void) { - return D_801ED454; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018E8AC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018E884; -extern s16 D_8018E886; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018E8AC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018E884 = 2; - D_8018E886 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018E886 = 0; - D_8018E884 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801ED488; - extern void * D_801ED48C; - extern unsigned char D_8018E524; - extern unsigned char D_8018E53C; - extern unsigned char D_8018E5B0; - extern unsigned char D_8018E5B8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801ED488 = &D_8018E524; - D_801ED48C = &D_8018E5B0; - } else { - D_801ED488 = &D_8018E53C; - D_801ED48C = &D_8018E5B8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018E8AC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E8AC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018E8AC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018E888; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E888)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E888)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018E884; -extern s16 D_8018E886; -extern unsigned char D_8018E888; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E886` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018E884` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018E886; - if (*r < 3) { - *r = *r + 1; - } - D_8018E884 = (u16)D_8018E884 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E888); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018E888; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E888); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c b/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c new file mode 100644 index 000000000..9518fe512 --- /dev/null +++ b/src/ov_SC03_001/ov_SC03_001_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801EBC68; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018D7A4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801ED344; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EF3F8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801EBC68; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018D4D8)(); +extern s16 (*D_8018D4DC)(); +extern M2C_UNK (*D_8018D4E4)(); +extern s32 (*D_8018D4E8)(); +extern s32 D_801ED340; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801EBC6C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018D838; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80190D1C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018D850; +extern M2C_UNK D_8018D858; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018D860; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018D87C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018D888[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018D89C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D8EC[]; +extern s16 D_8018D91C[]; +extern s16 D_8018D97C[]; +extern s16 D_8018D984[]; +extern s16 D_8018D9A4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018D9DC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018DA34[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018DA7C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018DA84[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018DA8C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018DA94[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018DA3C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018DA5C; +extern void func_801321B0(int param_1); +extern int D_8018DA6C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801ED3B0; +extern s32 D_801ED3B4[]; +extern int D_801ED3B8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018DAA0; +extern u8 D_8018DA9C; +extern s16 *D_8018DAA4; +extern u8 D_8018DAA8; +extern int D_801ED3B0; +extern u16 D_801ED3C0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018DAA4; /* holds a pointer value (*(u16**)&D_8018DAA4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018DAB8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018DB0C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018DB10[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018DB10[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018DB54; +extern u8 D_8018DB98; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018DB54; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018DB98 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018DBDC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018DC18[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018DC18; + if (((s16)a1) < 0xC00) { + tbl = D_8018DBDC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018DC54, D_8018DC56, D_8018DC58, D_8018DC5A, D_8018DC5C, D_8018DC5E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018DC56 < ang)) goto outer_else; + if (!(ang < D_8018DC5C)) goto inner_else; + if (ang < D_8018DC58) { *(s16 *)L = D_8018DC58; goto done; } + if (D_8018DC5A < ang) { *(s16 *)L = D_8018DC5A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018DC54) { *(s16 *)L = D_8018DC54; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018DC5E < ang) { *(s16 *)L = D_8018DC5E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801ED428; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801ED428, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801ED428; +extern s8 D_801ED42C; +extern s8 D_801ED42D; + +void func_8013C9C4(void * arg0) +{ + D_801ED428 = arg0; + D_801ED42C = 0; + D_801ED42D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801ED428; +extern s8 D_801ED42C; +extern s8 D_801ED42D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801ED428; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801ED42D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801ED42C)) * 2) + D_801ED428); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801ED42D = (unsigned char) p[1]; + D_801ED42C = D_801ED42C + 1; + if (D_801ED42D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801ED42C = 0; + *base = 0; + } + } + else + { + D_801ED42D = c - 1; + } + } + return; +} + + + +extern s32 D_801ED44C; +extern s32 D_801ED440; +extern s32 D_801ED444; +extern s32 D_801ED450; + +void func_8013CABC(void) { + D_801ED44C = 1; + D_801ED440 = 1; + D_801ED444 = 0; + D_801ED450 = 1; +} + + + +extern s32 D_801ED440; +extern s32 D_801ED444; +extern s32 D_801ED448; +extern s32 D_801ED44C; +extern s32 D_801ED450; + +void func_8013CAE8(void) { + D_801ED440 = 1; + D_801ED44C = 0; + D_801ED444 = 0; + D_801ED448 = -1; + D_801ED450 = 0; +} + + + +extern s32 D_801ED44C; +extern s32 D_801ED450; +extern s32 D_801ED478; +extern s32 D_801ED47C; + +void func_8013CB20(void) +{ + D_801ED478 = D_801ED450; + D_801ED47C = D_801ED44C; + D_801ED450 = 1; + D_801ED44C = 0; +} + + + +extern s32 D_801ED478; +extern s32 D_801ED47C; +extern s32 D_801ED450; +extern s32 D_801ED44C; + +void func_8013CB5C(void) { + D_801ED450 = D_801ED478; + D_801ED44C = D_801ED47C; +} + + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EF2E8; + extern u8 D_801EF2E9; + extern u8 D_801EF2EA; + extern u8 D_801EF2EB; + extern u8 D_801EF2EC; + extern u8 D_801EF2ED; + extern u8 D_801EF2EE; + extern u8 D_801EF2EF; + extern u8 D_801EF2F0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EF2E8; t1 = D_801EF2E9; t2 = D_801EF2EA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EF2EB; t1 = D_801EF2EC; t2 = D_801EF2ED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EF2EE; t1 = D_801EF2EF; t2 = D_801EF2F0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801ED458; +extern s32 D_801ED440; +extern s32 D_801ED45C; +extern s32 D_801ED44C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801ED458 != 0) { + if (D_801ED458 != 2) { + if (((D_801ED458 < 3) && (D_801ED458 == 1)) && + (D_801ED45C = D_801ED45C + 1, 0x23a < D_801ED45C)) { + D_801ED440 = D_801ED458; + D_801ED458 = 2; + } + } else { + D_801ED440 = D_801ED440 + -1; + if (D_801ED440 == 0) { + D_801ED440 = D_801ED458; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801ED44C == 0) { + D_801ED458 = D_801ED458 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801ED44C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801ED44C; +} + + + +extern s32 D_801ED458; + +void func_8013D164(void) { + D_801ED458 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EF3F2; +extern u8 D_801EF466; +extern u8 D_801EF2F2; +extern u8 D_801EF3BC; +extern u8 D_801EF2C8; +extern u8 D_801EF2F1; +extern s32 D_801EF3C0; + +void func_8013D330(void) { + if ((D_801EF3F2 & 0xff) != D_801EF466) { + D_801EF3F2 = ((D_801EF3F2 & 0xff) < D_801EF466) ? (D_801EF3F2 + 1) : (D_801EF3F2 - 1); + } + if ((D_801EF2F2 & 0xff) != D_801EF3BC) { + D_801EF2F2 = ((D_801EF2F2 & 0xff) < D_801EF3BC) ? (D_801EF2F2 + 1) : (D_801EF2F2 - 1); + } + if ((D_801EF2C8 & 0xff) != D_801EF2F1) { + D_801EF2C8 = ((D_801EF2C8 & 0xff) < D_801EF2F1) ? (D_801EF2C8 + 1) : (D_801EF2C8 - 1); + } + D_801EF3C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801ED430; +extern void *D_801ED434; +extern void *D_801ED438; +extern s32 D_801ED460; +extern s32 D_801ED464; +extern s32 D_801ED468; +extern s32 D_801EF334[]; + +extern u8 D_8018DD4C[]; +extern u8 D_8018DDF4[]; +extern u8 D_8018DCA4[]; +extern u8 D_8018DDA0[]; +extern u8 D_8018DE20[]; +extern u8 D_8018DCF8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801ED460 = param_2; + D_801ED464 = (param_2 >> 2) & 3; + D_801ED468 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801ED430 = D_8018DD4C; + D_801ED434 = D_8018DDF4; + D_801ED438 = D_8018DCA4; + } else { + D_801ED430 = D_8018DDA0; + D_801ED434 = D_8018DE20; + D_801ED438 = D_8018DCF8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801ED468 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801ED460 & 2) != 0) { + D_801EF334[0] = 0x140; + D_801EF334[3] = 0x80; + if (p[0x37] == 4) { + D_801EF334[0] = 0x140; + D_801EF334[3] = 0; + } + if (p[0x37] == 0) { + D_801EF334[0] = 0x140; + D_801EF334[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801ED438)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801ED438; +extern s16 *D_801ED43C; +extern s32 D_801ED44C; +extern s32 D_801ED46C; +extern s32 D_801ED470; +extern s32 D_801ED474; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801ED43C != 0) { + D_801ED44C = 0; + p = (int *)(param_1 * 12 + (int)D_801ED438); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801ED46C != x) { + flag = 1; + if (D_801ED46C < x) { + if (x - D_801ED46C < 5) { + D_801ED46C = x; + } else { + D_801ED46C = D_801ED46C + 4; + } + } else { + if (D_801ED46C - x < 5) { + D_801ED46C = x; + } else { + D_801ED46C = D_801ED46C - 4; + } + } + } + if (D_801ED470 != y) { + flag = 1; + if (D_801ED470 < y) { + if (y - D_801ED470 < 5) { + D_801ED470 = y; + } else { + D_801ED470 = D_801ED470 + 4; + } + } else { + if (D_801ED470 - y < 5) { + D_801ED470 = y; + } else { + D_801ED470 = D_801ED470 - 4; + } + } + } + if (D_801ED474 != z) { + flag = 1; + if (D_801ED474 < z) { + if (z - D_801ED474 < 5) { + D_801ED474 = z; + } else { + D_801ED474 = D_801ED474 + 4; + } + } else { + if (D_801ED474 - z < 5) { + D_801ED474 = z; + } else { + D_801ED474 = D_801ED474 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801ED44C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018DEB0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801ED43C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801ED46C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801ED470); + uVar5 = (*(int*)&D_801ED474); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018DEB0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801ED454; + +s32 func_8013E054(void) { + return D_801ED454; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018E8AC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018E884; +extern s16 D_8018E886; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018E8AC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018E884 = 2; + D_8018E886 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018E886 = 0; + D_8018E884 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801ED488; + extern void * D_801ED48C; + extern unsigned char D_8018E524; + extern unsigned char D_8018E53C; + extern unsigned char D_8018E5B0; + extern unsigned char D_8018E5B8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801ED488 = &D_8018E524; + D_801ED48C = &D_8018E5B0; + } else { + D_801ED488 = &D_8018E53C; + D_801ED48C = &D_8018E5B8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018E8AC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E8AC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018E8AC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018E888; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E888)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E888)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018E884; +extern s16 D_8018E886; +extern unsigned char D_8018E888; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E886` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018E884` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018E886; + if (*r < 3) { + *r = *r + 1; + } + D_8018E884 = (u16)D_8018E884 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E888); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018E888; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E888); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_002/ov_SC03_002_jr_8012ACE0.c b/src/ov_SC03_002/ov_SC03_002_jr_8012ACE0.c index c42b601fc..434356d8a 100644 --- a/src/ov_SC03_002/ov_SC03_002_jr_8012ACE0.c +++ b/src/ov_SC03_002/ov_SC03_002_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185B00[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185B00[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80185B44; -extern u8 D_80185B88; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80185B44; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80185B88 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80185BCC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80185C08[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80185C08; - if (((s16)a1) < 0xC00) { - tbl = D_80185BCC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185C44, D_80185C46, D_80185C48, D_80185C4A, D_80185C4C, D_80185C4E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185C46 < ang)) goto outer_else; - if (!(ang < D_80185C4C)) goto inner_else; - if (ang < D_80185C48) { *(s16 *)L = D_80185C48; goto done; } - if (D_80185C4A < ang) { *(s16 *)L = D_80185C4A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185C44) { *(s16 *)L = D_80185C44; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80185C4E < ang) { *(s16 *)L = D_80185C4E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CA4A8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CA4A8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CA4A8; -extern s8 D_801CA4AC; -extern s8 D_801CA4AD; - -void func_8013C9C4(void * arg0) -{ - D_801CA4A8 = arg0; - D_801CA4AC = 0; - D_801CA4AD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CA4A8; -extern s8 D_801CA4AC; -extern s8 D_801CA4AD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CA4A8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CA4AD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CA4AC)) * 2) + D_801CA4A8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CA4AD = (unsigned char) p[1]; - D_801CA4AC = D_801CA4AC + 1; - if (D_801CA4AD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CA4AC = 0; - *base = 0; - } - } - else - { - D_801CA4AD = c - 1; - } - } - return; -} - - - -extern s32 D_801CA4CC; -extern s32 D_801CA4C0; -extern s32 D_801CA4C4; -extern s32 D_801CA4D0; - -void func_8013CABC(void) { - D_801CA4CC = 1; - D_801CA4C0 = 1; - D_801CA4C4 = 0; - D_801CA4D0 = 1; -} - - - -extern s32 D_801CA4C0; -extern s32 D_801CA4C4; -extern s32 D_801CA4C8; -extern s32 D_801CA4CC; -extern s32 D_801CA4D0; - -void func_8013CAE8(void) { - D_801CA4C0 = 1; - D_801CA4CC = 0; - D_801CA4C4 = 0; - D_801CA4C8 = -1; - D_801CA4D0 = 0; -} - - - -extern s32 D_801CA4CC; -extern s32 D_801CA4D0; -extern s32 D_801CA4F8; -extern s32 D_801CA4FC; - -void func_8013CB20(void) -{ - D_801CA4F8 = D_801CA4D0; - D_801CA4FC = D_801CA4CC; - D_801CA4D0 = 1; - D_801CA4CC = 0; -} - - - -extern s32 D_801CA4F8; -extern s32 D_801CA4FC; -extern s32 D_801CA4D0; -extern s32 D_801CA4CC; - -void func_8013CB5C(void) { - D_801CA4D0 = D_801CA4F8; - D_801CA4CC = D_801CA4FC; -} - - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801CB9D0; - extern u8 D_801CB9D1; - extern u8 D_801CB9D2; - extern u8 D_801CB9D3; - extern u8 D_801CB9D4; - extern u8 D_801CB9D5; - extern u8 D_801CB9D6; - extern u8 D_801CB9D7; - extern u8 D_801CB9D8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801CB9D0; t1 = D_801CB9D1; t2 = D_801CB9D2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801CB9D3; t1 = D_801CB9D4; t2 = D_801CB9D5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801CB9D6; t1 = D_801CB9D7; t2 = D_801CB9D8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CA4D8; -extern s32 D_801CA4C0; -extern s32 D_801CA4DC; -extern s32 D_801CA4CC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CA4D8 != 0) { - if (D_801CA4D8 != 2) { - if (((D_801CA4D8 < 3) && (D_801CA4D8 == 1)) && - (D_801CA4DC = D_801CA4DC + 1, 0x23a < D_801CA4DC)) { - D_801CA4C0 = D_801CA4D8; - D_801CA4D8 = 2; - } - } else { - D_801CA4C0 = D_801CA4C0 + -1; - if (D_801CA4C0 == 0) { - D_801CA4C0 = D_801CA4D8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CA4CC == 0) { - D_801CA4D8 = D_801CA4D8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CA4CC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CA4CC; -} - - - -extern s32 D_801CA4D8; - -void func_8013D164(void) { - D_801CA4D8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801CBADA; -extern u8 D_801CBB4E; -extern u8 D_801CB9DA; -extern u8 D_801CBAA4; -extern u8 D_801CB9B0; -extern u8 D_801CB9D9; -extern s32 D_801CBAA8; - -void func_8013D330(void) { - if ((D_801CBADA & 0xff) != D_801CBB4E) { - D_801CBADA = ((D_801CBADA & 0xff) < D_801CBB4E) ? (D_801CBADA + 1) : (D_801CBADA - 1); - } - if ((D_801CB9DA & 0xff) != D_801CBAA4) { - D_801CB9DA = ((D_801CB9DA & 0xff) < D_801CBAA4) ? (D_801CB9DA + 1) : (D_801CB9DA - 1); - } - if ((D_801CB9B0 & 0xff) != D_801CB9D9) { - D_801CB9B0 = ((D_801CB9B0 & 0xff) < D_801CB9D9) ? (D_801CB9B0 + 1) : (D_801CB9B0 - 1); - } - D_801CBAA8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CA4B0; -extern void *D_801CA4B4; -extern void *D_801CA4B8; -extern s32 D_801CA4E0; -extern s32 D_801CA4E4; -extern s32 D_801CA4E8; -extern s32 D_801CBA1C[]; - -extern u8 D_80185D3C[]; -extern u8 D_80185DE4[]; -extern u8 D_80185C94[]; -extern u8 D_80185D90[]; -extern u8 D_80185E10[]; -extern u8 D_80185CE8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CA4E0 = param_2; - D_801CA4E4 = (param_2 >> 2) & 3; - D_801CA4E8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CA4B0 = D_80185D3C; - D_801CA4B4 = D_80185DE4; - D_801CA4B8 = D_80185C94; - } else { - D_801CA4B0 = D_80185D90; - D_801CA4B4 = D_80185E10; - D_801CA4B8 = D_80185CE8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CA4E8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CA4E0 & 2) != 0) { - D_801CBA1C[0] = 0x140; - D_801CBA1C[3] = 0x80; - if (p[0x37] == 4) { - D_801CBA1C[0] = 0x140; - D_801CBA1C[3] = 0; - } - if (p[0x37] == 0) { - D_801CBA1C[0] = 0x140; - D_801CBA1C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CA4B8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CA4B8; -extern s16 *D_801CA4BC; -extern s32 D_801CA4CC; -extern s32 D_801CA4EC; -extern s32 D_801CA4F0; -extern s32 D_801CA4F4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CA4BC != 0) { - D_801CA4CC = 0; - p = (int *)(param_1 * 12 + (int)D_801CA4B8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CA4EC != x) { - flag = 1; - if (D_801CA4EC < x) { - if (x - D_801CA4EC < 5) { - D_801CA4EC = x; - } else { - D_801CA4EC = D_801CA4EC + 4; - } - } else { - if (D_801CA4EC - x < 5) { - D_801CA4EC = x; - } else { - D_801CA4EC = D_801CA4EC - 4; - } - } - } - if (D_801CA4F0 != y) { - flag = 1; - if (D_801CA4F0 < y) { - if (y - D_801CA4F0 < 5) { - D_801CA4F0 = y; - } else { - D_801CA4F0 = D_801CA4F0 + 4; - } - } else { - if (D_801CA4F0 - y < 5) { - D_801CA4F0 = y; - } else { - D_801CA4F0 = D_801CA4F0 - 4; - } - } - } - if (D_801CA4F4 != z) { - flag = 1; - if (D_801CA4F4 < z) { - if (z - D_801CA4F4 < 5) { - D_801CA4F4 = z; - } else { - D_801CA4F4 = D_801CA4F4 + 4; - } - } else { - if (D_801CA4F4 - z < 5) { - D_801CA4F4 = z; - } else { - D_801CA4F4 = D_801CA4F4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CA4CC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185EA0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CA4BC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CA4EC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CA4F0); - uVar5 = (*(int*)&D_801CA4F4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185EA0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CA4D4; - -s32 func_8013E054(void) { - return D_801CA4D4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018689C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186874; -extern s16 D_80186876; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018689C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186874 = 2; - D_80186876 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186876 = 0; - D_80186874 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CA508; - extern void * D_801CA50C; - extern unsigned char D_80186514; - extern unsigned char D_8018652C; - extern unsigned char D_801865A0; - extern unsigned char D_801865A8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CA508 = &D_80186514; - D_801CA50C = &D_801865A0; - } else { - D_801CA508 = &D_8018652C; - D_801CA50C = &D_801865A8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018689C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018689C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018689C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186878; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186878)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186878)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186874; -extern s16 D_80186876; -extern unsigned char D_80186878; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186876` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186874` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186876; - if (*r < 3) { - *r = *r + 1; - } - D_80186874 = (u16)D_80186874 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186878); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186878; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186878); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c b/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c new file mode 100644 index 000000000..db5345580 --- /dev/null +++ b/src/ov_SC03_002/ov_SC03_002_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C91C4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80185794[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CA3C4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801CBAE0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C91C4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801854D0)(); +extern s16 (*D_801854D4)(); +extern M2C_UNK (*D_801854DC)(); +extern s32 (*D_801854E0)(); +extern s32 D_801CA3C0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C91C8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80185828; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80188D0C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185840; +extern M2C_UNK D_80185848; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185850; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018586C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185878[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018588C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801858DC[]; +extern s16 D_8018590C[]; +extern s16 D_8018596C[]; +extern s16 D_80185974[]; +extern s16 D_80185994[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801859CC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185A24[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185A6C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185A74[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185A7C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185A84[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80185A2C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80185A4C; +extern void func_801321B0(int param_1); +extern int D_80185A5C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CA430; +extern s32 D_801CA434[]; +extern int D_801CA438; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185A90; +extern u8 D_80185A8C; +extern s16 *D_80185A94; +extern u8 D_80185A98; +extern int D_801CA430; +extern u16 D_801CA440; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185A94; /* holds a pointer value (*(u16**)&D_80185A94) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185AA8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185AFC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185B00[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185B00[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80185B44; +extern u8 D_80185B88; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80185B44; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80185B88 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80185BCC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80185C08[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80185C08; + if (((s16)a1) < 0xC00) { + tbl = D_80185BCC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185C44, D_80185C46, D_80185C48, D_80185C4A, D_80185C4C, D_80185C4E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185C46 < ang)) goto outer_else; + if (!(ang < D_80185C4C)) goto inner_else; + if (ang < D_80185C48) { *(s16 *)L = D_80185C48; goto done; } + if (D_80185C4A < ang) { *(s16 *)L = D_80185C4A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185C44) { *(s16 *)L = D_80185C44; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185C4E < ang) { *(s16 *)L = D_80185C4E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CA4A8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CA4A8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CA4A8; +extern s8 D_801CA4AC; +extern s8 D_801CA4AD; + +void func_8013C9C4(void * arg0) +{ + D_801CA4A8 = arg0; + D_801CA4AC = 0; + D_801CA4AD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CA4A8; +extern s8 D_801CA4AC; +extern s8 D_801CA4AD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CA4A8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CA4AD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CA4AC)) * 2) + D_801CA4A8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CA4AD = (unsigned char) p[1]; + D_801CA4AC = D_801CA4AC + 1; + if (D_801CA4AD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CA4AC = 0; + *base = 0; + } + } + else + { + D_801CA4AD = c - 1; + } + } + return; +} + + + +extern s32 D_801CA4CC; +extern s32 D_801CA4C0; +extern s32 D_801CA4C4; +extern s32 D_801CA4D0; + +void func_8013CABC(void) { + D_801CA4CC = 1; + D_801CA4C0 = 1; + D_801CA4C4 = 0; + D_801CA4D0 = 1; +} + + + +extern s32 D_801CA4C0; +extern s32 D_801CA4C4; +extern s32 D_801CA4C8; +extern s32 D_801CA4CC; +extern s32 D_801CA4D0; + +void func_8013CAE8(void) { + D_801CA4C0 = 1; + D_801CA4CC = 0; + D_801CA4C4 = 0; + D_801CA4C8 = -1; + D_801CA4D0 = 0; +} + + + +extern s32 D_801CA4CC; +extern s32 D_801CA4D0; +extern s32 D_801CA4F8; +extern s32 D_801CA4FC; + +void func_8013CB20(void) +{ + D_801CA4F8 = D_801CA4D0; + D_801CA4FC = D_801CA4CC; + D_801CA4D0 = 1; + D_801CA4CC = 0; +} + + + +extern s32 D_801CA4F8; +extern s32 D_801CA4FC; +extern s32 D_801CA4D0; +extern s32 D_801CA4CC; + +void func_8013CB5C(void) { + D_801CA4D0 = D_801CA4F8; + D_801CA4CC = D_801CA4FC; +} + + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801CB9D0; + extern u8 D_801CB9D1; + extern u8 D_801CB9D2; + extern u8 D_801CB9D3; + extern u8 D_801CB9D4; + extern u8 D_801CB9D5; + extern u8 D_801CB9D6; + extern u8 D_801CB9D7; + extern u8 D_801CB9D8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801CB9D0; t1 = D_801CB9D1; t2 = D_801CB9D2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801CB9D3; t1 = D_801CB9D4; t2 = D_801CB9D5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801CB9D6; t1 = D_801CB9D7; t2 = D_801CB9D8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CA4D8; +extern s32 D_801CA4C0; +extern s32 D_801CA4DC; +extern s32 D_801CA4CC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CA4D8 != 0) { + if (D_801CA4D8 != 2) { + if (((D_801CA4D8 < 3) && (D_801CA4D8 == 1)) && + (D_801CA4DC = D_801CA4DC + 1, 0x23a < D_801CA4DC)) { + D_801CA4C0 = D_801CA4D8; + D_801CA4D8 = 2; + } + } else { + D_801CA4C0 = D_801CA4C0 + -1; + if (D_801CA4C0 == 0) { + D_801CA4C0 = D_801CA4D8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CA4CC == 0) { + D_801CA4D8 = D_801CA4D8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CA4CC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CA4CC; +} + + + +extern s32 D_801CA4D8; + +void func_8013D164(void) { + D_801CA4D8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801CBADA; +extern u8 D_801CBB4E; +extern u8 D_801CB9DA; +extern u8 D_801CBAA4; +extern u8 D_801CB9B0; +extern u8 D_801CB9D9; +extern s32 D_801CBAA8; + +void func_8013D330(void) { + if ((D_801CBADA & 0xff) != D_801CBB4E) { + D_801CBADA = ((D_801CBADA & 0xff) < D_801CBB4E) ? (D_801CBADA + 1) : (D_801CBADA - 1); + } + if ((D_801CB9DA & 0xff) != D_801CBAA4) { + D_801CB9DA = ((D_801CB9DA & 0xff) < D_801CBAA4) ? (D_801CB9DA + 1) : (D_801CB9DA - 1); + } + if ((D_801CB9B0 & 0xff) != D_801CB9D9) { + D_801CB9B0 = ((D_801CB9B0 & 0xff) < D_801CB9D9) ? (D_801CB9B0 + 1) : (D_801CB9B0 - 1); + } + D_801CBAA8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CA4B0; +extern void *D_801CA4B4; +extern void *D_801CA4B8; +extern s32 D_801CA4E0; +extern s32 D_801CA4E4; +extern s32 D_801CA4E8; +extern s32 D_801CBA1C[]; + +extern u8 D_80185D3C[]; +extern u8 D_80185DE4[]; +extern u8 D_80185C94[]; +extern u8 D_80185D90[]; +extern u8 D_80185E10[]; +extern u8 D_80185CE8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CA4E0 = param_2; + D_801CA4E4 = (param_2 >> 2) & 3; + D_801CA4E8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CA4B0 = D_80185D3C; + D_801CA4B4 = D_80185DE4; + D_801CA4B8 = D_80185C94; + } else { + D_801CA4B0 = D_80185D90; + D_801CA4B4 = D_80185E10; + D_801CA4B8 = D_80185CE8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CA4E8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CA4E0 & 2) != 0) { + D_801CBA1C[0] = 0x140; + D_801CBA1C[3] = 0x80; + if (p[0x37] == 4) { + D_801CBA1C[0] = 0x140; + D_801CBA1C[3] = 0; + } + if (p[0x37] == 0) { + D_801CBA1C[0] = 0x140; + D_801CBA1C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CA4B8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CA4B8; +extern s16 *D_801CA4BC; +extern s32 D_801CA4CC; +extern s32 D_801CA4EC; +extern s32 D_801CA4F0; +extern s32 D_801CA4F4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CA4BC != 0) { + D_801CA4CC = 0; + p = (int *)(param_1 * 12 + (int)D_801CA4B8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CA4EC != x) { + flag = 1; + if (D_801CA4EC < x) { + if (x - D_801CA4EC < 5) { + D_801CA4EC = x; + } else { + D_801CA4EC = D_801CA4EC + 4; + } + } else { + if (D_801CA4EC - x < 5) { + D_801CA4EC = x; + } else { + D_801CA4EC = D_801CA4EC - 4; + } + } + } + if (D_801CA4F0 != y) { + flag = 1; + if (D_801CA4F0 < y) { + if (y - D_801CA4F0 < 5) { + D_801CA4F0 = y; + } else { + D_801CA4F0 = D_801CA4F0 + 4; + } + } else { + if (D_801CA4F0 - y < 5) { + D_801CA4F0 = y; + } else { + D_801CA4F0 = D_801CA4F0 - 4; + } + } + } + if (D_801CA4F4 != z) { + flag = 1; + if (D_801CA4F4 < z) { + if (z - D_801CA4F4 < 5) { + D_801CA4F4 = z; + } else { + D_801CA4F4 = D_801CA4F4 + 4; + } + } else { + if (D_801CA4F4 - z < 5) { + D_801CA4F4 = z; + } else { + D_801CA4F4 = D_801CA4F4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CA4CC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185EA0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CA4BC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CA4EC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CA4F0); + uVar5 = (*(int*)&D_801CA4F4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185EA0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CA4D4; + +s32 func_8013E054(void) { + return D_801CA4D4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018689C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186874; +extern s16 D_80186876; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018689C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186874 = 2; + D_80186876 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186876 = 0; + D_80186874 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CA508; + extern void * D_801CA50C; + extern unsigned char D_80186514; + extern unsigned char D_8018652C; + extern unsigned char D_801865A0; + extern unsigned char D_801865A8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CA508 = &D_80186514; + D_801CA50C = &D_801865A0; + } else { + D_801CA508 = &D_8018652C; + D_801CA50C = &D_801865A8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018689C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018689C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018689C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186878; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186878)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186878)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186874; +extern s16 D_80186876; +extern unsigned char D_80186878; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186876` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186874` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186876; + if (*r < 3) { + *r = *r + 1; + } + D_80186874 = (u16)D_80186874 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186878); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186878; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186878); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_003/ov_SC03_003_jr_8012ACE0.c b/src/ov_SC03_003/ov_SC03_003_jr_8012ACE0.c index 86f0e92a8..173b85c07 100644 --- a/src/ov_SC03_003/ov_SC03_003_jr_8012ACE0.c +++ b/src/ov_SC03_003/ov_SC03_003_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F8C8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F8C8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F90C; -extern u8 D_8017F950; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F90C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F950 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F994[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F9D0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F9D0; - if (((s16)a1) < 0xC00) { - tbl = D_8017F994; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017FA0C, D_8017FA0E, D_8017FA10, D_8017FA12, D_8017FA14, D_8017FA16; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017FA0E < ang)) goto outer_else; - if (!(ang < D_8017FA14)) goto inner_else; - if (ang < D_8017FA10) { *(s16 *)L = D_8017FA10; goto done; } - if (D_8017FA12 < ang) { *(s16 *)L = D_8017FA12; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017FA0C) { *(s16 *)L = D_8017FA0C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017FA16 < ang) { *(s16 *)L = D_8017FA16; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018E7B0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018E7B0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018E7B0; -extern s8 D_8018E7B4; -extern s8 D_8018E7B5; - -void func_8013C9C4(void * arg0) -{ - D_8018E7B0 = arg0; - D_8018E7B4 = 0; - D_8018E7B5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018E7B0; -extern s8 D_8018E7B4; -extern s8 D_8018E7B5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018E7B0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018E7B5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E7B4)) * 2) + D_8018E7B0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018E7B5 = (unsigned char) p[1]; - D_8018E7B4 = D_8018E7B4 + 1; - if (D_8018E7B5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018E7B4 = 0; - *base = 0; - } - } - else - { - D_8018E7B5 = c - 1; - } - } - return; -} - - - -extern s32 D_8018E7D4; -extern s32 D_8018E7C8; -extern s32 D_8018E7CC; -extern s32 D_8018E7D8; - -void func_8013CABC(void) { - D_8018E7D4 = 1; - D_8018E7C8 = 1; - D_8018E7CC = 0; - D_8018E7D8 = 1; -} - - - -extern s32 D_8018E7C8; -extern s32 D_8018E7CC; -extern s32 D_8018E7D0; -extern s32 D_8018E7D4; -extern s32 D_8018E7D8; - -void func_8013CAE8(void) { - D_8018E7C8 = 1; - D_8018E7D4 = 0; - D_8018E7CC = 0; - D_8018E7D0 = -1; - D_8018E7D8 = 0; -} - - - -extern s32 D_8018E7D4; -extern s32 D_8018E7D8; -extern s32 D_8018E800; -extern s32 D_8018E804; - -void func_8013CB20(void) -{ - D_8018E800 = D_8018E7D8; - D_8018E804 = D_8018E7D4; - D_8018E7D8 = 1; - D_8018E7D4 = 0; -} - - - -extern s32 D_8018E800; -extern s32 D_8018E804; -extern s32 D_8018E7D8; -extern s32 D_8018E7D4; - -void func_8013CB5C(void) { - D_8018E7D8 = D_8018E800; - D_8018E7D4 = D_8018E804; -} - - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8018FA20; - extern u8 D_8018FA21; - extern u8 D_8018FA22; - extern u8 D_8018FA23; - extern u8 D_8018FA24; - extern u8 D_8018FA25; - extern u8 D_8018FA26; - extern u8 D_8018FA27; - extern u8 D_8018FA28; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8018FA20; t1 = D_8018FA21; t2 = D_8018FA22; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8018FA23; t1 = D_8018FA24; t2 = D_8018FA25; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8018FA26; t1 = D_8018FA27; t2 = D_8018FA28; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018E7E0; -extern s32 D_8018E7C8; -extern s32 D_8018E7E4; -extern s32 D_8018E7D4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018E7E0 != 0) { - if (D_8018E7E0 != 2) { - if (((D_8018E7E0 < 3) && (D_8018E7E0 == 1)) && - (D_8018E7E4 = D_8018E7E4 + 1, 0x23a < D_8018E7E4)) { - D_8018E7C8 = D_8018E7E0; - D_8018E7E0 = 2; - } - } else { - D_8018E7C8 = D_8018E7C8 + -1; - if (D_8018E7C8 == 0) { - D_8018E7C8 = D_8018E7E0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018E7D4 == 0) { - D_8018E7E0 = D_8018E7E0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018E7D4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018E7D4; -} - - - -extern s32 D_8018E7E0; - -void func_8013D164(void) { - D_8018E7E0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8018FB02; -extern u8 D_8018FB7C; -extern u8 D_8018FA2A; -extern u8 D_8018FAE4; -extern u8 D_8018FA08; -extern u8 D_8018FA29; -extern s32 D_8018FAE8; - -void func_8013D330(void) { - if ((D_8018FB02 & 0xff) != D_8018FB7C) { - D_8018FB02 = ((D_8018FB02 & 0xff) < D_8018FB7C) ? (D_8018FB02 + 1) : (D_8018FB02 - 1); - } - if ((D_8018FA2A & 0xff) != D_8018FAE4) { - D_8018FA2A = ((D_8018FA2A & 0xff) < D_8018FAE4) ? (D_8018FA2A + 1) : (D_8018FA2A - 1); - } - if ((D_8018FA08 & 0xff) != D_8018FA29) { - D_8018FA08 = ((D_8018FA08 & 0xff) < D_8018FA29) ? (D_8018FA08 + 1) : (D_8018FA08 - 1); - } - D_8018FAE8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018E7B8; -extern void *D_8018E7BC; -extern void *D_8018E7C0; -extern s32 D_8018E7E8; -extern s32 D_8018E7EC; -extern s32 D_8018E7F0; -extern s32 D_8018FA5C[]; - -extern u8 D_8017FB04[]; -extern u8 D_8017FBAC[]; -extern u8 D_8017FA5C[]; -extern u8 D_8017FB58[]; -extern u8 D_8017FBD8[]; -extern u8 D_8017FAB0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018E7E8 = param_2; - D_8018E7EC = (param_2 >> 2) & 3; - D_8018E7F0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018E7B8 = D_8017FB04; - D_8018E7BC = D_8017FBAC; - D_8018E7C0 = D_8017FA5C; - } else { - D_8018E7B8 = D_8017FB58; - D_8018E7BC = D_8017FBD8; - D_8018E7C0 = D_8017FAB0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018E7F0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018E7E8 & 2) != 0) { - D_8018FA5C[0] = 0x140; - D_8018FA5C[3] = 0x80; - if (p[0x37] == 4) { - D_8018FA5C[0] = 0x140; - D_8018FA5C[3] = 0; - } - if (p[0x37] == 0) { - D_8018FA5C[0] = 0x140; - D_8018FA5C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018E7C0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018E7C0; -extern s16 *D_8018E7C4; -extern s32 D_8018E7D4; -extern s32 D_8018E7F4; -extern s32 D_8018E7F8; -extern s32 D_8018E7FC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018E7C4 != 0) { - D_8018E7D4 = 0; - p = (int *)(param_1 * 12 + (int)D_8018E7C0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018E7F4 != x) { - flag = 1; - if (D_8018E7F4 < x) { - if (x - D_8018E7F4 < 5) { - D_8018E7F4 = x; - } else { - D_8018E7F4 = D_8018E7F4 + 4; - } - } else { - if (D_8018E7F4 - x < 5) { - D_8018E7F4 = x; - } else { - D_8018E7F4 = D_8018E7F4 - 4; - } - } - } - if (D_8018E7F8 != y) { - flag = 1; - if (D_8018E7F8 < y) { - if (y - D_8018E7F8 < 5) { - D_8018E7F8 = y; - } else { - D_8018E7F8 = D_8018E7F8 + 4; - } - } else { - if (D_8018E7F8 - y < 5) { - D_8018E7F8 = y; - } else { - D_8018E7F8 = D_8018E7F8 - 4; - } - } - } - if (D_8018E7FC != z) { - flag = 1; - if (D_8018E7FC < z) { - if (z - D_8018E7FC < 5) { - D_8018E7FC = z; - } else { - D_8018E7FC = D_8018E7FC + 4; - } - } else { - if (D_8018E7FC - z < 5) { - D_8018E7FC = z; - } else { - D_8018E7FC = D_8018E7FC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018E7D4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FC68[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018E7C4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7F4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7F8); - uVar5 = (*(int*)&D_8018E7FC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FC68); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018E7DC; - -s32 func_8013E054(void) { - return D_8018E7DC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180664; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018063C; -extern s16 D_8018063E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180664; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018063C = 2; - D_8018063E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018063E = 0; - D_8018063C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018E810; - extern void * D_8018E814; - extern unsigned char D_801802DC; - extern unsigned char D_801802F4; - extern unsigned char D_80180368; - extern unsigned char D_80180370; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018E810 = &D_801802DC; - D_8018E814 = &D_80180368; - } else { - D_8018E810 = &D_801802F4; - D_8018E814 = &D_80180370; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180664/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180664 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180664)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180640; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180640)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180640)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018063C; -extern s16 D_8018063E; -extern unsigned char D_80180640; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018063E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018063C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018063E; - if (*r < 3) { - *r = *r + 1; - } - D_8018063C = (u16)D_8018063C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180640); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180640; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180640); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_003/ov_SC03_003_jr_801380E0.c b/src/ov_SC03_003/ov_SC03_003_jr_801380E0.c new file mode 100644 index 000000000..bc2d7d66d --- /dev/null +++ b/src/ov_SC03_003/ov_SC03_003_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D544; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F55C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018E6CC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8018FB08; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D544; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F298)(); +extern s16 (*D_8017F29C)(); +extern M2C_UNK (*D_8017F2A4)(); +extern s32 (*D_8017F2A8)(); +extern s32 D_8018E6C8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D548; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F5F0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182AD4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F608; +extern M2C_UNK D_8017F610; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F618; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F634[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F640[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F654[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F6A4[]; +extern s16 D_8017F6D4[]; +extern s16 D_8017F734[]; +extern s16 D_8017F73C[]; +extern s16 D_8017F75C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F794[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F7EC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F834[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F83C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F844[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F84C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F7F4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F814; +extern void func_801321B0(int param_1); +extern int D_8017F824; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018E738; +extern s32 D_8018E73C[]; +extern int D_8018E740; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F858; +extern u8 D_8017F854; +extern s16 *D_8017F85C; +extern u8 D_8017F860; +extern int D_8018E738; +extern u16 D_8018E748; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F85C; /* holds a pointer value (*(u16**)&D_8017F85C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F870[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F8C4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F8C8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F8C8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F90C; +extern u8 D_8017F950; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F90C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F950 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F994[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F9D0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F9D0; + if (((s16)a1) < 0xC00) { + tbl = D_8017F994; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017FA0C, D_8017FA0E, D_8017FA10, D_8017FA12, D_8017FA14, D_8017FA16; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017FA0E < ang)) goto outer_else; + if (!(ang < D_8017FA14)) goto inner_else; + if (ang < D_8017FA10) { *(s16 *)L = D_8017FA10; goto done; } + if (D_8017FA12 < ang) { *(s16 *)L = D_8017FA12; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017FA0C) { *(s16 *)L = D_8017FA0C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017FA16 < ang) { *(s16 *)L = D_8017FA16; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018E7B0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018E7B0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018E7B0; +extern s8 D_8018E7B4; +extern s8 D_8018E7B5; + +void func_8013C9C4(void * arg0) +{ + D_8018E7B0 = arg0; + D_8018E7B4 = 0; + D_8018E7B5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018E7B0; +extern s8 D_8018E7B4; +extern s8 D_8018E7B5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018E7B0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018E7B5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E7B4)) * 2) + D_8018E7B0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018E7B5 = (unsigned char) p[1]; + D_8018E7B4 = D_8018E7B4 + 1; + if (D_8018E7B5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018E7B4 = 0; + *base = 0; + } + } + else + { + D_8018E7B5 = c - 1; + } + } + return; +} + + + +extern s32 D_8018E7D4; +extern s32 D_8018E7C8; +extern s32 D_8018E7CC; +extern s32 D_8018E7D8; + +void func_8013CABC(void) { + D_8018E7D4 = 1; + D_8018E7C8 = 1; + D_8018E7CC = 0; + D_8018E7D8 = 1; +} + + + +extern s32 D_8018E7C8; +extern s32 D_8018E7CC; +extern s32 D_8018E7D0; +extern s32 D_8018E7D4; +extern s32 D_8018E7D8; + +void func_8013CAE8(void) { + D_8018E7C8 = 1; + D_8018E7D4 = 0; + D_8018E7CC = 0; + D_8018E7D0 = -1; + D_8018E7D8 = 0; +} + + + +extern s32 D_8018E7D4; +extern s32 D_8018E7D8; +extern s32 D_8018E800; +extern s32 D_8018E804; + +void func_8013CB20(void) +{ + D_8018E800 = D_8018E7D8; + D_8018E804 = D_8018E7D4; + D_8018E7D8 = 1; + D_8018E7D4 = 0; +} + + + +extern s32 D_8018E800; +extern s32 D_8018E804; +extern s32 D_8018E7D8; +extern s32 D_8018E7D4; + +void func_8013CB5C(void) { + D_8018E7D8 = D_8018E800; + D_8018E7D4 = D_8018E804; +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8018FA20; + extern u8 D_8018FA21; + extern u8 D_8018FA22; + extern u8 D_8018FA23; + extern u8 D_8018FA24; + extern u8 D_8018FA25; + extern u8 D_8018FA26; + extern u8 D_8018FA27; + extern u8 D_8018FA28; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8018FA20; t1 = D_8018FA21; t2 = D_8018FA22; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8018FA23; t1 = D_8018FA24; t2 = D_8018FA25; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8018FA26; t1 = D_8018FA27; t2 = D_8018FA28; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018E7E0; +extern s32 D_8018E7C8; +extern s32 D_8018E7E4; +extern s32 D_8018E7D4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018E7E0 != 0) { + if (D_8018E7E0 != 2) { + if (((D_8018E7E0 < 3) && (D_8018E7E0 == 1)) && + (D_8018E7E4 = D_8018E7E4 + 1, 0x23a < D_8018E7E4)) { + D_8018E7C8 = D_8018E7E0; + D_8018E7E0 = 2; + } + } else { + D_8018E7C8 = D_8018E7C8 + -1; + if (D_8018E7C8 == 0) { + D_8018E7C8 = D_8018E7E0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018E7D4 == 0) { + D_8018E7E0 = D_8018E7E0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018E7D4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018E7D4; +} + + + +extern s32 D_8018E7E0; + +void func_8013D164(void) { + D_8018E7E0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8018FB02; +extern u8 D_8018FB7C; +extern u8 D_8018FA2A; +extern u8 D_8018FAE4; +extern u8 D_8018FA08; +extern u8 D_8018FA29; +extern s32 D_8018FAE8; + +void func_8013D330(void) { + if ((D_8018FB02 & 0xff) != D_8018FB7C) { + D_8018FB02 = ((D_8018FB02 & 0xff) < D_8018FB7C) ? (D_8018FB02 + 1) : (D_8018FB02 - 1); + } + if ((D_8018FA2A & 0xff) != D_8018FAE4) { + D_8018FA2A = ((D_8018FA2A & 0xff) < D_8018FAE4) ? (D_8018FA2A + 1) : (D_8018FA2A - 1); + } + if ((D_8018FA08 & 0xff) != D_8018FA29) { + D_8018FA08 = ((D_8018FA08 & 0xff) < D_8018FA29) ? (D_8018FA08 + 1) : (D_8018FA08 - 1); + } + D_8018FAE8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018E7B8; +extern void *D_8018E7BC; +extern void *D_8018E7C0; +extern s32 D_8018E7E8; +extern s32 D_8018E7EC; +extern s32 D_8018E7F0; +extern s32 D_8018FA5C[]; + +extern u8 D_8017FB04[]; +extern u8 D_8017FBAC[]; +extern u8 D_8017FA5C[]; +extern u8 D_8017FB58[]; +extern u8 D_8017FBD8[]; +extern u8 D_8017FAB0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018E7E8 = param_2; + D_8018E7EC = (param_2 >> 2) & 3; + D_8018E7F0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018E7B8 = D_8017FB04; + D_8018E7BC = D_8017FBAC; + D_8018E7C0 = D_8017FA5C; + } else { + D_8018E7B8 = D_8017FB58; + D_8018E7BC = D_8017FBD8; + D_8018E7C0 = D_8017FAB0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018E7F0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018E7E8 & 2) != 0) { + D_8018FA5C[0] = 0x140; + D_8018FA5C[3] = 0x80; + if (p[0x37] == 4) { + D_8018FA5C[0] = 0x140; + D_8018FA5C[3] = 0; + } + if (p[0x37] == 0) { + D_8018FA5C[0] = 0x140; + D_8018FA5C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018E7C0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018E7C0; +extern s16 *D_8018E7C4; +extern s32 D_8018E7D4; +extern s32 D_8018E7F4; +extern s32 D_8018E7F8; +extern s32 D_8018E7FC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018E7C4 != 0) { + D_8018E7D4 = 0; + p = (int *)(param_1 * 12 + (int)D_8018E7C0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018E7F4 != x) { + flag = 1; + if (D_8018E7F4 < x) { + if (x - D_8018E7F4 < 5) { + D_8018E7F4 = x; + } else { + D_8018E7F4 = D_8018E7F4 + 4; + } + } else { + if (D_8018E7F4 - x < 5) { + D_8018E7F4 = x; + } else { + D_8018E7F4 = D_8018E7F4 - 4; + } + } + } + if (D_8018E7F8 != y) { + flag = 1; + if (D_8018E7F8 < y) { + if (y - D_8018E7F8 < 5) { + D_8018E7F8 = y; + } else { + D_8018E7F8 = D_8018E7F8 + 4; + } + } else { + if (D_8018E7F8 - y < 5) { + D_8018E7F8 = y; + } else { + D_8018E7F8 = D_8018E7F8 - 4; + } + } + } + if (D_8018E7FC != z) { + flag = 1; + if (D_8018E7FC < z) { + if (z - D_8018E7FC < 5) { + D_8018E7FC = z; + } else { + D_8018E7FC = D_8018E7FC + 4; + } + } else { + if (D_8018E7FC - z < 5) { + D_8018E7FC = z; + } else { + D_8018E7FC = D_8018E7FC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018E7D4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FC68[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018E7C4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7F4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7F8); + uVar5 = (*(int*)&D_8018E7FC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FC68); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018E7DC; + +s32 func_8013E054(void) { + return D_8018E7DC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180664; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018063C; +extern s16 D_8018063E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180664; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018063C = 2; + D_8018063E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018063E = 0; + D_8018063C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018E810; + extern void * D_8018E814; + extern unsigned char D_801802DC; + extern unsigned char D_801802F4; + extern unsigned char D_80180368; + extern unsigned char D_80180370; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018E810 = &D_801802DC; + D_8018E814 = &D_80180368; + } else { + D_8018E810 = &D_801802F4; + D_8018E814 = &D_80180370; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180664/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180664 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180664)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180640; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180640)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180640)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018063C; +extern s16 D_8018063E; +extern unsigned char D_80180640; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018063E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018063C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018063E; + if (*r < 3) { + *r = *r + 1; + } + D_8018063C = (u16)D_8018063C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180640); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180640; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180640); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_006/ov_SC03_006_jr_8012ACE0.c b/src/ov_SC03_006/ov_SC03_006_jr_8012ACE0.c index 05e15d809..e190be38e 100644 --- a/src/ov_SC03_006/ov_SC03_006_jr_8012ACE0.c +++ b/src/ov_SC03_006/ov_SC03_006_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018CBE4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018CBE4[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018CC28; -extern u8 D_8018CC6C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018CC28; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018CC6C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018CCB0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018CCEC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018CCEC; - if (((s16)a1) < 0xC00) { - tbl = D_8018CCB0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018CD28, D_8018CD2A, D_8018CD2C, D_8018CD2E, D_8018CD30, D_8018CD32; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018CD2A < ang)) goto outer_else; - if (!(ang < D_8018CD30)) goto inner_else; - if (ang < D_8018CD2C) { *(s16 *)L = D_8018CD2C; goto done; } - if (D_8018CD2E < ang) { *(s16 *)L = D_8018CD2E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018CD28) { *(s16 *)L = D_8018CD28; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018CD32 < ang) { *(s16 *)L = D_8018CD32; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801F6128; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801F6128, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801F6128; -extern s8 D_801F612C; -extern s8 D_801F612D; - -void func_8013C9C4(void * arg0) -{ - D_801F6128 = arg0; - D_801F612C = 0; - D_801F612D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801F6128; -extern s8 D_801F612C; -extern s8 D_801F612D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801F6128; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801F612D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801F612C)) * 2) + D_801F6128); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801F612D = (unsigned char) p[1]; - D_801F612C = D_801F612C + 1; - if (D_801F612D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801F612C = 0; - *base = 0; - } - } - else - { - D_801F612D = c - 1; - } - } - return; -} - - - -extern s32 D_801F614C; -extern s32 D_801F6140; -extern s32 D_801F6144; -extern s32 D_801F6150; - -void func_8013CABC(void) { - D_801F614C = 1; - D_801F6140 = 1; - D_801F6144 = 0; - D_801F6150 = 1; -} - - - -extern s32 D_801F6140; -extern s32 D_801F6144; -extern s32 D_801F6148; -extern s32 D_801F614C; -extern s32 D_801F6150; - -void func_8013CAE8(void) { - D_801F6140 = 1; - D_801F614C = 0; - D_801F6144 = 0; - D_801F6148 = -1; - D_801F6150 = 0; -} - - - -extern s32 D_801F614C; -extern s32 D_801F6150; -extern s32 D_801F6178; -extern s32 D_801F617C; - -void func_8013CB20(void) -{ - D_801F6178 = D_801F6150; - D_801F617C = D_801F614C; - D_801F6150 = 1; - D_801F614C = 0; -} - - - -extern s32 D_801F6178; -extern s32 D_801F617C; -extern s32 D_801F6150; -extern s32 D_801F614C; - -void func_8013CB5C(void) { - D_801F6150 = D_801F6178; - D_801F614C = D_801F617C; -} - - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801F7760; - extern u8 D_801F7761; - extern u8 D_801F7762; - extern u8 D_801F7763; - extern u8 D_801F7764; - extern u8 D_801F7765; - extern u8 D_801F7766; - extern u8 D_801F7767; - extern u8 D_801F7768; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801F7760; t1 = D_801F7761; t2 = D_801F7762; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801F7763; t1 = D_801F7764; t2 = D_801F7765; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801F7766; t1 = D_801F7767; t2 = D_801F7768; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801F6158; -extern s32 D_801F6140; -extern s32 D_801F615C; -extern s32 D_801F614C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801F6158 != 0) { - if (D_801F6158 != 2) { - if (((D_801F6158 < 3) && (D_801F6158 == 1)) && - (D_801F615C = D_801F615C + 1, 0x23a < D_801F615C)) { - D_801F6140 = D_801F6158; - D_801F6158 = 2; - } - } else { - D_801F6140 = D_801F6140 + -1; - if (D_801F6140 == 0) { - D_801F6140 = D_801F6158; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801F614C == 0) { - D_801F6158 = D_801F6158 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801F614C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801F614C; -} - - - -extern s32 D_801F6158; - -void func_8013D164(void) { - D_801F6158 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801F7842; -extern u8 D_801F78B6; -extern u8 D_801F776A; -extern u8 D_801F7824; -extern u8 D_801F7748; -extern u8 D_801F7769; -extern s32 D_801F7828; - -void func_8013D330(void) { - if ((D_801F7842 & 0xff) != D_801F78B6) { - D_801F7842 = ((D_801F7842 & 0xff) < D_801F78B6) ? (D_801F7842 + 1) : (D_801F7842 - 1); - } - if ((D_801F776A & 0xff) != D_801F7824) { - D_801F776A = ((D_801F776A & 0xff) < D_801F7824) ? (D_801F776A + 1) : (D_801F776A - 1); - } - if ((D_801F7748 & 0xff) != D_801F7769) { - D_801F7748 = ((D_801F7748 & 0xff) < D_801F7769) ? (D_801F7748 + 1) : (D_801F7748 - 1); - } - D_801F7828 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801F6130; -extern void *D_801F6134; -extern void *D_801F6138; -extern s32 D_801F6160; -extern s32 D_801F6164; -extern s32 D_801F6168; -extern s32 D_801F779C[]; - -extern u8 D_8018CE20[]; -extern u8 D_8018CEC8[]; -extern u8 D_8018CD78[]; -extern u8 D_8018CE74[]; -extern u8 D_8018CEF4[]; -extern u8 D_8018CDCC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801F6160 = param_2; - D_801F6164 = (param_2 >> 2) & 3; - D_801F6168 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801F6130 = D_8018CE20; - D_801F6134 = D_8018CEC8; - D_801F6138 = D_8018CD78; - } else { - D_801F6130 = D_8018CE74; - D_801F6134 = D_8018CEF4; - D_801F6138 = D_8018CDCC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801F6168 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801F6160 & 2) != 0) { - D_801F779C[0] = 0x140; - D_801F779C[3] = 0x80; - if (p[0x37] == 4) { - D_801F779C[0] = 0x140; - D_801F779C[3] = 0; - } - if (p[0x37] == 0) { - D_801F779C[0] = 0x140; - D_801F779C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801F6138)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801F6138; -extern s16 *D_801F613C; -extern s32 D_801F614C; -extern s32 D_801F616C; -extern s32 D_801F6170; -extern s32 D_801F6174; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801F613C != 0) { - D_801F614C = 0; - p = (int *)(param_1 * 12 + (int)D_801F6138); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801F616C != x) { - flag = 1; - if (D_801F616C < x) { - if (x - D_801F616C < 5) { - D_801F616C = x; - } else { - D_801F616C = D_801F616C + 4; - } - } else { - if (D_801F616C - x < 5) { - D_801F616C = x; - } else { - D_801F616C = D_801F616C - 4; - } - } - } - if (D_801F6170 != y) { - flag = 1; - if (D_801F6170 < y) { - if (y - D_801F6170 < 5) { - D_801F6170 = y; - } else { - D_801F6170 = D_801F6170 + 4; - } - } else { - if (D_801F6170 - y < 5) { - D_801F6170 = y; - } else { - D_801F6170 = D_801F6170 - 4; - } - } - } - if (D_801F6174 != z) { - flag = 1; - if (D_801F6174 < z) { - if (z - D_801F6174 < 5) { - D_801F6174 = z; - } else { - D_801F6174 = D_801F6174 + 4; - } - } else { - if (D_801F6174 - z < 5) { - D_801F6174 = z; - } else { - D_801F6174 = D_801F6174 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801F614C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018CF84[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801F613C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801F616C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801F6170); - uVar5 = (*(int*)&D_801F6174); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018CF84); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801F6154; - -s32 func_8013E054(void) { - return D_801F6154; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018D980; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018D958; -extern s16 D_8018D95A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018D980; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018D958 = 2; - D_8018D95A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018D95A = 0; - D_8018D958 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801F6188; - extern void * D_801F618C; - extern unsigned char D_8018D5F8; - extern unsigned char D_8018D610; - extern unsigned char D_8018D684; - extern unsigned char D_8018D68C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801F6188 = &D_8018D5F8; - D_801F618C = &D_8018D684; - } else { - D_801F6188 = &D_8018D610; - D_801F618C = &D_8018D68C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018D980/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018D980 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018D980)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018D95C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018D95C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018D95C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018D958; -extern s16 D_8018D95A; -extern unsigned char D_8018D95C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018D95A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018D958` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018D95A; - if (*r < 3) { - *r = *r + 1; - } - D_8018D958 = (u16)D_8018D958 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D95C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018D95C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D95C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_006/ov_SC03_006_jr_801380E0.c b/src/ov_SC03_006/ov_SC03_006_jr_801380E0.c new file mode 100644 index 000000000..a5903d435 --- /dev/null +++ b/src/ov_SC03_006/ov_SC03_006_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801F4E00; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018C878[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801F6044; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801F7848; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801F4E00; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018C5B4)(); +extern s16 (*D_8018C5B8)(); +extern M2C_UNK (*D_8018C5C0)(); +extern s32 (*D_8018C5C4)(); +extern s32 D_801F6040; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801F4E04; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018C90C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018FDF0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018C924; +extern M2C_UNK D_8018C92C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018C934; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018C950[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018C95C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018C970[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018C9C0[]; +extern s16 D_8018C9F0[]; +extern s16 D_8018CA50[]; +extern s16 D_8018CA58[]; +extern s16 D_8018CA78[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018CAB0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018CB08[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018CB50[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018CB58[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018CB60[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018CB68[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018CB10; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018CB30; +extern void func_801321B0(int param_1); +extern int D_8018CB40; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801F60B0; +extern s32 D_801F60B4[]; +extern int D_801F60B8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018CB74; +extern u8 D_8018CB70; +extern s16 *D_8018CB78; +extern u8 D_8018CB7C; +extern int D_801F60B0; +extern u16 D_801F60C0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018CB78; /* holds a pointer value (*(u16**)&D_8018CB78) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018CB8C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018CBE0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018CBE4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018CBE4[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018CC28; +extern u8 D_8018CC6C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018CC28; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018CC6C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018CCB0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018CCEC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018CCEC; + if (((s16)a1) < 0xC00) { + tbl = D_8018CCB0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018CD28, D_8018CD2A, D_8018CD2C, D_8018CD2E, D_8018CD30, D_8018CD32; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018CD2A < ang)) goto outer_else; + if (!(ang < D_8018CD30)) goto inner_else; + if (ang < D_8018CD2C) { *(s16 *)L = D_8018CD2C; goto done; } + if (D_8018CD2E < ang) { *(s16 *)L = D_8018CD2E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018CD28) { *(s16 *)L = D_8018CD28; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018CD32 < ang) { *(s16 *)L = D_8018CD32; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801F6128; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801F6128, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801F6128; +extern s8 D_801F612C; +extern s8 D_801F612D; + +void func_8013C9C4(void * arg0) +{ + D_801F6128 = arg0; + D_801F612C = 0; + D_801F612D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801F6128; +extern s8 D_801F612C; +extern s8 D_801F612D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801F6128; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801F612D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801F612C)) * 2) + D_801F6128); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801F612D = (unsigned char) p[1]; + D_801F612C = D_801F612C + 1; + if (D_801F612D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801F612C = 0; + *base = 0; + } + } + else + { + D_801F612D = c - 1; + } + } + return; +} + + + +extern s32 D_801F614C; +extern s32 D_801F6140; +extern s32 D_801F6144; +extern s32 D_801F6150; + +void func_8013CABC(void) { + D_801F614C = 1; + D_801F6140 = 1; + D_801F6144 = 0; + D_801F6150 = 1; +} + + + +extern s32 D_801F6140; +extern s32 D_801F6144; +extern s32 D_801F6148; +extern s32 D_801F614C; +extern s32 D_801F6150; + +void func_8013CAE8(void) { + D_801F6140 = 1; + D_801F614C = 0; + D_801F6144 = 0; + D_801F6148 = -1; + D_801F6150 = 0; +} + + + +extern s32 D_801F614C; +extern s32 D_801F6150; +extern s32 D_801F6178; +extern s32 D_801F617C; + +void func_8013CB20(void) +{ + D_801F6178 = D_801F6150; + D_801F617C = D_801F614C; + D_801F6150 = 1; + D_801F614C = 0; +} + + + +extern s32 D_801F6178; +extern s32 D_801F617C; +extern s32 D_801F6150; +extern s32 D_801F614C; + +void func_8013CB5C(void) { + D_801F6150 = D_801F6178; + D_801F614C = D_801F617C; +} + + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801F7760; + extern u8 D_801F7761; + extern u8 D_801F7762; + extern u8 D_801F7763; + extern u8 D_801F7764; + extern u8 D_801F7765; + extern u8 D_801F7766; + extern u8 D_801F7767; + extern u8 D_801F7768; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801F7760; t1 = D_801F7761; t2 = D_801F7762; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801F7763; t1 = D_801F7764; t2 = D_801F7765; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801F7766; t1 = D_801F7767; t2 = D_801F7768; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801F6158; +extern s32 D_801F6140; +extern s32 D_801F615C; +extern s32 D_801F614C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801F6158 != 0) { + if (D_801F6158 != 2) { + if (((D_801F6158 < 3) && (D_801F6158 == 1)) && + (D_801F615C = D_801F615C + 1, 0x23a < D_801F615C)) { + D_801F6140 = D_801F6158; + D_801F6158 = 2; + } + } else { + D_801F6140 = D_801F6140 + -1; + if (D_801F6140 == 0) { + D_801F6140 = D_801F6158; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801F614C == 0) { + D_801F6158 = D_801F6158 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801F614C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801F614C; +} + + + +extern s32 D_801F6158; + +void func_8013D164(void) { + D_801F6158 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801F7842; +extern u8 D_801F78B6; +extern u8 D_801F776A; +extern u8 D_801F7824; +extern u8 D_801F7748; +extern u8 D_801F7769; +extern s32 D_801F7828; + +void func_8013D330(void) { + if ((D_801F7842 & 0xff) != D_801F78B6) { + D_801F7842 = ((D_801F7842 & 0xff) < D_801F78B6) ? (D_801F7842 + 1) : (D_801F7842 - 1); + } + if ((D_801F776A & 0xff) != D_801F7824) { + D_801F776A = ((D_801F776A & 0xff) < D_801F7824) ? (D_801F776A + 1) : (D_801F776A - 1); + } + if ((D_801F7748 & 0xff) != D_801F7769) { + D_801F7748 = ((D_801F7748 & 0xff) < D_801F7769) ? (D_801F7748 + 1) : (D_801F7748 - 1); + } + D_801F7828 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801F6130; +extern void *D_801F6134; +extern void *D_801F6138; +extern s32 D_801F6160; +extern s32 D_801F6164; +extern s32 D_801F6168; +extern s32 D_801F779C[]; + +extern u8 D_8018CE20[]; +extern u8 D_8018CEC8[]; +extern u8 D_8018CD78[]; +extern u8 D_8018CE74[]; +extern u8 D_8018CEF4[]; +extern u8 D_8018CDCC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801F6160 = param_2; + D_801F6164 = (param_2 >> 2) & 3; + D_801F6168 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801F6130 = D_8018CE20; + D_801F6134 = D_8018CEC8; + D_801F6138 = D_8018CD78; + } else { + D_801F6130 = D_8018CE74; + D_801F6134 = D_8018CEF4; + D_801F6138 = D_8018CDCC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801F6168 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801F6160 & 2) != 0) { + D_801F779C[0] = 0x140; + D_801F779C[3] = 0x80; + if (p[0x37] == 4) { + D_801F779C[0] = 0x140; + D_801F779C[3] = 0; + } + if (p[0x37] == 0) { + D_801F779C[0] = 0x140; + D_801F779C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801F6138)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801F6138; +extern s16 *D_801F613C; +extern s32 D_801F614C; +extern s32 D_801F616C; +extern s32 D_801F6170; +extern s32 D_801F6174; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801F613C != 0) { + D_801F614C = 0; + p = (int *)(param_1 * 12 + (int)D_801F6138); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801F616C != x) { + flag = 1; + if (D_801F616C < x) { + if (x - D_801F616C < 5) { + D_801F616C = x; + } else { + D_801F616C = D_801F616C + 4; + } + } else { + if (D_801F616C - x < 5) { + D_801F616C = x; + } else { + D_801F616C = D_801F616C - 4; + } + } + } + if (D_801F6170 != y) { + flag = 1; + if (D_801F6170 < y) { + if (y - D_801F6170 < 5) { + D_801F6170 = y; + } else { + D_801F6170 = D_801F6170 + 4; + } + } else { + if (D_801F6170 - y < 5) { + D_801F6170 = y; + } else { + D_801F6170 = D_801F6170 - 4; + } + } + } + if (D_801F6174 != z) { + flag = 1; + if (D_801F6174 < z) { + if (z - D_801F6174 < 5) { + D_801F6174 = z; + } else { + D_801F6174 = D_801F6174 + 4; + } + } else { + if (D_801F6174 - z < 5) { + D_801F6174 = z; + } else { + D_801F6174 = D_801F6174 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801F614C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018CF84[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801F613C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801F616C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801F6170); + uVar5 = (*(int*)&D_801F6174); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018CF84); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801F6154; + +s32 func_8013E054(void) { + return D_801F6154; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018D980; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018D958; +extern s16 D_8018D95A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018D980; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018D958 = 2; + D_8018D95A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018D95A = 0; + D_8018D958 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801F6188; + extern void * D_801F618C; + extern unsigned char D_8018D5F8; + extern unsigned char D_8018D610; + extern unsigned char D_8018D684; + extern unsigned char D_8018D68C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801F6188 = &D_8018D5F8; + D_801F618C = &D_8018D684; + } else { + D_801F6188 = &D_8018D610; + D_801F618C = &D_8018D68C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018D980/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018D980 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018D980)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018D95C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018D95C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018D95C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018D958; +extern s16 D_8018D95A; +extern unsigned char D_8018D95C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018D95A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018D958` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018D95A; + if (*r < 3) { + *r = *r + 1; + } + D_8018D958 = (u16)D_8018D958 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D95C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018D95C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D95C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_007/ov_SC03_007_jr_8012ACE0.c b/src/ov_SC03_007/ov_SC03_007_jr_8012ACE0.c index 6aec92094..dd9b9161a 100644 --- a/src/ov_SC03_007/ov_SC03_007_jr_8012ACE0.c +++ b/src/ov_SC03_007/ov_SC03_007_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801879DC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801879DC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80187A20; -extern u8 D_80187A64; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80187A20; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80187A64 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80187AA8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80187AE4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80187AE4; - if (((s16)a1) < 0xC00) { - tbl = D_80187AA8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80187B20, D_80187B22, D_80187B24, D_80187B26, D_80187B28, D_80187B2A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80187B22 < ang)) goto outer_else; - if (!(ang < D_80187B28)) goto inner_else; - if (ang < D_80187B24) { *(s16 *)L = D_80187B24; goto done; } - if (D_80187B26 < ang) { *(s16 *)L = D_80187B26; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80187B20) { *(s16 *)L = D_80187B20; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80187B2A < ang) { *(s16 *)L = D_80187B2A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E8A80; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E8A80, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E8A80; -extern s8 D_801E8A84; -extern s8 D_801E8A85; - -void func_8013C9C4(void * arg0) -{ - D_801E8A80 = arg0; - D_801E8A84 = 0; - D_801E8A85 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E8A80; -extern s8 D_801E8A84; -extern s8 D_801E8A85; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E8A80; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E8A85; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E8A84)) * 2) + D_801E8A80); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E8A85 = (unsigned char) p[1]; - D_801E8A84 = D_801E8A84 + 1; - if (D_801E8A85 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E8A84 = 0; - *base = 0; - } - } - else - { - D_801E8A85 = c - 1; - } - } - return; -} - - - -extern s32 D_801E8AA4; -extern s32 D_801E8A98; -extern s32 D_801E8A9C; -extern s32 D_801E8AA8; - -void func_8013CABC(void) { - D_801E8AA4 = 1; - D_801E8A98 = 1; - D_801E8A9C = 0; - D_801E8AA8 = 1; -} - - - -extern s32 D_801E8A98; -extern s32 D_801E8A9C; -extern s32 D_801E8AA0; -extern s32 D_801E8AA4; -extern s32 D_801E8AA8; - -void func_8013CAE8(void) { - D_801E8A98 = 1; - D_801E8AA4 = 0; - D_801E8A9C = 0; - D_801E8AA0 = -1; - D_801E8AA8 = 0; -} - - - -extern s32 D_801E8AA4; -extern s32 D_801E8AA8; -extern s32 D_801E8AD0; -extern s32 D_801E8AD4; - -void func_8013CB20(void) -{ - D_801E8AD0 = D_801E8AA8; - D_801E8AD4 = D_801E8AA4; - D_801E8AA8 = 1; - D_801E8AA4 = 0; -} - - - -extern s32 D_801E8AD0; -extern s32 D_801E8AD4; -extern s32 D_801E8AA8; -extern s32 D_801E8AA4; - -void func_8013CB5C(void) { - D_801E8AA8 = D_801E8AD0; - D_801E8AA4 = D_801E8AD4; -} - - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EB170; - extern u8 D_801EB171; - extern u8 D_801EB172; - extern u8 D_801EB173; - extern u8 D_801EB174; - extern u8 D_801EB175; - extern u8 D_801EB176; - extern u8 D_801EB177; - extern u8 D_801EB178; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EB170; t1 = D_801EB171; t2 = D_801EB172; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EB173; t1 = D_801EB174; t2 = D_801EB175; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EB176; t1 = D_801EB177; t2 = D_801EB178; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E8AB0; -extern s32 D_801E8A98; -extern s32 D_801E8AB4; -extern s32 D_801E8AA4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E8AB0 != 0) { - if (D_801E8AB0 != 2) { - if (((D_801E8AB0 < 3) && (D_801E8AB0 == 1)) && - (D_801E8AB4 = D_801E8AB4 + 1, 0x23a < D_801E8AB4)) { - D_801E8A98 = D_801E8AB0; - D_801E8AB0 = 2; - } - } else { - D_801E8A98 = D_801E8A98 + -1; - if (D_801E8A98 == 0) { - D_801E8A98 = D_801E8AB0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E8AA4 == 0) { - D_801E8AB0 = D_801E8AB0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E8AA4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E8AA4; -} - - - -extern s32 D_801E8AB0; - -void func_8013D164(void) { - D_801E8AB0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EB252; -extern u8 D_801EB2C6; -extern u8 D_801EB17A; -extern u8 D_801EB234; -extern u8 D_801EB158; -extern u8 D_801EB179; -extern s32 D_801EB238; - -void func_8013D330(void) { - if ((D_801EB252 & 0xff) != D_801EB2C6) { - D_801EB252 = ((D_801EB252 & 0xff) < D_801EB2C6) ? (D_801EB252 + 1) : (D_801EB252 - 1); - } - if ((D_801EB17A & 0xff) != D_801EB234) { - D_801EB17A = ((D_801EB17A & 0xff) < D_801EB234) ? (D_801EB17A + 1) : (D_801EB17A - 1); - } - if ((D_801EB158 & 0xff) != D_801EB179) { - D_801EB158 = ((D_801EB158 & 0xff) < D_801EB179) ? (D_801EB158 + 1) : (D_801EB158 - 1); - } - D_801EB238 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E8A88; -extern void *D_801E8A8C; -extern void *D_801E8A90; -extern s32 D_801E8AB8; -extern s32 D_801E8ABC; -extern s32 D_801E8AC0; -extern s32 D_801EB1AC[]; - -extern u8 D_80187C18[]; -extern u8 D_80187CC0[]; -extern u8 D_80187B70[]; -extern u8 D_80187C6C[]; -extern u8 D_80187CEC[]; -extern u8 D_80187BC4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E8AB8 = param_2; - D_801E8ABC = (param_2 >> 2) & 3; - D_801E8AC0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E8A88 = D_80187C18; - D_801E8A8C = D_80187CC0; - D_801E8A90 = D_80187B70; - } else { - D_801E8A88 = D_80187C6C; - D_801E8A8C = D_80187CEC; - D_801E8A90 = D_80187BC4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E8AC0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E8AB8 & 2) != 0) { - D_801EB1AC[0] = 0x140; - D_801EB1AC[3] = 0x80; - if (p[0x37] == 4) { - D_801EB1AC[0] = 0x140; - D_801EB1AC[3] = 0; - } - if (p[0x37] == 0) { - D_801EB1AC[0] = 0x140; - D_801EB1AC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E8A90)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E8A90; -extern s16 *D_801E8A94; -extern s32 D_801E8AA4; -extern s32 D_801E8AC4; -extern s32 D_801E8AC8; -extern s32 D_801E8ACC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E8A94 != 0) { - D_801E8AA4 = 0; - p = (int *)(param_1 * 12 + (int)D_801E8A90); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E8AC4 != x) { - flag = 1; - if (D_801E8AC4 < x) { - if (x - D_801E8AC4 < 5) { - D_801E8AC4 = x; - } else { - D_801E8AC4 = D_801E8AC4 + 4; - } - } else { - if (D_801E8AC4 - x < 5) { - D_801E8AC4 = x; - } else { - D_801E8AC4 = D_801E8AC4 - 4; - } - } - } - if (D_801E8AC8 != y) { - flag = 1; - if (D_801E8AC8 < y) { - if (y - D_801E8AC8 < 5) { - D_801E8AC8 = y; - } else { - D_801E8AC8 = D_801E8AC8 + 4; - } - } else { - if (D_801E8AC8 - y < 5) { - D_801E8AC8 = y; - } else { - D_801E8AC8 = D_801E8AC8 - 4; - } - } - } - if (D_801E8ACC != z) { - flag = 1; - if (D_801E8ACC < z) { - if (z - D_801E8ACC < 5) { - D_801E8ACC = z; - } else { - D_801E8ACC = D_801E8ACC + 4; - } - } else { - if (D_801E8ACC - z < 5) { - D_801E8ACC = z; - } else { - D_801E8ACC = D_801E8ACC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E8AA4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80187D7C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E8A94); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E8AC4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E8AC8); - uVar5 = (*(int*)&D_801E8ACC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80187D7C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E8AAC; - -s32 func_8013E054(void) { - return D_801E8AAC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80188778; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80188750; -extern s16 D_80188752; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80188778; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80188750 = 2; - D_80188752 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80188752 = 0; - D_80188750 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E8AE0; - extern void * D_801E8AE4; - extern unsigned char D_801883F0; - extern unsigned char D_80188408; - extern unsigned char D_8018847C; - extern unsigned char D_80188484; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E8AE0 = &D_801883F0; - D_801E8AE4 = &D_8018847C; - } else { - D_801E8AE0 = &D_80188408; - D_801E8AE4 = &D_80188484; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80188778/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188778 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80188778)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80188754; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188754)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188754)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80188750; -extern s16 D_80188752; -extern unsigned char D_80188754; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188752` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80188750` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80188752; - if (*r < 3) { - *r = *r + 1; - } - D_80188750 = (u16)D_80188750 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188754); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80188754; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188754); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_007/ov_SC03_007_jr_801380E0.c b/src/ov_SC03_007/ov_SC03_007_jr_801380E0.c new file mode 100644 index 000000000..6511b9c42 --- /dev/null +++ b/src/ov_SC03_007/ov_SC03_007_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E7788; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80187670[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E899C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EB258; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E7788; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801873AC)(); +extern s16 (*D_801873B0)(); +extern M2C_UNK (*D_801873B8)(); +extern s32 (*D_801873BC)(); +extern s32 D_801E8998; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E778C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80187704; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018ABE8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018771C; +extern M2C_UNK D_80187724; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018772C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80187748[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80187754[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80187768[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801877B8[]; +extern s16 D_801877E8[]; +extern s16 D_80187848[]; +extern s16 D_80187850[]; +extern s16 D_80187870[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801878A8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80187900[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80187948[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80187950[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80187958[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80187960[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80187908; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80187928; +extern void func_801321B0(int param_1); +extern int D_80187938; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E8A08; +extern s32 D_801E8A0C[]; +extern int D_801E8A10; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018796C; +extern u8 D_80187968; +extern s16 *D_80187970; +extern u8 D_80187974; +extern int D_801E8A08; +extern u16 D_801E8A18; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80187970; /* holds a pointer value (*(u16**)&D_80187970) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80187984[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801879D8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801879DC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801879DC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80187A20; +extern u8 D_80187A64; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80187A20; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80187A64 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80187AA8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80187AE4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80187AE4; + if (((s16)a1) < 0xC00) { + tbl = D_80187AA8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80187B20, D_80187B22, D_80187B24, D_80187B26, D_80187B28, D_80187B2A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187B22 < ang)) goto outer_else; + if (!(ang < D_80187B28)) goto inner_else; + if (ang < D_80187B24) { *(s16 *)L = D_80187B24; goto done; } + if (D_80187B26 < ang) { *(s16 *)L = D_80187B26; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187B20) { *(s16 *)L = D_80187B20; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187B2A < ang) { *(s16 *)L = D_80187B2A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E8A80; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E8A80, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E8A80; +extern s8 D_801E8A84; +extern s8 D_801E8A85; + +void func_8013C9C4(void * arg0) +{ + D_801E8A80 = arg0; + D_801E8A84 = 0; + D_801E8A85 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E8A80; +extern s8 D_801E8A84; +extern s8 D_801E8A85; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E8A80; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E8A85; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E8A84)) * 2) + D_801E8A80); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E8A85 = (unsigned char) p[1]; + D_801E8A84 = D_801E8A84 + 1; + if (D_801E8A85 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E8A84 = 0; + *base = 0; + } + } + else + { + D_801E8A85 = c - 1; + } + } + return; +} + + + +extern s32 D_801E8AA4; +extern s32 D_801E8A98; +extern s32 D_801E8A9C; +extern s32 D_801E8AA8; + +void func_8013CABC(void) { + D_801E8AA4 = 1; + D_801E8A98 = 1; + D_801E8A9C = 0; + D_801E8AA8 = 1; +} + + + +extern s32 D_801E8A98; +extern s32 D_801E8A9C; +extern s32 D_801E8AA0; +extern s32 D_801E8AA4; +extern s32 D_801E8AA8; + +void func_8013CAE8(void) { + D_801E8A98 = 1; + D_801E8AA4 = 0; + D_801E8A9C = 0; + D_801E8AA0 = -1; + D_801E8AA8 = 0; +} + + + +extern s32 D_801E8AA4; +extern s32 D_801E8AA8; +extern s32 D_801E8AD0; +extern s32 D_801E8AD4; + +void func_8013CB20(void) +{ + D_801E8AD0 = D_801E8AA8; + D_801E8AD4 = D_801E8AA4; + D_801E8AA8 = 1; + D_801E8AA4 = 0; +} + + + +extern s32 D_801E8AD0; +extern s32 D_801E8AD4; +extern s32 D_801E8AA8; +extern s32 D_801E8AA4; + +void func_8013CB5C(void) { + D_801E8AA8 = D_801E8AD0; + D_801E8AA4 = D_801E8AD4; +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EB170; + extern u8 D_801EB171; + extern u8 D_801EB172; + extern u8 D_801EB173; + extern u8 D_801EB174; + extern u8 D_801EB175; + extern u8 D_801EB176; + extern u8 D_801EB177; + extern u8 D_801EB178; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EB170; t1 = D_801EB171; t2 = D_801EB172; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EB173; t1 = D_801EB174; t2 = D_801EB175; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EB176; t1 = D_801EB177; t2 = D_801EB178; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E8AB0; +extern s32 D_801E8A98; +extern s32 D_801E8AB4; +extern s32 D_801E8AA4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E8AB0 != 0) { + if (D_801E8AB0 != 2) { + if (((D_801E8AB0 < 3) && (D_801E8AB0 == 1)) && + (D_801E8AB4 = D_801E8AB4 + 1, 0x23a < D_801E8AB4)) { + D_801E8A98 = D_801E8AB0; + D_801E8AB0 = 2; + } + } else { + D_801E8A98 = D_801E8A98 + -1; + if (D_801E8A98 == 0) { + D_801E8A98 = D_801E8AB0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E8AA4 == 0) { + D_801E8AB0 = D_801E8AB0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E8AA4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E8AA4; +} + + + +extern s32 D_801E8AB0; + +void func_8013D164(void) { + D_801E8AB0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EB252; +extern u8 D_801EB2C6; +extern u8 D_801EB17A; +extern u8 D_801EB234; +extern u8 D_801EB158; +extern u8 D_801EB179; +extern s32 D_801EB238; + +void func_8013D330(void) { + if ((D_801EB252 & 0xff) != D_801EB2C6) { + D_801EB252 = ((D_801EB252 & 0xff) < D_801EB2C6) ? (D_801EB252 + 1) : (D_801EB252 - 1); + } + if ((D_801EB17A & 0xff) != D_801EB234) { + D_801EB17A = ((D_801EB17A & 0xff) < D_801EB234) ? (D_801EB17A + 1) : (D_801EB17A - 1); + } + if ((D_801EB158 & 0xff) != D_801EB179) { + D_801EB158 = ((D_801EB158 & 0xff) < D_801EB179) ? (D_801EB158 + 1) : (D_801EB158 - 1); + } + D_801EB238 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E8A88; +extern void *D_801E8A8C; +extern void *D_801E8A90; +extern s32 D_801E8AB8; +extern s32 D_801E8ABC; +extern s32 D_801E8AC0; +extern s32 D_801EB1AC[]; + +extern u8 D_80187C18[]; +extern u8 D_80187CC0[]; +extern u8 D_80187B70[]; +extern u8 D_80187C6C[]; +extern u8 D_80187CEC[]; +extern u8 D_80187BC4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E8AB8 = param_2; + D_801E8ABC = (param_2 >> 2) & 3; + D_801E8AC0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E8A88 = D_80187C18; + D_801E8A8C = D_80187CC0; + D_801E8A90 = D_80187B70; + } else { + D_801E8A88 = D_80187C6C; + D_801E8A8C = D_80187CEC; + D_801E8A90 = D_80187BC4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E8AC0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E8AB8 & 2) != 0) { + D_801EB1AC[0] = 0x140; + D_801EB1AC[3] = 0x80; + if (p[0x37] == 4) { + D_801EB1AC[0] = 0x140; + D_801EB1AC[3] = 0; + } + if (p[0x37] == 0) { + D_801EB1AC[0] = 0x140; + D_801EB1AC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E8A90)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E8A90; +extern s16 *D_801E8A94; +extern s32 D_801E8AA4; +extern s32 D_801E8AC4; +extern s32 D_801E8AC8; +extern s32 D_801E8ACC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E8A94 != 0) { + D_801E8AA4 = 0; + p = (int *)(param_1 * 12 + (int)D_801E8A90); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E8AC4 != x) { + flag = 1; + if (D_801E8AC4 < x) { + if (x - D_801E8AC4 < 5) { + D_801E8AC4 = x; + } else { + D_801E8AC4 = D_801E8AC4 + 4; + } + } else { + if (D_801E8AC4 - x < 5) { + D_801E8AC4 = x; + } else { + D_801E8AC4 = D_801E8AC4 - 4; + } + } + } + if (D_801E8AC8 != y) { + flag = 1; + if (D_801E8AC8 < y) { + if (y - D_801E8AC8 < 5) { + D_801E8AC8 = y; + } else { + D_801E8AC8 = D_801E8AC8 + 4; + } + } else { + if (D_801E8AC8 - y < 5) { + D_801E8AC8 = y; + } else { + D_801E8AC8 = D_801E8AC8 - 4; + } + } + } + if (D_801E8ACC != z) { + flag = 1; + if (D_801E8ACC < z) { + if (z - D_801E8ACC < 5) { + D_801E8ACC = z; + } else { + D_801E8ACC = D_801E8ACC + 4; + } + } else { + if (D_801E8ACC - z < 5) { + D_801E8ACC = z; + } else { + D_801E8ACC = D_801E8ACC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E8AA4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80187D7C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E8A94); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E8AC4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E8AC8); + uVar5 = (*(int*)&D_801E8ACC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80187D7C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E8AAC; + +s32 func_8013E054(void) { + return D_801E8AAC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80188778; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80188750; +extern s16 D_80188752; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80188778; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80188750 = 2; + D_80188752 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80188752 = 0; + D_80188750 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E8AE0; + extern void * D_801E8AE4; + extern unsigned char D_801883F0; + extern unsigned char D_80188408; + extern unsigned char D_8018847C; + extern unsigned char D_80188484; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E8AE0 = &D_801883F0; + D_801E8AE4 = &D_8018847C; + } else { + D_801E8AE0 = &D_80188408; + D_801E8AE4 = &D_80188484; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80188778/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188778 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80188778)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80188754; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188754)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188754)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80188750; +extern s16 D_80188752; +extern unsigned char D_80188754; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188752` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80188750` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80188752; + if (*r < 3) { + *r = *r + 1; + } + D_80188750 = (u16)D_80188750 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188754); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80188754; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188754); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_010/ov_SC03_010_jr_8012ACE0.c b/src/ov_SC03_010/ov_SC03_010_jr_8012ACE0.c index 8d12a4ce7..37df9c9ff 100644 --- a/src/ov_SC03_010/ov_SC03_010_jr_8012ACE0.c +++ b/src/ov_SC03_010/ov_SC03_010_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801804FC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801804FC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180540; -extern u8 D_80180584; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180540; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80180584 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801805C8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80180604[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80180604; - if (((s16)a1) < 0xC00) { - tbl = D_801805C8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180640, D_80180642, D_80180644, D_80180646, D_80180648, D_8018064A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80180642 < ang)) goto outer_else; - if (!(ang < D_80180648)) goto inner_else; - if (ang < D_80180644) { *(s16 *)L = D_80180644; goto done; } - if (D_80180646 < ang) { *(s16 *)L = D_80180646; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180640) { *(s16 *)L = D_80180640; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018064A < ang) { *(s16 *)L = D_8018064A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019ECE0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019ECE0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019ECE0; -extern s8 D_8019ECE4; -extern s8 D_8019ECE5; - -void func_8013C9C4(void * arg0) -{ - D_8019ECE0 = arg0; - D_8019ECE4 = 0; - D_8019ECE5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019ECE0; -extern s8 D_8019ECE4; -extern s8 D_8019ECE5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019ECE0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019ECE5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019ECE4)) * 2) + D_8019ECE0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019ECE5 = (unsigned char) p[1]; - D_8019ECE4 = D_8019ECE4 + 1; - if (D_8019ECE5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019ECE4 = 0; - *base = 0; - } - } - else - { - D_8019ECE5 = c - 1; - } - } - return; -} - - - -extern s32 D_8019ED04; -extern s32 D_8019ECF8; -extern s32 D_8019ECFC; -extern s32 D_8019ED08; - -void func_8013CABC(void) { - D_8019ED04 = 1; - D_8019ECF8 = 1; - D_8019ECFC = 0; - D_8019ED08 = 1; -} - - - -extern s32 D_8019ECF8; -extern s32 D_8019ECFC; -extern s32 D_8019ED00; -extern s32 D_8019ED04; -extern s32 D_8019ED08; - -void func_8013CAE8(void) { - D_8019ECF8 = 1; - D_8019ED04 = 0; - D_8019ECFC = 0; - D_8019ED00 = -1; - D_8019ED08 = 0; -} - - - -extern s32 D_8019ED04; -extern s32 D_8019ED08; -extern s32 D_8019ED30; -extern s32 D_8019ED34; - -void func_8013CB20(void) -{ - D_8019ED30 = D_8019ED08; - D_8019ED34 = D_8019ED04; - D_8019ED08 = 1; - D_8019ED04 = 0; -} - - - -extern s32 D_8019ED30; -extern s32 D_8019ED34; -extern s32 D_8019ED08; -extern s32 D_8019ED04; - -void func_8013CB5C(void) { - D_8019ED08 = D_8019ED30; - D_8019ED04 = D_8019ED34; -} - - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A0078; - extern u8 D_801A0079; - extern u8 D_801A007A; - extern u8 D_801A007B; - extern u8 D_801A007C; - extern u8 D_801A007D; - extern u8 D_801A007E; - extern u8 D_801A007F; - extern u8 D_801A0080; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A0078; t1 = D_801A0079; t2 = D_801A007A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A007B; t1 = D_801A007C; t2 = D_801A007D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A007E; t1 = D_801A007F; t2 = D_801A0080; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019ED10; -extern s32 D_8019ECF8; -extern s32 D_8019ED14; -extern s32 D_8019ED04; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019ED10 != 0) { - if (D_8019ED10 != 2) { - if (((D_8019ED10 < 3) && (D_8019ED10 == 1)) && - (D_8019ED14 = D_8019ED14 + 1, 0x23a < D_8019ED14)) { - D_8019ECF8 = D_8019ED10; - D_8019ED10 = 2; - } - } else { - D_8019ECF8 = D_8019ECF8 + -1; - if (D_8019ECF8 == 0) { - D_8019ECF8 = D_8019ED10; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019ED04 == 0) { - D_8019ED10 = D_8019ED10 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019ED04; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019ED04; -} - - - -extern s32 D_8019ED10; - -void func_8013D164(void) { - D_8019ED10 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A015A; -extern u8 D_801A01CE; -extern u8 D_801A0082; -extern u8 D_801A013C; -extern u8 D_801A0060; -extern u8 D_801A0081; -extern s32 D_801A0140; - -void func_8013D330(void) { - if ((D_801A015A & 0xff) != D_801A01CE) { - D_801A015A = ((D_801A015A & 0xff) < D_801A01CE) ? (D_801A015A + 1) : (D_801A015A - 1); - } - if ((D_801A0082 & 0xff) != D_801A013C) { - D_801A0082 = ((D_801A0082 & 0xff) < D_801A013C) ? (D_801A0082 + 1) : (D_801A0082 - 1); - } - if ((D_801A0060 & 0xff) != D_801A0081) { - D_801A0060 = ((D_801A0060 & 0xff) < D_801A0081) ? (D_801A0060 + 1) : (D_801A0060 - 1); - } - D_801A0140 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019ECE8; -extern void *D_8019ECEC; -extern void *D_8019ECF0; -extern s32 D_8019ED18; -extern s32 D_8019ED1C; -extern s32 D_8019ED20; -extern s32 D_801A00B4[]; - -extern u8 D_80180738[]; -extern u8 D_801807E0[]; -extern u8 D_80180690[]; -extern u8 D_8018078C[]; -extern u8 D_8018080C[]; -extern u8 D_801806E4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019ED18 = param_2; - D_8019ED1C = (param_2 >> 2) & 3; - D_8019ED20 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019ECE8 = D_80180738; - D_8019ECEC = D_801807E0; - D_8019ECF0 = D_80180690; - } else { - D_8019ECE8 = D_8018078C; - D_8019ECEC = D_8018080C; - D_8019ECF0 = D_801806E4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019ED20 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019ED18 & 2) != 0) { - D_801A00B4[0] = 0x140; - D_801A00B4[3] = 0x80; - if (p[0x37] == 4) { - D_801A00B4[0] = 0x140; - D_801A00B4[3] = 0; - } - if (p[0x37] == 0) { - D_801A00B4[0] = 0x140; - D_801A00B4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019ECF0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019ECF0; -extern s16 *D_8019ECF4; -extern s32 D_8019ED04; -extern s32 D_8019ED24; -extern s32 D_8019ED28; -extern s32 D_8019ED2C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019ECF4 != 0) { - D_8019ED04 = 0; - p = (int *)(param_1 * 12 + (int)D_8019ECF0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019ED24 != x) { - flag = 1; - if (D_8019ED24 < x) { - if (x - D_8019ED24 < 5) { - D_8019ED24 = x; - } else { - D_8019ED24 = D_8019ED24 + 4; - } - } else { - if (D_8019ED24 - x < 5) { - D_8019ED24 = x; - } else { - D_8019ED24 = D_8019ED24 - 4; - } - } - } - if (D_8019ED28 != y) { - flag = 1; - if (D_8019ED28 < y) { - if (y - D_8019ED28 < 5) { - D_8019ED28 = y; - } else { - D_8019ED28 = D_8019ED28 + 4; - } - } else { - if (D_8019ED28 - y < 5) { - D_8019ED28 = y; - } else { - D_8019ED28 = D_8019ED28 - 4; - } - } - } - if (D_8019ED2C != z) { - flag = 1; - if (D_8019ED2C < z) { - if (z - D_8019ED2C < 5) { - D_8019ED2C = z; - } else { - D_8019ED2C = D_8019ED2C + 4; - } - } else { - if (D_8019ED2C - z < 5) { - D_8019ED2C = z; - } else { - D_8019ED2C = D_8019ED2C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019ED04 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018089C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019ECF4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019ED24); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019ED28); - uVar5 = (*(int*)&D_8019ED2C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018089C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019ED0C; - -s32 func_8013E054(void) { - return D_8019ED0C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80181298; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80181270; -extern s16 D_80181272; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80181298; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80181270 = 2; - D_80181272 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80181272 = 0; - D_80181270 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019ED40; - extern void * D_8019ED44; - extern unsigned char D_80180F10; - extern unsigned char D_80180F28; - extern unsigned char D_80180F9C; - extern unsigned char D_80180FA4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019ED40 = &D_80180F10; - D_8019ED44 = &D_80180F9C; - } else { - D_8019ED40 = &D_80180F28; - D_8019ED44 = &D_80180FA4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80181298/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80181298 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80181298)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80181274; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181274)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181274)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80181270; -extern s16 D_80181272; -extern unsigned char D_80181274; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181272` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80181270` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80181272; - if (*r < 3) { - *r = *r + 1; - } - D_80181270 = (u16)D_80181270 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181274); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80181274; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181274); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_010/ov_SC03_010_jr_801380E0.c b/src/ov_SC03_010/ov_SC03_010_jr_801380E0.c new file mode 100644 index 000000000..5a1092828 --- /dev/null +++ b/src/ov_SC03_010/ov_SC03_010_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019DA64; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80180190[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019EBFC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A0160; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019DA64; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017FECC)(); +extern s16 (*D_8017FED0)(); +extern M2C_UNK (*D_8017FED8)(); +extern s32 (*D_8017FEDC)(); +extern s32 D_8019EBF8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019DA68; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80180224; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80183708; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018023C; +extern M2C_UNK D_80180244; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018024C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80180268[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80180274[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80180288[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801802D8[]; +extern s16 D_80180308[]; +extern s16 D_80180368[]; +extern s16 D_80180370[]; +extern s16 D_80180390[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801803C8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180420[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80180468[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80180470[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80180478[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80180480[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180428; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80180448; +extern void func_801321B0(int param_1); +extern int D_80180458; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019EC68; +extern s32 D_8019EC6C[]; +extern int D_8019EC70; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018048C; +extern u8 D_80180488; +extern s16 *D_80180490; +extern u8 D_80180494; +extern int D_8019EC68; +extern u16 D_8019EC78; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80180490; /* holds a pointer value (*(u16**)&D_80180490) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801804A4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801804F8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801804FC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801804FC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180540; +extern u8 D_80180584; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180540; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80180584 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801805C8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80180604[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80180604; + if (((s16)a1) < 0xC00) { + tbl = D_801805C8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180640, D_80180642, D_80180644, D_80180646, D_80180648, D_8018064A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180642 < ang)) goto outer_else; + if (!(ang < D_80180648)) goto inner_else; + if (ang < D_80180644) { *(s16 *)L = D_80180644; goto done; } + if (D_80180646 < ang) { *(s16 *)L = D_80180646; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180640) { *(s16 *)L = D_80180640; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018064A < ang) { *(s16 *)L = D_8018064A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019ECE0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019ECE0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019ECE0; +extern s8 D_8019ECE4; +extern s8 D_8019ECE5; + +void func_8013C9C4(void * arg0) +{ + D_8019ECE0 = arg0; + D_8019ECE4 = 0; + D_8019ECE5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019ECE0; +extern s8 D_8019ECE4; +extern s8 D_8019ECE5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019ECE0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019ECE5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019ECE4)) * 2) + D_8019ECE0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019ECE5 = (unsigned char) p[1]; + D_8019ECE4 = D_8019ECE4 + 1; + if (D_8019ECE5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019ECE4 = 0; + *base = 0; + } + } + else + { + D_8019ECE5 = c - 1; + } + } + return; +} + + + +extern s32 D_8019ED04; +extern s32 D_8019ECF8; +extern s32 D_8019ECFC; +extern s32 D_8019ED08; + +void func_8013CABC(void) { + D_8019ED04 = 1; + D_8019ECF8 = 1; + D_8019ECFC = 0; + D_8019ED08 = 1; +} + + + +extern s32 D_8019ECF8; +extern s32 D_8019ECFC; +extern s32 D_8019ED00; +extern s32 D_8019ED04; +extern s32 D_8019ED08; + +void func_8013CAE8(void) { + D_8019ECF8 = 1; + D_8019ED04 = 0; + D_8019ECFC = 0; + D_8019ED00 = -1; + D_8019ED08 = 0; +} + + + +extern s32 D_8019ED04; +extern s32 D_8019ED08; +extern s32 D_8019ED30; +extern s32 D_8019ED34; + +void func_8013CB20(void) +{ + D_8019ED30 = D_8019ED08; + D_8019ED34 = D_8019ED04; + D_8019ED08 = 1; + D_8019ED04 = 0; +} + + + +extern s32 D_8019ED30; +extern s32 D_8019ED34; +extern s32 D_8019ED08; +extern s32 D_8019ED04; + +void func_8013CB5C(void) { + D_8019ED08 = D_8019ED30; + D_8019ED04 = D_8019ED34; +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A0078; + extern u8 D_801A0079; + extern u8 D_801A007A; + extern u8 D_801A007B; + extern u8 D_801A007C; + extern u8 D_801A007D; + extern u8 D_801A007E; + extern u8 D_801A007F; + extern u8 D_801A0080; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A0078; t1 = D_801A0079; t2 = D_801A007A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A007B; t1 = D_801A007C; t2 = D_801A007D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A007E; t1 = D_801A007F; t2 = D_801A0080; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019ED10; +extern s32 D_8019ECF8; +extern s32 D_8019ED14; +extern s32 D_8019ED04; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019ED10 != 0) { + if (D_8019ED10 != 2) { + if (((D_8019ED10 < 3) && (D_8019ED10 == 1)) && + (D_8019ED14 = D_8019ED14 + 1, 0x23a < D_8019ED14)) { + D_8019ECF8 = D_8019ED10; + D_8019ED10 = 2; + } + } else { + D_8019ECF8 = D_8019ECF8 + -1; + if (D_8019ECF8 == 0) { + D_8019ECF8 = D_8019ED10; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019ED04 == 0) { + D_8019ED10 = D_8019ED10 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019ED04; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019ED04; +} + + + +extern s32 D_8019ED10; + +void func_8013D164(void) { + D_8019ED10 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A015A; +extern u8 D_801A01CE; +extern u8 D_801A0082; +extern u8 D_801A013C; +extern u8 D_801A0060; +extern u8 D_801A0081; +extern s32 D_801A0140; + +void func_8013D330(void) { + if ((D_801A015A & 0xff) != D_801A01CE) { + D_801A015A = ((D_801A015A & 0xff) < D_801A01CE) ? (D_801A015A + 1) : (D_801A015A - 1); + } + if ((D_801A0082 & 0xff) != D_801A013C) { + D_801A0082 = ((D_801A0082 & 0xff) < D_801A013C) ? (D_801A0082 + 1) : (D_801A0082 - 1); + } + if ((D_801A0060 & 0xff) != D_801A0081) { + D_801A0060 = ((D_801A0060 & 0xff) < D_801A0081) ? (D_801A0060 + 1) : (D_801A0060 - 1); + } + D_801A0140 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019ECE8; +extern void *D_8019ECEC; +extern void *D_8019ECF0; +extern s32 D_8019ED18; +extern s32 D_8019ED1C; +extern s32 D_8019ED20; +extern s32 D_801A00B4[]; + +extern u8 D_80180738[]; +extern u8 D_801807E0[]; +extern u8 D_80180690[]; +extern u8 D_8018078C[]; +extern u8 D_8018080C[]; +extern u8 D_801806E4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019ED18 = param_2; + D_8019ED1C = (param_2 >> 2) & 3; + D_8019ED20 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019ECE8 = D_80180738; + D_8019ECEC = D_801807E0; + D_8019ECF0 = D_80180690; + } else { + D_8019ECE8 = D_8018078C; + D_8019ECEC = D_8018080C; + D_8019ECF0 = D_801806E4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019ED20 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019ED18 & 2) != 0) { + D_801A00B4[0] = 0x140; + D_801A00B4[3] = 0x80; + if (p[0x37] == 4) { + D_801A00B4[0] = 0x140; + D_801A00B4[3] = 0; + } + if (p[0x37] == 0) { + D_801A00B4[0] = 0x140; + D_801A00B4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019ECF0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019ECF0; +extern s16 *D_8019ECF4; +extern s32 D_8019ED04; +extern s32 D_8019ED24; +extern s32 D_8019ED28; +extern s32 D_8019ED2C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019ECF4 != 0) { + D_8019ED04 = 0; + p = (int *)(param_1 * 12 + (int)D_8019ECF0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019ED24 != x) { + flag = 1; + if (D_8019ED24 < x) { + if (x - D_8019ED24 < 5) { + D_8019ED24 = x; + } else { + D_8019ED24 = D_8019ED24 + 4; + } + } else { + if (D_8019ED24 - x < 5) { + D_8019ED24 = x; + } else { + D_8019ED24 = D_8019ED24 - 4; + } + } + } + if (D_8019ED28 != y) { + flag = 1; + if (D_8019ED28 < y) { + if (y - D_8019ED28 < 5) { + D_8019ED28 = y; + } else { + D_8019ED28 = D_8019ED28 + 4; + } + } else { + if (D_8019ED28 - y < 5) { + D_8019ED28 = y; + } else { + D_8019ED28 = D_8019ED28 - 4; + } + } + } + if (D_8019ED2C != z) { + flag = 1; + if (D_8019ED2C < z) { + if (z - D_8019ED2C < 5) { + D_8019ED2C = z; + } else { + D_8019ED2C = D_8019ED2C + 4; + } + } else { + if (D_8019ED2C - z < 5) { + D_8019ED2C = z; + } else { + D_8019ED2C = D_8019ED2C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019ED04 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018089C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019ECF4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019ED24); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019ED28); + uVar5 = (*(int*)&D_8019ED2C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018089C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019ED0C; + +s32 func_8013E054(void) { + return D_8019ED0C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80181298; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80181270; +extern s16 D_80181272; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80181298; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80181270 = 2; + D_80181272 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80181272 = 0; + D_80181270 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019ED40; + extern void * D_8019ED44; + extern unsigned char D_80180F10; + extern unsigned char D_80180F28; + extern unsigned char D_80180F9C; + extern unsigned char D_80180FA4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019ED40 = &D_80180F10; + D_8019ED44 = &D_80180F9C; + } else { + D_8019ED40 = &D_80180F28; + D_8019ED44 = &D_80180FA4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80181298/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80181298 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80181298)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80181274; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181274)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181274)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80181270; +extern s16 D_80181272; +extern unsigned char D_80181274; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181272` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80181270` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80181272; + if (*r < 3) { + *r = *r + 1; + } + D_80181270 = (u16)D_80181270 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181274); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80181274; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181274); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_011/ov_SC03_011.c b/src/ov_SC03_011/ov_SC03_011.c index 3ca8fe01d..2412817c2 100644 --- a/src/ov_SC03_011/ov_SC03_011.c +++ b/src/ov_SC03_011/ov_SC03_011.c @@ -521,4843 +521,3 @@ void func_8012ACA0(void *arg0) { M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); func_8012AAAC(); } - - - - -// @class: iv-combine -// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). -typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ -typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ - -s32 func_8012ACE0(void *o) { - int i; - for (i = 0; ; i++) { - switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { - case -2: - case -1: - case 0: - return i; - case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ - default: - break; - } - } -} - -DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ - -DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ - - - -void func_8012AD64(s32 *a0, s16 a1) { - *(s16*)((s32)a0 + 0x34) = a1; -} - - -DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ - -DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ - -DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ - -DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ - -DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ - -DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ - -DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ - -DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ - -DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ - -DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ - -DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ - -DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ - -DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ - -DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ - -DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ - -DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ - -DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012B4B8); - -DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ - -DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ - -DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ - -DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012B77C); - -DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ - -DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ - -DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ - -DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ - -DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ - -DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ - -DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ - -DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ - -DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ - -DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ - -DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ - -DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ - -DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ - -DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ - - -void func_8012BF4C(s32 *a0, s32 a1) { - *(s32*)((s32)a0 + 0x1C) = a1; -} - - -DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ - -DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ - -DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ - -DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ - -DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012C098); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012C0EC); - -DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ - -DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ - -DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ - -DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ - -DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ - -DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ - -DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ - -DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ - -DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ - -DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ - -DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012C658); - -DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012C750); - -DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to -// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS -// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via -// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store -// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. -// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). - -extern s32 D_80184A78; -extern s16 D_801270C4; -extern u16 D_801274E4[]; -extern s32 D_8011DB08; -extern void func_80016714(void *a0, s32 a1); - -s32 func_8012C890(s32 a0, s32 a1, s32 a2) { - u8 *src = (u8 *)a0; - u8 *dst = (u8 *)a1; - u16 *d; - s16 count; - u16 v2, v4; - s32 v10; - void *obj; - - *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); - v2 = *(u16 *)(src + 0x0); - *(u16 *)(dst + 0x6) = v2; - *(u16 *)(dst + 0x88) = v2; - v2 = *(u16 *)(src + 0x2); - *(u16 *)(dst + 0xA) = v2; - *(u16 *)(dst + 0x8A) = v2; - v4 = *(u16 *)(src + 0x4); - *(u16 *)(dst + 0xC) = 0; - *(u16 *)(dst + 0x8) = 0; - *(u16 *)(dst + 0x4) = 0; - *(u16 *)(dst + 0xE) = v4; - *(u16 *)(dst + 0x8C) = v4; - *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); - *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; - *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); - v10 = *(s32 *)(src + 0x10); - *(s32 *)(dst + 0x78) = (s32)&D_80184A78; - *(s32 *)(dst + 0xDC) = v10; - - { - register u16 *pc __asm__("$3"); - pc = &(*(u16 *)&D_801270C4); - *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; - count = *(volatile u16 *)pc + 1; - *pc = count; - if (count == 0) { - *pc = 1; - } - } - - if (a2 != 0) { - *(s32 *)(dst + 0x64) = a2; - *(s32 *)(dst + 0x68) = 0; - } else { - *(s32 *)(dst + 0x64) = 0; - *(s32 *)(dst + 0x68) = (s32)src; - } - - *(u16 *)(src + 0xA) |= 0x8000; - *(u16 *)(dst + 0x2) = 0; - d = D_801274E4; - *d &= 0xFFFE; - (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); - - if (*d & 1) { - s32 a1v; - obj = *(void **)(dst + 0x20); - if (obj != 0) { - s32 t = *(u16 *)obj; - if (t != 1) { - if (t != 2) { - goto done; - } - a1v = 0x38; - } else { - a1v = 0x84; - } - func_80016714(obj, a1v); - done:; - } - func_80016714(dst, 0x10C); - *(u16 *)(src + 0xA) &= 0x7FFF; - return 0; - } - - if (*(s32 *)(dst + 0x64) == 0) { - void *o = *(void **)(dst + 0x20); - if (o == 0) { - return (s32)dst; - } - if (*(u16 *)o == 1) { - s16 c = *(s16 *)(src + 0xC); - if (c != 0x7FFF) { - *(s16 *)((u8 *)o + 0x12) = c; - } - } - } - if (*(s32 *)(dst + 0x20) != 0) { - *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); - } - return (s32)dst; -} - - -DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ - -DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ - -DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ - -DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ - -DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ - -DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ - -DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ - -DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012CC88); - -DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ - -DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ - -DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ - -DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ - -DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ - -DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ - -DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ - -DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ - -DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ - -DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ - -DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH - - -struct S8012D664_8012D664 { short a, b, c; }; - -int func_8012D664(int arg0, int arg1, int arg2) { - extern int func_8012F568(); - extern int D_801815A4; - - struct S8012D664_8012D664 s; - int ret; - int t; - - s.a = (*(unsigned short*)&D_80126B5E); - s.b = (*(unsigned short*)&D_80126B62) - 0x40; - s.c = (*(unsigned short*)&D_80126B66); - ret = ((int(*)())func_800132BC)(arg0, &s); - t = arg1 + 0x20; - if (ret < t * t) { - func_8012F568(1, 1, 0, arg2, arg0, &D_801815A4); - return 1; - } - return 0; -} - - - -DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ - - - -extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -extern void func_8014C978(void); -extern M2C_UNK D_801815AC; -extern M2C_UNK D_801815B4; - -s32 func_8012DB84(void) -{ - func_8014C978(); - func_8012F568(1, 0xC001, 0, 0x3E8, &D_801815AC, &D_801815B4); -} - - -DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH - - -typedef struct Entry_8012DDA4 { - u16 active; - unsigned char pad[0x10C - 2]; -} Entry_8012DDA4; - - -s32 func_8012DDA4() -{ - extern Entry_8012DDA4 * D_801A0EB4; - extern Entry_8012DDA4 * D_801A0EB0; - - Entry_8012DDA4 *p; - Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); - - while (D_801A0EB4 != end) { - p = D_801A0EB4; - if (p->active != 0 && p != D_801A0EB0) { - D_801A0EB4 = p + 1; - return p; - } - D_801A0EB4++; - } - D_801A0EB4 = 0; - return 0; -} - - - -// @class: plumbing -// @stuck: none — MATCH (35/35 ins, relocation-masked) - - -s32 func_8012DE2C(s32 a0) { - extern u8 * D_801A0EB4; - extern u8 * D_801A0EB0; - - u8 *base; - u8 *end; - u8 *p; - - base = D_801202A0; - end = base + 0x6480; - D_801A0EB4 = base; - D_801A0EB0 = ((u8 *)a0); - - while (D_801A0EB4 != end) { - p = D_801A0EB4; - if (*(u16 *)p != 0 && p != ((u8 *)a0)) { - D_801A0EB4 = p + 0x10C; - return p; - } - D_801A0EB4 += 0x10C; - } - D_801A0EB4 = 0; - return 0; -} - - - -DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ - -DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ - -DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ - -DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ - -DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012E014); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012E138); - - -s32 func_8012E27C(void) { - return 1; -} - - -DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ - -DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ - -DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012E364); - -DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ - -DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ - -DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ - -DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ - -DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH -extern u8 D_800AF648; -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) -{ - struct { short xy[2]; int sp14; int flag; } f; - register void *p __asm__("$4"); - p = &D_800AF648; - func_8004914C(p); - func_800491AC(&D_800AF648); - RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); - if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { - func_8002D4C8(param_2, param_3); - } -} - - -DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012E778); - -DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ - -DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ - -DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ - -DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ - - - -// @class: other -// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) - -extern void func_8016AA50(int, int); -extern void func_8016B428(int); -extern void func_80019064(void *); -extern int D_801815BC; - -void func_8012E9C0(int param_1) -{ - int iVar1; - - if (*(short *)(param_1 + 0x60) != 0) { - if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { - *(short *)(param_1 + 0x82) = 0; - *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); - *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); - *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); - } - if (*(int *)(param_1 + 0x78) != 0) { - iVar1 = *(short *)(param_1 + 0x60) * - *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; - if (iVar1 < 1) { - iVar1 = 1; - } - } else { - iVar1 = *(short *)(param_1 + 0x60); - } - func_8016AA50(param_1, iVar1); - if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { - func_8016B428(param_1); - func_80019064(&D_801815BC); - } - } - return; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012EA90); - -DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ - -DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ - -DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ - -DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012EFB8); - - -// @class: other -// @stuck: none — MATCH (33 ins, match_one verified) - -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); - -void func_8012F038(int param_1, short *param_2, short *param_3) { - int in[3]; - int out[3]; - - in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); - in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); - in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); - ApplyTransposeMatrixLV((void *)param_1, in, out); - param_3[0] = out[0]; - param_3[1] = out[1]; - param_3[2] = out[2]; -} - - -DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern void RotTransSV(s32 a0, s32 a1, void *a2); - -void func_8012F14C(s32 a0, s32 a1, s32 a2) -{ - s32 buf[2]; - func_8004914C((void *)a0); - func_800491AC((void *)a0); - RotTransSV(a1, a2, buf); -} - - -DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ - -DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012F274); - -DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ - -DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012F40C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8012F49C); - -DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ - -DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ - -DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ - -DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ - -DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) -extern void func_80131170(); -extern void func_80131CA8(); -extern unsigned char D_801815D8[]; - -void func_8012F828(int param_1) -{ - *(unsigned char *)(param_1 + 0xC1) = 4; - if (*(unsigned int *)(param_1 + 0xB4) & 8) { - func_80131170(param_1, D_801815D8, 0xB); - } - func_80131CA8(param_1, 9); -} - - -DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ - - -extern void func_80131170(s32 a0, s32 a1, s32 a2); -extern void func_80131CA8(int a0, int a1); -extern u8 D_801815E4[]; - -void func_8012F8C8(u8* arg0) { - *(u8*)(arg0 + 0xC1) = 7; - if (*(u32*)(arg0 + 0xB4) & 0x80) { - ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801815E4, 0xB); - } - ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); -} - - -DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ - -DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ - -DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ - -DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ - -DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. -// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for -// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be -// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an -// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). -// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: -// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. -// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which -// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because -// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. -// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out -// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, -// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what -// blocks reorg from sharing a downstream constant into a branch delay slot.) - - -s32 func_8012FCC4(s32 param_1) { - extern int D_801815F0; - - int v1 = *(int *)(((int)param_1) + 0xC4); - *(char *)(((int)param_1) + 0xC1) = 8; - if (v1 & 2) { - *(char *)(((int)param_1) + 0xC1) = 1; - func_80131CA8(((int)param_1), 3); - return; - } - if (v1 & 1) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 1); - return; - } - if (*(int *)(((int)param_1) + 0xB4) & 0x100) { - ((void (*)(int))func_80131B14)(((int)param_1)); - if (*(short *)(((int)param_1) + 0x76) <= 0) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); - return; - } - if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { - *(char *)(((int)param_1) + 0xC2) = 0; - } else { - *(short *)(((int)param_1) + 0x98) = 0; - *(char *)(((int)param_1) + 0xC2) = 1; - } - ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801815F0); - *(int *)(((int)param_1) + 0x1C) = 0; - func_80131CA8(((int)param_1), 0x1C); - return; - } - func_80131CA8(((int)param_1), 0x1C); -} - - - -DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ - -DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ - -DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ - -DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ - -DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ - -DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ - -DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ - -DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ - -DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ - -DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ - -DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ - -DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ - -DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ - -DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ - -DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ - -DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ - -DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80130650); - -DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ - -DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ - -DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ - -DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ - -DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ - -DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80130A18); - -DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ - -DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80130C08); - - -extern void (*D_801815F8[])(void); - -void func_80130D0C(void *a0) { - D_801815F8[*(u8 *)((s32)a0 + 0xC1)](); -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). -extern s32 rand(void); -extern u8 D_80078E78[]; -extern u16 D_80078EB2; -extern u16 D_80078EB4; -extern s16 D_80181648[]; -extern s16 D_80181678[]; -extern s16 D_801816D8[]; -extern s16 D_801816E0[]; -extern s16 D_80181700[]; - -void func_80130D48(s32 arg0) -{ - register s16 *tbl __asm__("$16"); - register s32 pa __asm__("$18") = arg0; - register u8 *p __asm__("$19") = D_80078E78; - s32 s1v; - s32 call_a0; - s32 call_a1; - s32 cnt; - s32 r; - void *ret; - - s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); - if (s1v == 0) { - return; - } - - if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - } - - switch (s1v & 0xFFFF0000) { - case 0x10000: { - u32 x = D_80078EB4; - u32 y = D_80078EB2; - u32 b; - u32 a; - - s1v = 0; - if (x == y) { - s1v = 0xC; - } else if ((y >> 1) >= x) { - s1v = 3; - } - - b = *(u16 *)(p + 0x40); - a = *(u16 *)(p + 0x3E); - if (b == a) { - s1v += 0x18; - } else if ((a >> 1) >= b) { - s1v += 6; - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181678; tbl = (s16 *)(bp + v1); } - - r = rand() % 100; - cnt = 0; - loop27: - if (r >= *tbl) { - cnt += 1; - tbl += 1; - if (cnt < 3) { - goto loop27; - } - } - - s1v = 0; - switch (cnt) { - case 0: - tbl = D_801816D8; - s1v = 0x31; - break; - case 1: { - s32 mx = *(u16 *)(p + 0x3A); - s32 cur = *(u16 *)(p + 0x3C); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801816E0; tbl = (s16 *)(bp + v1); } - s1v = 0x32; - break; - } - case 2: { - s32 mx = *(u16 *)(p + 0x3E); - s32 cur = *(u16 *)(p + 0x40); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181700; tbl = (s16 *)(bp + v1); } - s1v = 0x33; - break; - } - } - - r = rand() % 100; - call_a1 = 0; - loop50: - if (r >= *tbl) { - call_a1 += 1; - tbl += 1; - if (call_a1 < 4) { - goto loop50; - } - } - call_a0 = s1v; - goto do_call; - } - case 0x20000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x30000: - call_a0 = 0x31; - call_a1 = 0; - goto do_call; - case 0x40000: - call_a0 = 0x32; - call_a1 = 0; - goto do_call; - case 0x50000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x60000: { - s32 rr = rand() & 0xFF; - tbl = D_80181648; - if (rr >= *tbl) { - do { - tbl += 3; - } while (rr >= *tbl); - } - call_a0 = tbl[1]; - if (*(u16 *)(p + 0x40) < 4U) { - call_a0 = 0x33; - } - call_a1 = tbl[2]; - goto do_call; - } - case 0x70000: - call_a0 = 0x27B; - call_a1 = 0; - goto do_call; - default: - return; - } - -do_call: - ret = func_8012C658(call_a0, call_a1, pa); - if (ret != 0) { - *(u16 *)((s8 *)ret + 0xA) -= 0x20; - } -} - - -// @class: loop-guard -// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps -// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` -// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); -// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's -// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC -// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). - - -void func_80131170(s32 p, s32 b, s32 c) { - extern u8 D_801815CC[]; - - func_80131B14(); - *(u8 *)(((u8 *)p) + 0xC2) = 0; - *(u8 *)(((u8 *)p) + 0xC3) = 0; - *(s16 *)(((u8 *)p) + 0x98) = 0; - if (((u8 *)b) == 0) { - ((u8 *)b) = D_801815CC; - } - func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); - *(s32 *)(((u8 *)p) + 0x1C) = 0; - if (c != 0) { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } else { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } -tail: - if (*(s16 *)(((u8 *)p) + 0x76) > 0) { - return; - } - if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); - } else { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); - } -} - - - -// @class: struct -// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) - -typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ - - -s32 func_801312D0(s32 param_1, void *param_2) -{ - extern int func_80131CF4(int, int); - extern M8_801312D0 D_80181720; - - int iVar5; - - iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); - if (iVar5 != 0) { - ((short *)param_2)[2] = 0; - ((short *)param_2)[0] = 0; - ((short *)param_2)[1] = (short)iVar5; - } else { - *(M8_801312D0 *)((short *)param_2) = D_80181720; - } -} - - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80131340); - -DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80131A34); - -DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` -// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be -// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a -// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). -// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; -// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the -// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); -// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. - -void func_80131B14() { - extern void func_8002A520(void *); - extern void func_8002A790(void *); - extern u8 D_80181728; - - register u8 *a0v __asm__("$4"); - u8 *p = a0v; - - - s32 e = *(u8 *)(p + 0x5E); - - if (*(s16 *)(p + 0x60) != 0) { - if (e == 0x1D) { - *(s16 *)(p + 0x82) = 0; - *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); - *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); - *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); - } - { - s32 dec; - s32 q = *(s32 *)(p + 0x78); - if (q != 0) { - dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; - if (dec <= 0) dec = 1; - } - *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; - } - ((void (*)(void *))func_8016AA50)(p); - if (*(u16 *)(p + 0x82) & 1) { - ((void (*)(void *))func_8016B428)(p); - ((void(*)(void *))func_80019064)(&D_80181728); - } - } - - *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; - - if (e != 0x1D) { - if (*(u8 *)(p + 0xC8)) func_8002A520(p); - if (*(u8 *)(p + 0xC9)) func_8002A790(p); - } - - if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; - - { - s32 r = *(s32 *)(p + 0x20); - *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; - { - s32 r2 = *(s32 *)(p + 0x20); - *(s16 *)(r2 + 0x14) = 0; - *(s16 *)(r2 + 0x10) = 0; - } - } - - ((void (*)(void *))func_8012B2CC)(p); - ((void (*)(void *))func_8012B23C)(p); -} - - - -DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80131CA8); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80131CF4); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80131D68); - - -extern void (*D_80181738[])(struct S80131E00 *a0); - -void func_80131E00(struct S80131E00 *a0, s32 a1) { - a0->field_B0 = a1; - D_80181738[a1](a0); -} - - -DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ - -DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ - -DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ - - -extern void (*D_80181790[])(void); - -void func_80131EEC(void *a0) { - D_80181790[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801817D8[])(void); - -void func_80131F28(void *a0) { - D_801817D8[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801817E0[])(void); - -void func_80131F64(void *a0) { - D_801817E0[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801817E8[])(void); - -void func_80131FA0(void *a0) { - D_801817E8[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801817F0[])(void); - -void func_80131FDC(void *a0) { - D_801817F0[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80132018); - -DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80181798; - -void func_801320D8(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80181798; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -s32 func_80132144(s32 param_1) -{ - extern int D_801817A8; - - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(((int)param_1) + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(((int)param_1)); - } else { - ((void(*)(int, int))func_8001C214)(v0, 0); - *(int *)(((int)param_1) + 0x58) = (int)&D_801817A8; - *(short *)(((int)param_1) + 0x5c) = 0x80; - *(unsigned short *)(((int)param_1) + 2) += 1; - } -} - - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_801817B8; - -void func_801321B0(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_801817B8; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_801817C8; - -void func_8013221C(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_801817C8; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - -DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ - -DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801325B8); - -DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ - -DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ - -DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ - -DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ - -DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ - -DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80132F40); - -DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801330E0); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80133298); - -DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ - -DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH - -extern s32 D_801A0F00; -extern s32 D_801A0F04[]; -extern int D_801A0F08; -extern void func_80136BC4(s32 a0); - -void func_801336E8(void *a0, int a1, int a2) { - if (a0 != 0) { - (*(void * *)&D_801A0F00) = a0; - ((void (*)(void))func_80136BC4)(); - } - (*(int *)&D_801A0F04) = a1; - D_801A0F08 = a2; -} - - - - -extern s32 D_801A0F04[]; -extern s32 D_801A0F00; -extern void func_80136BC4(s32); - -void func_8013373C(s16 arg0) { - s32 temp = D_801A0F04[arg0]; - if (temp != 0) { - D_801A0F00 = temp; - func_80136BC4(temp); - } -} - - -// @class: regalloc-order -#include "common.h" - -typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; - - -s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { - extern s32 func_80047D3C(s32); - extern s32 func_80133AB0(s16, s16, s16, s32); - extern Box_80133784 * D_801817F8; - extern Box_80133784 * D_801817FC; - extern s16 D_801A0F0C; - extern u16 D_801A0F10; - - register s32 s1 __asm__("$17"); - s32 s2; - register s16 s3 __asm__("$19"); - register s32 s4 __asm__("$20"); - register s16 a0v __asm__("$4"); - register s16 arg0s __asm__("$21"); - s32 dx, dy, dz; - s32 r, ret; - - a0v = ((s16)arg0); - s1 = 0; - s3 = 0; - s4 = 0; - s2 = 0; - arg0s = a0v; - D_801817F8->f6 = -0x7FFF; - D_801817FC->f6 = 0x7FFF; - D_801817F8->f0 = ((Box_80133784 *)arg1)->f0; - D_801817F8->f4 = ((Box_80133784 *)arg1)->f4; - D_801817FC->f0 = ((Box_80133784 *)arg2)->f0; - D_801817FC->f4 = ((Box_80133784 *)arg2)->f4; - D_801A0F10 = 0; - D_801A0F0C = 0; - - if ((s16)a0v == 0) { - s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; - s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; - s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; - if (sx == 0 && sy == 0) { - s32 zt = (sz == 0); - __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); - } - D_801817F8->f2 = ((Box_80133784 *)arg1)->f2 - 4; - r = func_80047D3C(sx * sx + sz * sz); - if (r < 3) { - r = 4; - } else if (r < 5) { - r += 1; - } - D_801817FC->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; - } else { - D_801817F8->f2 = ((Box_80133784 *)arg1)->f2; - if ((s16)a0v == 2) { - D_801817FC->f0 = D_801817F8->f0; - D_801817FC->f2 = D_801817F8->f2 + 6; - s2 = 1; - D_801817FC->f4 = D_801817F8->f4; - } else { - D_801817FC->f2 = ((Box_80133784 *)arg2)->f2; - } - } - - while (1) { - s32 ret0; - register s32 retc __asm__("$3"); - __asm__ __volatile__(""); - ret0 = func_80133AB0(arg0s, (s16)D_801817F8->f0, (s16)D_801817F8->f4, (*(s32*)&D_801A0F00)); - __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); - ret = retc; - if (ret == 0) goto after; - s4 |= ret; - if (s2 != 0) goto after; - { - s16 oldc = s3; - s3 = s3 + 1; - if (oldc >= 5) break; - } - } - - D_801817FC->f0 = D_801817F8->f0; - D_801817FC->f2 = D_801817F8->f2; - s1 = 0x2000; - D_801817FC->f4 = D_801817F8->f4; - goto store_out; - -after: - if ((s16)s4 != 0 || D_801A0F0C != 0) { - s16 t; - __asm__ __volatile__("" :: "r"(s4)); - t = D_801817F8->f6; - if (t >= -0xBCB) { - if (t < -0x578) { - s1 |= 0x4000; - } else { - s1 |= 0x8000; - } - } - if ((s16)D_801817FC->f6 < -0xBCB) { - s1 |= 0x2000; - } - store_out: - ((Box_80133784 *)arg2)->f0 = D_801817FC->f0; - ((Box_80133784 *)arg2)->f2 = D_801817FC->f2; - ((Box_80133784 *)arg2)->f4 = D_801817FC->f4; - ((Box_80133784 *)arg2)->f6 = D_801A0F10; - return s1 & 0xFFFF; - } - ((Box_80133784 *)arg2)->f6 = D_801A0F10; - return 0; -} - - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80133AB0); - - -s32 func_80133CD4(arg0, cmd, base, arr) - s16 arg0; - s16 *cmd; - s16 *base; - s32 *arr; -{ - typedef struct { s16 e[4]; } ElemK; - - extern u16 *D_801817FC; - extern u16 *D_801817F8; - extern s16 *D_80181804; - extern s16 *D_80181800; - extern s32 *D_8018180C; - extern s32 *D_80181810; - extern u16 D_801A0F10; - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern u16 D_801152AE; - extern u8 D_801152B0; - extern s32 func_80134310(); - extern s32 func_8013435C(); - - s16 *s3 = ((ElemK *)base)[cmd[1]].e; - s32 s6 = arr[cmd[2]]; - s32 s0var, s1var; - s32 s2a; - s16 y; - - if (func_80134310(s3, D_801817FC, s6) >= 0) - return 0; - - s1var = func_80134310(s3, D_801817F8, s6); - if (s1var < 0) - return 0; - - s0var = func_80134310(s3, D_80181804, 0); - { - u16 *pac = D_801817F8; - s16 *pb8 = D_80181804; - s16 *pb4 = D_80181800; - s32 neg = -s1var; - pb4[0] = pac[0] + neg * pb8[0] / s0var; - pb4[1] = pac[1] + neg * pb8[1] / s0var; - pb4[2] = pac[2] + neg * pb8[2] / s0var; - if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) - return 0; - } - if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80181800, arr[cmd[6]], s3)) - return 0; - if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80181800, arr[cmd[8]], s3)) - return 0; - if (arg0 < 0) { - if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80181800, arr[cmd[10]], s3)) - return 0; - } - if (arg0 & 0x10) { - if (*(u16 *)cmd & 0x100) - return 0; - } - if (*(u16 *)cmd & 0x200) { - D_801A0F10 = *(u16 *)cmd; - return 0; - } - - { - s32 ret = func_80134310(s3, D_801817FC, s6); - s32 *pc0; - s32 *pc4; - u16 *pb0; - s32 t, o2; - s32 q3v; - - { - s32 *pw = D_8018180C; - ((struct { s32 w; } *)pw)->w = s3[0]; - pw[1] = s3[1]; - pw[2] = s3[2]; - } - s1var = -ret; - - __asm__ __volatile__( - "lwc2 $9, 0(%0)\n" - "lwc2 $10, 4(%0)\n" - "lwc2 $11, 8(%0)\n" - "nop\n" - "nop\n" - "sqr 0\n" - : : "r"(D_8018180C) : "$9", "$10", "$11", "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"(D_80181810) : "memory"); - - pc0 = D_8018180C; - pc4 = D_80181810; - s0var = pc4[0] + pc4[1] + pc4[2]; - pb0 = D_801817FC; - pb0[0] += s1var * pc0[0] / s0var; - pb0[1] += s1var * pc0[1] / s0var; - q3v = s1var * pc0[2] / s0var; - - { - s32 h; - h = ((s16 *)pb0)[0]; - s1var = h << 16; - __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); - s0var = h << 16; - } - pb0[2] += q3v; - s2a = (s16)pb0[2] << 16; - - t = pc0[0] << 4; - pc0[0] = t; - if (t < 0) s1var |= 0xFFFF; - t = pc0[1] << 4; - pc0[1] = t; - if (t < 0) s0var |= 0xFFFF; - o2 = pc0[2]; - t = o2 << 4; - pc0[2] = t; - if (t < 0) s2a |= 0xFFFF; - s2a += o2 << 5; - s1var += pc0[0] << 1; - s0var += pc0[1] << 1; - - do { - s32 *pl = D_8018180C; - u16 *pb; - s1var += pl[0]; - s0var += pl[1]; - s2a += pl[2]; - pb = D_801817FC; - pb[0] = s1var >> 16; - pb[1] = s0var >> 16; - pb[2] = s2a >> 16; - ret = func_80134310(s3, pb, s6); - } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); - } - - y = s3[1]; - if (y >= -0xBCB) { - D_801817F8[3] = y; - { - typedef struct { s8 c[8]; } Blk8; - *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; - } - if (*(u8 *)cmd != 0) - goto ret1; - return -1; - } - { - typedef struct { u16 h; } H16; - u16 *s3u = (u16 *)s3; - u16 *bp = D_801817FC; - u16 w; - ((H16 *)D_801152A8)->h = s3u[0]; - w = s3u[1]; - bp[3] = w; - ((H16 *)&D_801152AA)->h = w; - ((H16 *)&D_801152AC)->h = s3u[2]; - ((H16 *)&D_801152AE)->h = s3u[3]; - } -ret1: - return 1; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80134310); - -DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (83 ins, relocation-masked) - - - -s32 func_801343C4(s32 angle, s32 p1, s32 p2) -{ - extern int func_80133AB0(int, s16, s16, int); - extern s16 * D_801817F8; - extern s16 * D_801817FC; - extern u16 D_801A0F10; - extern u16 D_801A0F0C; - - s16 *pac; - s16 *pb0; - s16 *pacs, *pb0s; - u16 *pb0u; - int a1v, a2v, d94, b0; - int sangle = ((s16)angle); - - pac = D_801817F8; - d94 = D_801A0F00; - pb0 = D_801817FC; - pac[0] = ((u16 *)p1)[0]; - pac[1] = ((u16 *)p1)[1]; - pac[2] = ((u16 *)p1)[2]; - pb0[0] = ((u16 *)p2)[0]; - pb0[1] = ((u16 *)p2)[1]; - pb0[2] = ((u16 *)p2)[2]; - - a1v = pac[0]; a2v = pac[2]; - __asm__ __volatile__("" ::: "memory"); - D_801A0F10 = 0; - D_801A0F0C = 0; - if (func_80133AB0(sangle, a1v, a2v, d94)) { - setdst: - pb0u = (u16 *)D_801817FC; - ((u16 *)p2)[0] = pb0u[0]; - ((u16 *)p2)[1] = pb0u[1]; - ((u16 *)p2)[2] = pb0u[2]; - ((u16 *)p2)[3] = D_801A0F10; - return 1; - } - - pacs = D_801817F8; - pb0s = D_801817FC; - b0 = pb0s[0]; - if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && - (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { - return 0; - } - if (func_80133AB0(sangle, b0, pb0s[2], D_801A0F00)) { - goto setdst; - } - return 0; -} - - - -// @class: schedule -typedef struct { - u16 f0; /* 0x0 */ - u16 f2; /* 0x2 */ - u16 f4; /* 0x4 */ - s16 f6; /* 0x6 */ -} Foo_80134510_80134510; - - -s32 func_80134510(s32 param) { - extern s32 func_801345F8(s32); - extern Foo_80134510_80134510 * D_801817F8; - extern Foo_80134510_80134510 * D_801817FC; - extern Foo_80134510_80134510 * D_80181800; - extern u16 D_801A0F10; - - - s32 ret = 0; - Foo_80134510_80134510 *b0 = D_801817FC; - Foo_80134510_80134510 *ac = D_801817F8; - u16 t0 = ((Foo_80134510_80134510 *)param)->f0; - u16 t2, t4; - - ((Foo_80134510_80134510 *)param)->f6 = 0; - ac->f0 = t0; - b0->f0 = t0; - t2 = ((Foo_80134510_80134510 *)param)->f2; - ac->f2 = t2 - 4; - b0->f2 = t2 + 0x2FC; - t4 = ((Foo_80134510_80134510 *)param)->f4; - ac->f4 = t4; - b0->f4 = t4; - - if (func_801345F8((*(s32*)&D_801A0F00)) != 0) { - s16 x; - ((Foo_80134510_80134510 *)param)->f2 = D_80181800->f2 - 2; - x = D_801817F8->f6; - if (x >= -3019) { - if (x < -1400) { - ret = 0x4000; - } else { - ret = 0x8000; - } - } else { - ret = 0x2000; - } - D_801817F8->f6 = D_801A0F10; - } - return ret; -} - - - -// @class: regalloc-order -// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. - - -s32 func_801345F8(s32 arg) -{ - extern int func_801347A0(short, u16 *, int, int); - extern u16 * D_801817F8; - extern u16 D_801A0F10; - - register u16 *param_1 __asm__("$5") = ((u16 *)arg); - register u16 *cc __asm__("$4") = D_801817F8; - int c8000 = 0x8000; - register int zr __asm__("$0"); - u32 c1, c2, uVar6, uVar2, cnt, v14; - u16 *ptmp, *puVar4, *puVar7, uVar1; - int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; - - c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; - uVar6 = c1 + zr; - if ((c1 & 0xffff) < (u32)param_1[2]) { - c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; - uVar2 = c2 + zr; - if ((c2 & 0xffff) < (u32)param_1[3]) - goto do_mult; - return 0; - found: - D_801A0F10 = *puVar7; - return 1; - do_mult: - tbl = *(int *)(param_1 + 4); - uVar10 = *(int *)(param_1 + 6); - uVar3 = *(int *)(param_1 + 8); - iVar9 = *(int *)(param_1 + 0xc); - iVar8 = *(int *)(param_1 + 0xe); - ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); - cnt = (u32)ptmp[1]; - v14 = *(int *)(param_1 + 10); - puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; - while (((cnt-- + zr) & 0xffff) != 0) { - uVar1 = *puVar4; - hi = uVar1 & 0x8000; - harg = hi + zr; - if (hi == 0) - puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); - else - puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); - if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) - goto found; - puVar4 = puVar4 - 1; - } - } - return 0; -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. -#include "common.h" - -typedef struct { - /* 0x00 */ u16 f0; - /* 0x02 */ s16 f2; - /* 0x04 */ s16 f4; - /* 0x06 */ s16 f6; - /* 0x08 */ s16 f8; - /* 0x0A */ s16 fa; - /* 0x0C */ s16 fc; - /* 0x0E */ s16 fe; - /* 0x10 */ s16 f10; - /* 0x12 */ s16 f12; - /* 0x14 */ s16 f14; -} S0_801347A0; - -typedef struct { - /* 0x0 */ s16 f0; - /* 0x2 */ s16 f2; - /* 0x4 */ s16 f4; - /* 0x6 */ s16 f6; -} Elem_801347A0; - -typedef struct { - /* 0x0 */ u16 f0; - /* 0x2 */ u16 f2; - /* 0x4 */ u16 f4; - /* 0x6 */ u16 f6; -} SVec_801347A0; - - - -s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); - extern s16 * D_801817FC; - extern SVec_801347A0 * D_801817F8; - extern SVec_801347A0 * D_80181800; - - Elem_801347A0 *pElem; - s32 val; - register s32 iv __asm__("$4"); - s32 q; - s32 dvsr; - - pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; - val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; - if (func_80134A28((s32)pElem, (s32)D_801817FC, val) >= 0) { - return 0; - } - iv = func_80134A28((s32)pElem, (s32)D_801817F8, val); - if (iv < 0) { - return 0; - } - iv = -iv; - dvsr = pElem->f2 * 48; - q = (iv * 48) / dvsr; - D_80181800->f0 = D_801817F8->f0; - D_80181800->f2 = D_801817F8->f2 + q; - D_80181800->f4 = D_801817F8->f4; - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { - return 0; - } - if ((s16)arg0) { - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { - return 0; - } - } - if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { - return 0; - } - D_80181800->f0 = D_801817F8->f0; - D_80181800->f4 = D_801817F8->f4; - (*(Elem_801347A0*)D_801152A8) = *pElem; - D_801817F8->f6 = pElem->f2; - return 1; -} - - - -DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80134A74); - -// @class: regalloc-order -// @try: variant B — direct pins m=$s5($21), c=$s6($22) - - -s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); - extern void * D_801817F8; - extern void * D_801817FC; - extern void * D_80181800; - extern void * D_80181804; - extern u16 D_801A0F10; - - s32 temp_a3; - s32 temp_s1; - s32 temp_v0; - s32 temp_v0_2; - s32 var_v0; - u16 temp_a1; - s32 temp_s4; - s32 c = arg0; - __asm__ __volatile__("" : "=r"(c) : "0"(c)); - __asm__ __volatile__("" : : "r"(arg0)); - - temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); - temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); - var_v0 = 0; - if (func_80134FB8(temp_s4, (s32) D_801817FC, temp_s1) >= 0) { - return var_v0; - } - temp_v0 = func_80134FB8(temp_s4, (s32) D_801817F8, temp_s1); - if (temp_v0 < 0) { - goto block_13; - } - temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80181804, 0); - temp_a3 = -temp_v0; - { - u16 *pB4 = (u16 *)D_80181800; - u16 *pAC = (u16 *)D_801817F8; - s16 *pB8 = (s16 *)D_80181804; - pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; - pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; - pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { - return var_v0; - } - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80181800, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { - return var_v0; - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80181800, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { - return var_v0; - } - if ((arg0 << 16) < 0) { - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80181800, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { - return var_v0; - } - } - if (c & 1) { - if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { - goto block_14; - } - return 0; - } - temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); - if (!(temp_a1 & 0x200)) { - goto block_14; - } - D_801A0F10 = temp_a1; -block_13: - return 0; -block_14: - __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); - VectorNormalSS(D_80181804, D_80181804); - { - u16 *pB8 = (u16 *)D_80181804; - u16 *pB4b = (u16 *)D_80181800; - pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); - var_v0 = 1; - pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); - pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); - } - return var_v0; -} - - - -DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ - -// @class: plumbing -// @stuck: MATCH (89 ins). To BANK: retype D_801817FC + D_801817F8 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). - - - - -s32 func_80135004(s32 arg0, s32 p1, s32 p2) -{ - extern int func_80134A74(int, s16, s16, int); - extern s16 * D_801817FC; - extern s16 * D_801817F8; - extern u8 D_80181804; - extern s16 *D_80181800; - extern u16 D_801A0F10; - - register s16 *pb0 __asm__("$9"); /* D_801817FC -> $t1 */ - register s16 *pac __asm__("$6"); /* D_801817F8 -> $a2 */ - register s16 *pb8 __asm__("$8"); /* D_80181804 -> $t0 */ - u16 *pb4; - u16 a, b; - int id; - int a1v, a2v, d94; - - pb0 = D_801817FC; - __asm__ __volatile__("" : : "r"(pb0)); - - a = ((u16 *)p2)[0]; pac = D_801817F8; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80181804); pac[0] = b; pb8[0] = a - b; - a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; - a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; - - id = ((int)arg0) & 0xFFFF; - a1v = pac[0]; a2v = pac[2]; d94 = D_801A0F00; - __asm__ __volatile__("" ::: "memory"); - D_801A0F10 = 0; - - if (func_80134A74(id, a1v, a2v, d94)) { - found: - pb4 = (*(u16 * *)&D_80181800); - ((u16 *)p2)[0] = pb4[0]; - ((u16 *)p2)[1] = pb4[1]; - ((u16 *)p2)[2] = pb4[2]; - ((u16 *)p2)[3] = D_801A0F10; - return 1; - } - { - register u16 *qb __asm__("$4"); /* D_801817F8 -> $a0 (reloaded) */ - register int qa0 __asm__("$5"); /* D_801817FC[0], kept in $a1 for the 2nd-call arg */ - register u16 *qa __asm__("$6"); /* D_801817FC -> $a2 (reloaded) */ - qb = (u16 *)D_801817F8; - qa = (u16 *)D_801817FC; - qa0 = qa[0]; - if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && - ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) - return 0; - if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801A0F00)) - goto found; - return 0; - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (62 ins, relocation-masked) - - -extern u8 D_801817FC; -extern u8 D_801817F8; -extern s16 *D_80181800; -extern u8 D_80181804; -extern int D_801A0F00; -extern u16 D_801A0F10; - -extern int func_80134A74(int, s16, s16, int); - -int func_80135168(u16 arg0, u16 *p1, u16 *p2) -{ - register s16 *pb0 __asm__("$8"); - register s16 *pac __asm__("$6"); - register s16 *pb8 __asm__("$7"); - u16 *pb4; - u16 a, b; - int a1v, a2v, d94; - - pb0 = (*(s16 * *)&D_801817FC); - __asm__ __volatile__("" : : "r"(pb0)); - - a = p2[0]; pac = (*(s16 * *)&D_801817F8); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80181804); pac[0] = b; pb8[0] = a - b; - a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; - a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; - - a1v = pac[0]; a2v = pac[2]; d94 = D_801A0F00; - __asm__ __volatile__("" ::: "memory"); - D_801A0F10 = 0; - if (func_80134A74(arg0, a1v, a2v, d94)) { - pb4 = (*(u16 * *)&D_80181800); - p2[0] = pb4[0]; - p2[1] = pb4[1]; - p2[2] = pb4[2]; - p2[3] = D_801A0F10; - return 1; - } - return 0; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80135260); - - -/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). - * - * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 - * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does - * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in - * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). - * - * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): - * the two output buffers D_801817F8 / D_801817FC are written through a pointer in each of the two - * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a - * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also - * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each - * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks - * the lowest-free scratch over its OWN window: - * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) - * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) - * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail - * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. - * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades - * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the - * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. - * - * Zero file-scope footprint (block-scoped typedefs + externs; D_801817F8/B0 read via the ambient - * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for - * family_sweep --edit-remap with no cc1 crash. - * - * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. - */ -s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) -{ - typedef struct { s32 vx, vy, vz, pad; } Vec32; - typedef struct { s16 vx, vy, vz, pad; } Vec16; - typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; - extern void func_80048EAC(void *m0, void *m1); - extern void func_8004914C(void *m); - extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); - extern void ApplyRotMatrixLV(void *in, void *out); - extern void ApplyRotMatrix(void *in, void *out); - extern s32 D_801A0F14, D_801A0F18, D_801A0F1C, D_801A0F20; - extern s16 D_801A0F24; - extern s32 D_801A0F34; - extern s16 D_801A0F38, D_801A0F3A, D_801A0F3C, D_801A0F3E, D_801A0F40, D_801A0F42; - - Vec32 in0, in1, rotout; - Mat32 mat2; - Vec16 vecin; - s32 result; - s32 mode; - s32 q1, q2; - s32 p; - s32 t18, t1A, t1C; - s32 *m; - - in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); - in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); - if ((param_2 & 0x10000000) == 0) { - if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { - return 0; - } - } - mode = param_2 & 0x60000000; - if (mode != 0) { - result = 1; - if (param_2 >= 0) { - mode &= 0x40000000; - } - in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); - in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); - switch (mode) { - case 0x60000000: - m = &D_801A0F14; - *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); - q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); - q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); - D_801A0F18 = 0; - D_801A0F20 = 0; - D_801A0F1C = q1; - D_801A0F24 = q2; - func_80048EAC((void *)((s32)param_1 + 0x34), m); - ApplyTransposeMatrixLV(m, &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - /* fallthrough */ - case 0x20000000: - p = (param_2 & 0xFFFFFFF) | 0x80000000; - t18 = *(s16 *)((s32)param_1 + 0x18); - t1A = *(s16 *)((s32)param_1 + 0x1A); - t1C = *(u16 *)((s32)param_1 + 0x1C); - mat2.w4 = 0; - mat2.wC = 0; - mat2.w0 = t18; - mat2.w8 = t1A; - mat2.h10 = t1C; - func_8004914C(&mat2); - vecin.vx = *(u16 *)(p + 4); - vecin.vy = *(u16 *)(p + 8); - vecin.vz = *(u16 *)(p + 0xC); - ApplyRotMatrix(&vecin, &rotout); - D_801A0F38 = rotout.vx; - D_801A0F3C = rotout.vy; - D_801A0F40 = rotout.vz; - vecin.vx = *(u16 *)(p + 6); - vecin.vy = *(u16 *)(p + 0xA); - vecin.vz = *(u16 *)(p + 0xE); - ApplyRotMatrix(&vecin, &rotout); - D_801A0F34 = 0; - D_801A0F3A = rotout.vx; - D_801A0F3E = rotout.vy; - D_801A0F42 = rotout.vz; - result += 2; - break; - case 0x40000000: - ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - break; - } - { - s16 *p = *(s16 **)&D_801817F8; - p[0] = in0.vx; - p[1] = in0.vy; - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_801817FC; - p[0] = in1.vx; - p[1] = in1.vy; - p[2] = in1.vz; - } - return result; - } - { - s16 *p = *(s16 **)&D_801817F8; - p[0] = in0.vx; - p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_801817FC; - p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); - p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); - } - return 1; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80135888); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80135A4C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80135D20); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80135EB0); - - -s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - register s32 a1v __asm__("$11"); - register s32 a2v __asm__("$12"); - register s32 n __asm__("$5"); - register s16 *b4 __asm__("$7"); - s32 d; - s32 dx; - s32 denom; - s32 result; - s32 frame_pad[2]; - (void)&frame_pad; - __asm__("" : "=r"(a1v) : "0"(arg1)); - a2v = arg2; - - if (!(arg1 & 1)) { - dx = (s16) arg2 - (*(s16 **)&D_801817F8)[2]; - d = dx; - denom = -(*(s16 **)&D_80181804)[2]; - } else { - denom = (*(s16 **)&D_80181804)[2]; - d = (*(s16 **)&D_801817F8)[2] - (s16) arg2; - dx = -d; - } - n = -d; - { - register s16 *b8 __asm__("$6") = *(s16 **)&D_80181804; - u16 *ac = *(u16 **)&D_801817F8; - b4 = D_80181800; - b4[0] = ac[0] + n * b8[0] / denom; - b4[1] = ac[1] + n * b8[1] / denom; - b4[2] = ac[2] + dx; - } - - if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; - if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; - if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; - if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; - if (a1v & 0x8000) { - u16 *b0 = *(u16 **)&D_801817FC; - b4[0] = b0[0]; - b4[1] = b0[1]; - } - D_801152AA = 0; - (*(s16 *)D_801152A8) = 0; - if (a1v & 1) { - D_80181800[2] = a2v + 2; - __asm__ __volatile__(""); - D_801152AC = 0xFFF; - } else { - D_801152AC = -0xFFF; - D_80181800[2] = a2v - 2; - } - __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); - (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; - D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; - result = 1; - D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; - return result; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801365B8); - - -// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) -// D_801817F8/B0/B8 are file-scope `extern u8`, D_80181800 is `extern s32 []`; each HOLDS a -// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. -// D_80181800 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the -// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar -// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the -// siblings read it once via *(u16**)&sym == direct lw either way). - -s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - - register u16 *ac __asm__("$4"); - register s16 *b8 __asm__("$6"); - register s16 *b4 __asm__("$9"); - register s32 r __asm__("$3"); - register s32 pos __asm__("$12"); - register s32 a1v __asm__("$5"); - s16 temp_v0; - s16 temp_v1; - s32 var_a3; - s16 var_v0_3; - s32 temp_a1; - s32 var_t0; - s32 var_v1; - s16 *b4b; - u16 *p; - - __asm__ ("" : "=r"(a1v) : "0"(arg1)); - pos = arg2; - if (!(a1v & 1)) { - var_t0 = (s16) arg2 - (*(s16 **)&D_801817F8)[1]; - var_v1 = var_t0; - var_a3 = -(*(s16 **)&D_80181804)[1]; - } else { - var_a3 = (*(s16 **)&D_80181804)[1]; - var_v1 = (*(s16 **)&D_801817F8)[1] - (s16) arg2; - var_t0 = -var_v1; - } - b8 = (*(s16 **)&D_80181804); - ac = (*(u16 **)&D_801817F8); - b4 = D_80181800; - temp_a1 = -var_v1; - r = (temp_a1 * b8[0]) / var_a3; - b4[0] = ac[0] + r; - b4[1] = ac[1] + var_t0; - r = (temp_a1 * b8[2]) / var_a3; - temp_v0 = ac[2] + r; - b4[2] = temp_v0; - temp_v1 = b4[0]; - if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { - return 0; - } - if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { - return 0; - } - if (arg1 & 0x8000) { - p = (*(u16 **)&D_801817FC); - b4[0] = (s16) p[0]; - b4[2] = (s16) p[2]; - } - D_801152AC = 0; - (*(s16 *)D_801152A8) = 0; - if (arg1 & 1) { - b4b = D_80181800; - D_801152AA = 0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos + 2; - } else { - b4b = D_80181800; - D_801152AA = -0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos - 2; - } - b4b[1] = var_v0_3; - __asm__ __volatile__("" :: "r"(pos)); - (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); - D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); - D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); - return 1; -} - - -// @class: schedule -// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a -// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE -// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses -// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] -// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the -// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; -// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits -// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the -// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). - - -extern s16 *D_80181800; /* holds a pointer value (*(u16**)&D_80181800) */ - -s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { - extern void ApplyMatrixSV(void *m, void *v0, void *v1); - extern void ApplyRotMatrix(void *v0, void *v1); - extern u16 D_80126722; - extern s16 D_80126724; - extern s16 D_801152AA; - extern s16 D_801152AC; - - s32 out[4]; - u16 *pb4; - - if (a0) { - ApplyMatrixSV((void *)a3, *(void **)&D_80181800, *(void **)&D_80181800); - ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); - ApplyRotMatrix((void *)D_801152A8, (void *)out); - *(s16 *)D_801152A8 = out[0]; - D_801152AA = out[1]; - D_801152AC = out[2]; - } - - pb4 = *(u16 **)&D_80181800; - *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); - *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); - *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); - - *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); - D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); - D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); -} - - - -DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ - -DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ - -DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ - -DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ - -DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ - - -extern unsigned short D_800B99F0; -extern void (*D_80181814[])(void); - -void func_80136C54(void) -{ - D_80181814[D_800B99F0](); -} - - -// @class: struct -// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_8019FF28 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). - -typedef struct { char s[10]; } S10_80136C90; - -s32 func_80136C90() -{ - extern void func_8001534C(int, void *, int, int, int, int); - extern S10_80136C90 D_8019FF28; - - S10_80136C90 buf = D_8019FF28; - func_8001534C(0, &buf, 0x78, 0x10, 0, 0); -} - - - -DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ - -DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80136DFC); - -DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ - -DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80136F3C); - -DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80137178); - -DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ - -DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80137614); - -DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ - -DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801376E8); - -DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ - -DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801378F0); - -DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ - -DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801379FC); - - -// @class: remat -// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer -extern s32 D_80127548[]; -extern int D_80181868; -extern int D_801269F0; -extern void func_80138BE0(int p); - -void func_80137B80(void) { - int *p = &D_801269F0; - (*(int *)&D_80127548) = 0x24; - if (*p != 0) { - ((void (*)(int *))func_80138BE0)(p); - } - D_80181868 += 1; -} - - -DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. - -extern unsigned char D_80126A0E; -extern short D_80126A0A; -extern s16 D_801269F4; -extern int D_800A5E60; -extern int D_80181868; -extern int D_801269F0; - -extern void func_801392FC(); -extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); -extern void func_80139680(s32 a0, u8 *a1); - -int func_80137D08(int arg0, int arg1, short arg2) -{ - unsigned char buf[3]; - - D_800A5E60 = arg0; - D_80126A0A = arg2; - ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); - if ((*(short *)&D_801269F4) == 7) { - buf[0] = 0x39; - buf[1] = 0xFF; - buf[2] = 0x71; - ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); - } else if ((*(short *)&D_801269F4) == 3) { - if (D_80181868 & 4) { - ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); - } - } - return D_800A5E60; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80137DD4); - -DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018186C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018186C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801818B0; -extern u8 D_801818F4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801818B0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801818F4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181938[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80181974[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80181974; - if (((s16)a1) < 0xC00) { - tbl = D_80181938; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801819B0, D_801819B2, D_801819B4, D_801819B6, D_801819B8, D_801819BA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801819B2 < ang)) goto outer_else; - if (!(ang < D_801819B8)) goto inner_else; - if (ang < D_801819B4) { *(s16 *)L = D_801819B4; goto done; } - if (D_801819B6 < ang) { *(s16 *)L = D_801819B6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801819B0) { *(s16 *)L = D_801819B0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801819BA < ang) { *(s16 *)L = D_801819BA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A0F78; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A0F78, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A0F78; -extern s8 D_801A0F7C; -extern s8 D_801A0F7D; - -void func_8013C9C4(void * arg0) -{ - D_801A0F78 = arg0; - D_801A0F7C = 0; - D_801A0F7D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A0F78; -extern s8 D_801A0F7C; -extern s8 D_801A0F7D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A0F78; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A0F7D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A0F7C)) * 2) + D_801A0F78); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A0F7D = (unsigned char) p[1]; - D_801A0F7C = D_801A0F7C + 1; - if (D_801A0F7D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A0F7C = 0; - *base = 0; - } - } - else - { - D_801A0F7D = c - 1; - } - } - return; -} - - - -extern s32 D_801A0F9C; -extern s32 D_801A0F90; -extern s32 D_801A0F94; -extern s32 D_801A0FA0; - -void func_8013CABC(void) { - D_801A0F9C = 1; - D_801A0F90 = 1; - D_801A0F94 = 0; - D_801A0FA0 = 1; -} - - - -extern s32 D_801A0F90; -extern s32 D_801A0F94; -extern s32 D_801A0F98; -extern s32 D_801A0F9C; -extern s32 D_801A0FA0; - -void func_8013CAE8(void) { - D_801A0F90 = 1; - D_801A0F9C = 0; - D_801A0F94 = 0; - D_801A0F98 = -1; - D_801A0FA0 = 0; -} - - - -extern s32 D_801A0F9C; -extern s32 D_801A0FA0; -extern s32 D_801A0FC8; -extern s32 D_801A0FCC; - -void func_8013CB20(void) -{ - D_801A0FC8 = D_801A0FA0; - D_801A0FCC = D_801A0F9C; - D_801A0FA0 = 1; - D_801A0F9C = 0; -} - - - -extern s32 D_801A0FC8; -extern s32 D_801A0FCC; -extern s32 D_801A0FA0; -extern s32 D_801A0F9C; - -void func_8013CB5C(void) { - D_801A0FA0 = D_801A0FC8; - D_801A0F9C = D_801A0FCC; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A22A8; - extern u8 D_801A22A9; - extern u8 D_801A22AA; - extern u8 D_801A22AB; - extern u8 D_801A22AC; - extern u8 D_801A22AD; - extern u8 D_801A22AE; - extern u8 D_801A22AF; - extern u8 D_801A22B0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A22A8; t1 = D_801A22A9; t2 = D_801A22AA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A22AB; t1 = D_801A22AC; t2 = D_801A22AD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A22AE; t1 = D_801A22AF; t2 = D_801A22B0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A0FA8; -extern s32 D_801A0F90; -extern s32 D_801A0FAC; -extern s32 D_801A0F9C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A0FA8 != 0) { - if (D_801A0FA8 != 2) { - if (((D_801A0FA8 < 3) && (D_801A0FA8 == 1)) && - (D_801A0FAC = D_801A0FAC + 1, 0x23a < D_801A0FAC)) { - D_801A0F90 = D_801A0FA8; - D_801A0FA8 = 2; - } - } else { - D_801A0F90 = D_801A0F90 + -1; - if (D_801A0F90 == 0) { - D_801A0F90 = D_801A0FA8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A0F9C == 0) { - D_801A0FA8 = D_801A0FA8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A0F9C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A0F9C; -} - - - -extern s32 D_801A0FA8; - -void func_8013D164(void) { - D_801A0FA8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A238A; -extern u8 D_801A2402; -extern u8 D_801A22B2; -extern u8 D_801A236C; -extern u8 D_801A2290; -extern u8 D_801A22B1; -extern s32 D_801A2370; - -void func_8013D330(void) { - if ((D_801A238A & 0xff) != D_801A2402) { - D_801A238A = ((D_801A238A & 0xff) < D_801A2402) ? (D_801A238A + 1) : (D_801A238A - 1); - } - if ((D_801A22B2 & 0xff) != D_801A236C) { - D_801A22B2 = ((D_801A22B2 & 0xff) < D_801A236C) ? (D_801A22B2 + 1) : (D_801A22B2 - 1); - } - if ((D_801A2290 & 0xff) != D_801A22B1) { - D_801A2290 = ((D_801A2290 & 0xff) < D_801A22B1) ? (D_801A2290 + 1) : (D_801A2290 - 1); - } - D_801A2370 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A0F80; -extern void *D_801A0F84; -extern void *D_801A0F88; -extern s32 D_801A0FB0; -extern s32 D_801A0FB4; -extern s32 D_801A0FB8; -extern s32 D_801A22E4[]; - -extern u8 D_80181AA8[]; -extern u8 D_80181B50[]; -extern u8 D_80181A00[]; -extern u8 D_80181AFC[]; -extern u8 D_80181B7C[]; -extern u8 D_80181A54[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A0FB0 = param_2; - D_801A0FB4 = (param_2 >> 2) & 3; - D_801A0FB8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A0F80 = D_80181AA8; - D_801A0F84 = D_80181B50; - D_801A0F88 = D_80181A00; - } else { - D_801A0F80 = D_80181AFC; - D_801A0F84 = D_80181B7C; - D_801A0F88 = D_80181A54; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A0FB8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A0FB0 & 2) != 0) { - D_801A22E4[0] = 0x140; - D_801A22E4[3] = 0x80; - if (p[0x37] == 4) { - D_801A22E4[0] = 0x140; - D_801A22E4[3] = 0; - } - if (p[0x37] == 0) { - D_801A22E4[0] = 0x140; - D_801A22E4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A0F88)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A0F88; -extern s16 *D_801A0F8C; -extern s32 D_801A0F9C; -extern s32 D_801A0FBC; -extern s32 D_801A0FC0; -extern s32 D_801A0FC4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A0F8C != 0) { - D_801A0F9C = 0; - p = (int *)(param_1 * 12 + (int)D_801A0F88); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A0FBC != x) { - flag = 1; - if (D_801A0FBC < x) { - if (x - D_801A0FBC < 5) { - D_801A0FBC = x; - } else { - D_801A0FBC = D_801A0FBC + 4; - } - } else { - if (D_801A0FBC - x < 5) { - D_801A0FBC = x; - } else { - D_801A0FBC = D_801A0FBC - 4; - } - } - } - if (D_801A0FC0 != y) { - flag = 1; - if (D_801A0FC0 < y) { - if (y - D_801A0FC0 < 5) { - D_801A0FC0 = y; - } else { - D_801A0FC0 = D_801A0FC0 + 4; - } - } else { - if (D_801A0FC0 - y < 5) { - D_801A0FC0 = y; - } else { - D_801A0FC0 = D_801A0FC0 - 4; - } - } - } - if (D_801A0FC4 != z) { - flag = 1; - if (D_801A0FC4 < z) { - if (z - D_801A0FC4 < 5) { - D_801A0FC4 = z; - } else { - D_801A0FC4 = D_801A0FC4 + 4; - } - } else { - if (D_801A0FC4 - z < 5) { - D_801A0FC4 = z; - } else { - D_801A0FC4 = D_801A0FC4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A0F9C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80181C0C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A0F8C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A0FBC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0FC0); - uVar5 = (*(int*)&D_801A0FC4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80181C0C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A0FA4; - -s32 func_8013E054(void) { - return D_801A0FA4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80182608; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801825E0; -extern s16 D_801825E2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80182608; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801825E0 = 2; - D_801825E2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801825E2 = 0; - D_801825E0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A0FD8; - extern void * D_801A0FDC; - extern unsigned char D_80182280; - extern unsigned char D_80182298; - extern unsigned char D_8018230C; - extern unsigned char D_80182314; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A0FD8 = &D_80182280; - D_801A0FDC = &D_8018230C; - } else { - D_801A0FD8 = &D_80182298; - D_801A0FDC = &D_80182314; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80182608/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80182608 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80182608)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801825E4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801825E4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801825E4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801825E0; -extern s16 D_801825E2; -extern unsigned char D_801825E4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801825E2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801825E0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801825E2; - if (*r < 3) { - *r = *r + 1; - } - D_801825E0 = (u16)D_801825E0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801825E4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801825E4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801825E4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013FAF8); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8013FFD8); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8014032C); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80140608); - - -// @class: iv-combine -// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source -// pointer compile to fixed offsets when written base[0..n]; the target advances -// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead -// final increment, yielding the "increment N-2 then offset 0/2" tail). - -extern u8 *D_801822C0; -extern u8 *D_801822C4; -extern u8 *D_801822C8; -extern u8 *D_801822CC; -extern u8 *D_801822D0; -extern u16 *D_801822D4[]; -extern u16 *D_801822DC[]; -extern u16 *D_801822FC[]; - -extern s32 func_80028D58(void); -extern s32 func_80028DE0(void); -extern s32 func_80028FBC(void); -extern s32 func_80029000(void); -extern s32 func_80028D9C(void); - -void func_801407F4(void) -{ - u8 *puVar1; - s32 iVar2; - u16 *puVar3; - - puVar1 = D_801822C0; - iVar2 = func_80028D58(); - puVar3 = D_801822D4[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - puVar1 = D_801822C4; - iVar2 = func_80028DE0(); - puVar3 = D_801822D4[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - iVar2 = func_80028FBC(); - *(s16 *)(D_801822C8 + 0x18) = *D_801822DC[iVar2]; - iVar2 = func_80029000(); - *(s16 *)(D_801822CC + 0x18) = *D_801822DC[iVar2]; - - puVar1 = D_801822D0; - iVar2 = func_80028D9C(); - puVar3 = D_801822FC[iVar2]; - *(s16 *)(puVar1 + 0x12) = *puVar3++; - *(s16 *)(puVar1 + 0x14) = *puVar3++; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - *(s16 *)(puVar1 + 0x1c) = *puVar3++; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80140958); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80140D68); - - -// @class: struct -// @stuck: none — MATCH - -extern unsigned char D_80078E7F; -extern unsigned char D_80078E7E; -extern unsigned char D_80078E7D; -extern M2C_UNK D_801821FC; - -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); - -void func_80140E6C(void) { - void *puVar1; - unsigned int uVar2; - unsigned int uVar3; - unsigned int uVar4; - - puVar1 = (*(void * *)&D_801821FC); - uVar2 = func_800D2CA8(D_80078E7F, 0x18); - uVar3 = func_800D2CA8(D_80078E7E, 0xc); - uVar4 = func_800D2CA8(D_80078E7D, 0); - func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); -} - - - - -// @class: plumbing -// @stuck: none — MATCH (128/128 ins, match_one confirmed) - -extern short D_80115128; -extern u8 D_8018220C; -extern char *D_8018222C; -extern char *D_80182230; -extern char *D_80182234; -extern char *D_80182238; -extern char *D_8018223C; - -extern int func_80029FE4(void); -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); -extern char *func_8002AAB4(void); -extern char *strcpy(char *, const char *); -extern int func_8002A26C(void); -extern int func_8002A2B0(void); -extern int func_8002A4B8(void); -extern s32 func_8002A4FC(s32 a0); -extern int func_8002A998(void); -extern int func_8002A9DC(void); -extern int func_8002A728(void); -extern int func_8002A76C(void); -extern int func_80029FD4(void); - -void func_80140F00(void) { - char *p; - int r; - - if (D_80115128 == 0) { - p = (*(char * *)&D_8018220C); - r = func_800D2CA8(func_80029FE4() + 1, 0x18); - func_800D2D10(r, 2, p + 4, 1); - strcpy(p + 0xA, func_8002AAB4()); - - p = D_8018222C; - r = func_800D2CA8(func_8002A26C() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A2B0(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182230; - r = func_800D2CA8(func_8002A4B8() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182234; - r = func_800D2CA8(func_8002A998() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A9DC(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182238; - r = func_800D2CA8(func_8002A728() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A76C(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_8018223C; - r = func_800D2CA8(func_80029FD4(), 4); - func_800D2D10(r, 7, p + 0x18, -1); - } -} - - - -// @class: other -// @stuck: none — MATCH - -extern short D_80115128; -extern unsigned short D_80115172; -extern unsigned short D_801820C6; -extern unsigned short D_801820CA; -extern unsigned short D_801820CE; -extern unsigned short D_801820D2; - -extern s32 func_8002A1B4(void); -extern short func_8002A28C(void); -extern short func_8002A27C(void); -extern s32 func_8002A400(void); -extern short func_8002A4D8(void); -extern short func_8002A4C8(void); -extern s32 func_8002A8E0(void); -extern short func_8002A9B8(void); -extern short func_8002A9A8(void); -extern s32 func_8002A670(void); -extern short func_8002A748(void); -extern short func_8002A738(void); -extern int func_801412A8(int, int, int, int, int, int); - -int func_80141100(int param_1) -{ - short sVar1; - int iVar7; - - if (D_80115128 == 0) { - iVar7 = D_80115172 + 0x31; - sVar1 = D_801820C6; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); - sVar1 = D_801820CA; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); - sVar1 = D_801820CE; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); - sVar1 = D_801820D2; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); - } - return param_1; -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801412A8); - -DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ - -DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ - -DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ - - -extern unsigned short D_80115112; -extern void (*D_8018265C[])(void); - -void func_80141788(void) -{ - D_8018265C[D_80115112](); -} - - -DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ - -DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80141874); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801418F8); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80141A60); - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80141B90); - -DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) - -extern u16 D_80115110; -extern u8 D_801825BC; -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80141C0C(s32 param_1) -{ - func_8002D4C8(*(u16 *)(&D_801825BC + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); -} - - -DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ - -DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ - -DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ - -DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_801424E4); - - -extern void (*D_8018269C[])(void); - -void func_801425CC(void *a0) { - D_8018269C[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: schedule -// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail - -extern void func_8012C1B8(void); -extern s32 func_8012C1DC(s32 a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012CAE4(void *a0); -extern s32 func_8012AD50(void *a0); -extern s32 D_80182680; - -void func_80142608(s32 param_1) -{ - register s32 iVar1 __asm__("$16"); - - if (*(short *)(param_1 + 0x70) != 0) { - iVar1 = ((s32 (*)(void))func_8012C1B8)(); - } else { - iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); - } - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CA1C(iVar1, (s32)&D_80182680); - *(short *)(iVar1 + 0x1a) = 0x200; - *(short *)(iVar1 + 0x18) = 0x200; - *(short *)(param_1 + 0xfc) = 0x40; - if (*(short *)(param_1 + 0x70) != 0) { - goto ad50; - } - if (*(s32 *)(param_1 + 100) != 0) { - *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); - goto ad50; - } - } - ((void (*)(s32))func_8012CAE4)(param_1); - return; -ad50: - *(short *)(param_1 + 0x98) = 0; - *(s32 *)(param_1 + 0x90) = 0; - ((void (*)(s32))func_8012AD50)(param_1); -} - - -DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ - -DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ - -DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ - -DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ - -DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801826B0[])(); - -void func_801427EC(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801826B0[*(u16 *)(param_1 + 2)](); - } -} - - -DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ - -DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801826CC[])(); - -void func_8014292C(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801826CC[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_8018289C[])(); - -void func_80142978(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_8018289C[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80182954[])(); - -void func_801429C4(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80182954[*(u16 *)(param_1 + 2)](); - } -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80142A10); - - -// @class: struct -// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) - -extern u16 D_800B99D8; -extern struct packed_word D_801A0664; -extern u8 D_801A0FE0; -extern u8 D_801A0FE1; -extern u8 D_801A0FE2; - -void func_80142A80(void) -{ - u16 flags; - union word_bytes local; - s32 mul; - - flags = D_800B99D8; - local.pw = D_801A0664; - - if (flags & 0x10) { - mul = (s8)((flags & 0xf) >> 1) + 9; - } else { - mul = 0x10 - (s8)((flags & 0xf) >> 1); - } - - D_801A0FE0 = mul * (local.b[0] >> 4); - D_801A0FE1 = mul * (local.b[1] >> 4); - D_801A0FE2 = mul * (local.b[2] >> 4); -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80142B2C); - -DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ - -DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ - -DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ - -DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ - -DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ - -DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern int D_801826A4; - -void func_80142DC4(int param_1) -{ - int v0; - - *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_801826A4); - *(short *)(v0 + 0x1a) = 0x1800; - *(short *)(v0 + 0x18) = 0x1800; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_801826C0[]; - -void func_80142E38(int param_1) -{ - short sVar1; - int iVar2; - - *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_801826C0); - sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; - *(short *)(iVar2 + 0x1a) = sVar1; - *(short *)(iVar2 + 0x18) = sVar1; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80142EC0); - -DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ - -DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result -// survives across func_8001CA1C while $v0 serves the pre-call store/test; -// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_801828AC[]; -extern unsigned char D_8018290C[]; - -void func_8014305C(int param_1) -{ - register int s0_param __asm__("$16") = param_1; - register int s1_copy __asm__("$17"); - int iVar2; - short sVar1; - - iVar2 = ((int (*)(void))func_8012C1B8)(); - *(int *)(s0_param + 0x20) = iVar2; - s1_copy = iVar2; - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(s0_param); - } else { - ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_801828AC); - sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; - *(short *)(s1_copy + 0x1a) = sVar1; - *(short *)(s1_copy + 0x18) = sVar1; - *(short *)(s0_param + 0xfc) = 0; - func_8012A828(s0_param, D_8018290C); - ((void (*)(int))func_80142B2C)(s0_param); - } -} - - -DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ - -DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) - - -extern void *memcpy(void *, const void *, u32); - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern int func_8001CA88(int, void *); -extern s32 func_8012E504(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80142B2C(void *arg0); - -extern u8 D_801A0660; -extern u8 D_801A0FE0; -extern u8 D_801A0FE4; - -void func_801431E8(s32 param_1) { - u8 buf[8]; - s32 iVar5; - u16 uVar2; - s16 sVar4; - - register s32 d __asm__("$16"); - memcpy(buf, &D_801A0660, 4); - iVar5 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = iVar5; - d = iVar5; - if (iVar5 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, void *))func_8001CA88)(d, &D_801A0FE0); - uVar2 = *(u16 *)(param_1 + 0x70); - *(s16 *)(d + 0x76) = -0x10; - sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; - *(s16 *)(d + 0x1a) = sVar4; - *(s16 *)(d + 0x18) = sVar4; - *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; - if (func_8012E504(param_1, 0x33) == 0) { - *(s16 *)(param_1 + 0xfc) = 1; - func_800233CC(&D_801A0FE0, 0x10); - memcpy(&D_801A0FE4, buf, 4); - } else { - *(s16 *)(param_1 + 0xfc) = 0; - } - ((void (*)(s32))func_80142B2C)(param_1); - } -} - - -DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ - -DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ - -DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) - -extern u8 D_800D387C[]; -extern u32 D_80182A64[]; - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80143458(s32 param_1) -{ - s32 p; - u16 v; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - p = *(s32 *)(param_1 + 0x20); - if (*(s32 *)(p + 4) == 0) { - *(s32 *)(p + 4) = 0x50000000; - } - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - v = *(u16 *)(param_1 + 0x34) & 0x7fff; - if (v != 0) { - p = *(s32 *)(param_1 + 0x20); - *(u16 *)(p + 0x1a) = v; - *(u16 *)(p + 0x18) = v; - } - - func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, - D_80182A64[*(u16 *)(param_1 + 0x34) & 3]); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - -DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_8014358C); - -DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ - -DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ - -DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ - -DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ - -DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ - -DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ - - -extern void (*D_80182B8C[])(void); - -void func_80143B30(void *a0) { - D_80182B8C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ - -DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ - - -extern void (*D_80182B98[])(void); - -void func_80143C38(void *a0) { - D_80182B98[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ - - -extern void (*D_80182BA0[])(void); - -void func_80143C98(void *a0) { - D_80182BA0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80143D28); - - -extern void (*D_80182BE8[])(void); - -void func_80143E68(void *a0) { - D_80182BE8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ - -DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ - -DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ - -DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ - - -extern void (*D_80182BFC[])(void); - -void func_80144054(void *a0) { - D_80182BFC[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80144090); - -extern void func_8012C218(void *a0); - -// @class: struct -// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) - -extern void (*D_80182C04[])(); - -void func_801442F8(int param_1) -{ - int iVar1; - - D_80182C04[*(u16 *)(param_1 + 2)](); - iVar1 = *(int *)(param_1 + 0x1c) + 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (0x1d < iVar1) { - func_8012C218(param_1); - } -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); -extern u8 D_80182B80; - -void func_80144364(int param_1) { - int iVar3; - u16 uVar2; - s16 sVar1; - - iVar3 = ((s32 (*)(void))func_8012C194)(); - if (iVar3 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); - *(int *)(param_1 + 0xCC) = iVar3; - *(u16 *)(param_1 + 0xFC) = uVar2; - func_8001CB6C((u8 *)iVar3, (s32)&D_80182B80, 0x250, 0x1A0); - *(s32 *)(iVar3 + 4) = 0x60000000; - *(u8 *)(iVar3 + 0x27) = 0x14; - *(u16 *)(iVar3 + 0x10) = 0x400; - *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); - *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); - *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); - sVar1 = *(s16 *)(param_1 + 0x70); - if (sVar1 != 0) { - *(s16 *)(iVar3 + 0x1A) = sVar1; - *(s16 *)(iVar3 + 0x18) = sVar1; - } else { - *(u16 *)(iVar3 + 0x1A) = 0x2000; - *(u16 *)(iVar3 + 0x18) = 0x2000; - } - *(u16 *)(param_1 + 2) = 1; - } -} - - - - -extern void func_80016714(void *a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_8012AD80(s32 a0); -extern void func_8012C218(void *a0); -extern s32 D_80182B94; - -void func_80144458(void *arg0) { - s32 temp_s0; - void *temp_s2; - void *temp_v0; - - temp_s2 = M2C_FIELD(arg0, void **, 0xCC); - if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { - temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); - if (temp_v0 != NULL) { - temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; - M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80182B94 * 0x10); - M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80182B94 * 0x10); - func_8012AD80(arg0); - } - } - M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); - M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); - M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); - if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { - func_80016714(temp_s2, 0x38); - func_8012C218(arg0); - } -} - - -DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ - -DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ - -DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern u8 D_80182BA8; -extern u8 D_80182BB4; - -void func_8014477C(void *param_1) { - s32 v0; - s32 v1; - register s32 uVar2 __asm__("$2"); - register s32 addr __asm__("$3"); - s32 gv; - s32 fv; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)((s32)param_1 + 0x20) = v0; - if (v0 == 0) { - func_8012CAE4(param_1); - return; - } - ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80182BA8); - if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { - *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); - uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); - if (uVar2 != 0) { - addr = uVar2 & 0xFFFFFFF; - gv = *(u16 *)((addr | 0x80000000) + 8); - fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; - *(u16 *)((s32)param_1 + 0xA) = gv + fv; - } else { - *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; - } - } - ((void (*)(void *, void *))func_8012A828)(param_1, &D_80182BB4); - v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; - *(s16 *)((s32)param_1 + 0x2) = 1; - *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; - *(s32 *)((s32)param_1 + 0x1C) = 0x78; -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); - -extern u8 D_80182B80; -extern u8 D_80182BF0; - -void func_80144880(s32 param_1) -{ - register s32 obj __asm__("$16"); /* $s0 */ - register s32 self __asm__("$17") = param_1; /* $s1 */ - register s32 b __asm__("$2"); /* $v0 */ - s32 e; - - obj = ((s32 (*)(void))func_8012C194)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(self); - } else { - *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); - *(s32 *)(self + 0xCC) = obj; - if (*(s16 *)(self + 0x70) == 1) { - func_8001CB6C((u8 *)obj, (s32)&D_80182B80, 0x250, 0x1A0); - b = 0x14; - } else { - func_8001CB6C((u8 *)obj, (s32)&D_80182BF0, 0x300, 0x1D0); - b = 0x6A; - } - *(u8 *)(obj + 0x27) = (u8)b; - *(s32 *)(obj + 4) = 0x60000000; - *(u16 *)(obj + 0x10) = 0x400; - *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); - *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); - e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); - *(u16 *)(obj + 0x1A) = 0x4000; - *(u16 *)(obj + 0x18) = 0x4000; - *(u16 *)(obj + 0xC) = (u16)e; - *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; - } -} - - -DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ - - -extern void (*D_80182C0C[])(void); - -void func_801449C8(void *a0) { - D_80182C0C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ - - -extern void (*D_80182C14[])(void); - -void func_80144A2C(void *a0) { - D_80182C14[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ - -DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ - -DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ - -DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011", func_80144B14); diff --git a/src/ov_SC03_011/ov_SC03_011_jr_8012ACE0.c b/src/ov_SC03_011/ov_SC03_011_jr_8012ACE0.c new file mode 100644 index 000000000..c69be7018 --- /dev/null +++ b/src/ov_SC03_011/ov_SC03_011_jr_8012ACE0.c @@ -0,0 +1,2827 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019FCD4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80181500[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A0E94; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A2390; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019FCD4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018123C)(); +extern s16 (*D_80181240)(); +extern M2C_UNK (*D_80181248)(); +extern s32 (*D_8018124C)(); +extern s32 D_801A0E90; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019FCD8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80181594; +extern void func_8012ACA0(void *arg0); +/* ==== end §8b carried decl layer ==== */ + + + + +// @class: iv-combine +// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ + +s32 func_8012ACE0(void *o) { + int i; + for (i = 0; ; i++) { + switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { + case -2: + case -1: + case 0: + return i; + case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ + default: + break; + } + } +} + +DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ + +DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ + + + +void func_8012AD64(s32 *a0, s16 a1) { + *(s16*)((s32)a0 + 0x34) = a1; +} + + +DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ + +DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ + +DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ + +DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ + +DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ + +DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ + +DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ + +DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ + +DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ + +DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ + +DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ + +DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ + +DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ + +DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ + +DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ + +DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ + +DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012B4B8); + +DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ + +DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ + +DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ + +DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012B77C); + +DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ + +DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ + +DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ + +DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ + +DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ + +DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ + +DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ + +DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ + +DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ + +DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ + +DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ + +DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ + +DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ + +DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ + + +void func_8012BF4C(s32 *a0, s32 a1) { + *(s32*)((s32)a0 + 0x1C) = a1; +} + + +DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ + +DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ + +DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ + +DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ + +DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012C098); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012C0EC); + +DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ + +DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ + +DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ + +DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ + +DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ + +DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ + +DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ + +DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ + +DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ + +DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ + +DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012C658); + +DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012C750); + +DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to +// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS +// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via +// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store +// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. +// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). + +extern s32 D_80184A78; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern void func_80016714(void *a0, s32 a1); + +s32 func_8012C890(s32 a0, s32 a1, s32 a2) { + u8 *src = (u8 *)a0; + u8 *dst = (u8 *)a1; + u16 *d; + s16 count; + u16 v2, v4; + s32 v10; + void *obj; + + *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); + v2 = *(u16 *)(src + 0x0); + *(u16 *)(dst + 0x6) = v2; + *(u16 *)(dst + 0x88) = v2; + v2 = *(u16 *)(src + 0x2); + *(u16 *)(dst + 0xA) = v2; + *(u16 *)(dst + 0x8A) = v2; + v4 = *(u16 *)(src + 0x4); + *(u16 *)(dst + 0xC) = 0; + *(u16 *)(dst + 0x8) = 0; + *(u16 *)(dst + 0x4) = 0; + *(u16 *)(dst + 0xE) = v4; + *(u16 *)(dst + 0x8C) = v4; + *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); + *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; + *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); + v10 = *(s32 *)(src + 0x10); + *(s32 *)(dst + 0x78) = (s32)&D_80184A78; + *(s32 *)(dst + 0xDC) = v10; + + { + register u16 *pc __asm__("$3"); + pc = &(*(u16 *)&D_801270C4); + *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; + count = *(volatile u16 *)pc + 1; + *pc = count; + if (count == 0) { + *pc = 1; + } + } + + if (a2 != 0) { + *(s32 *)(dst + 0x64) = a2; + *(s32 *)(dst + 0x68) = 0; + } else { + *(s32 *)(dst + 0x64) = 0; + *(s32 *)(dst + 0x68) = (s32)src; + } + + *(u16 *)(src + 0xA) |= 0x8000; + *(u16 *)(dst + 0x2) = 0; + d = D_801274E4; + *d &= 0xFFFE; + (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); + + if (*d & 1) { + s32 a1v; + obj = *(void **)(dst + 0x20); + if (obj != 0) { + s32 t = *(u16 *)obj; + if (t != 1) { + if (t != 2) { + goto done; + } + a1v = 0x38; + } else { + a1v = 0x84; + } + func_80016714(obj, a1v); + done:; + } + func_80016714(dst, 0x10C); + *(u16 *)(src + 0xA) &= 0x7FFF; + return 0; + } + + if (*(s32 *)(dst + 0x64) == 0) { + void *o = *(void **)(dst + 0x20); + if (o == 0) { + return (s32)dst; + } + if (*(u16 *)o == 1) { + s16 c = *(s16 *)(src + 0xC); + if (c != 0x7FFF) { + *(s16 *)((u8 *)o + 0x12) = c; + } + } + } + if (*(s32 *)(dst + 0x20) != 0) { + *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); + } + return (s32)dst; +} + + +DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ + +DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ + +DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ + +DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ + +DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ + +DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ + +DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ + +DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012CC88); + +DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ + +DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ + +DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ + +DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ + +DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ + +DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ + +DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ + +DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ + +DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ + +DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ + +DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH + + +struct S8012D664_8012D664 { short a, b, c; }; + +int func_8012D664(int arg0, int arg1, int arg2) { + extern int func_8012F568(); + extern int D_801815A4; + + struct S8012D664_8012D664 s; + int ret; + int t; + + s.a = (*(unsigned short*)&D_80126B5E); + s.b = (*(unsigned short*)&D_80126B62) - 0x40; + s.c = (*(unsigned short*)&D_80126B66); + ret = ((int(*)())func_800132BC)(arg0, &s); + t = arg1 + 0x20; + if (ret < t * t) { + func_8012F568(1, 1, 0, arg2, arg0, &D_801815A4); + return 1; + } + return 0; +} + + + +DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ + + + +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801815AC; +extern M2C_UNK D_801815B4; + +s32 func_8012DB84(void) +{ + func_8014C978(); + func_8012F568(1, 0xC001, 0, 0x3E8, &D_801815AC, &D_801815B4); +} + + +DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH + + +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; + + +s32 func_8012DDA4() +{ + extern Entry_8012DDA4 * D_801A0EB4; + extern Entry_8012DDA4 * D_801A0EB0; + + Entry_8012DDA4 *p; + Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); + + while (D_801A0EB4 != end) { + p = D_801A0EB4; + if (p->active != 0 && p != D_801A0EB0) { + D_801A0EB4 = p + 1; + return p; + } + D_801A0EB4++; + } + D_801A0EB4 = 0; + return 0; +} + + + +// @class: plumbing +// @stuck: none — MATCH (35/35 ins, relocation-masked) + + +s32 func_8012DE2C(s32 a0) { + extern u8 * D_801A0EB4; + extern u8 * D_801A0EB0; + + u8 *base; + u8 *end; + u8 *p; + + base = D_801202A0; + end = base + 0x6480; + D_801A0EB4 = base; + D_801A0EB0 = ((u8 *)a0); + + while (D_801A0EB4 != end) { + p = D_801A0EB4; + if (*(u16 *)p != 0 && p != ((u8 *)a0)) { + D_801A0EB4 = p + 0x10C; + return p; + } + D_801A0EB4 += 0x10C; + } + D_801A0EB4 = 0; + return 0; +} + + + +DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ + +DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ + +DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ + +DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ + +DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012E014); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012E138); + + +s32 func_8012E27C(void) { + return 1; +} + + +DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ + +DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ + +DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012E364); + +DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ + +DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ + +DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ + +DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ + +DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH +extern u8 D_800AF648; +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) +{ + struct { short xy[2]; int sp14; int flag; } f; + register void *p __asm__("$4"); + p = &D_800AF648; + func_8004914C(p); + func_800491AC(&D_800AF648); + RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); + if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { + func_8002D4C8(param_2, param_3); + } +} + + +DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012E778); + +DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ + +DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ + +DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ + +DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ + + + +// @class: other +// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) + +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801815BC; + +void func_8012E9C0(int param_1) +{ + int iVar1; + + if (*(short *)(param_1 + 0x60) != 0) { + if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { + *(short *)(param_1 + 0x82) = 0; + *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); + *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); + *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); + } + if (*(int *)(param_1 + 0x78) != 0) { + iVar1 = *(short *)(param_1 + 0x60) * + *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; + if (iVar1 < 1) { + iVar1 = 1; + } + } else { + iVar1 = *(short *)(param_1 + 0x60); + } + func_8016AA50(param_1, iVar1); + if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { + func_8016B428(param_1); + func_80019064(&D_801815BC); + } + } + return; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012EA90); + +DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ + +DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ + +DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ + +DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012EFB8); + + +// @class: other +// @stuck: none — MATCH (33 ins, match_one verified) + +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); + +void func_8012F038(int param_1, short *param_2, short *param_3) { + int in[3]; + int out[3]; + + in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); + in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); + in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); + ApplyTransposeMatrixLV((void *)param_1, in, out); + param_3[0] = out[0]; + param_3[1] = out[1]; + param_3[2] = out[2]; +} + + +DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(s32 a0, s32 a1, void *a2); + +void func_8012F14C(s32 a0, s32 a1, s32 a2) +{ + s32 buf[2]; + func_8004914C((void *)a0); + func_800491AC((void *)a0); + RotTransSV(a1, a2, buf); +} + + +DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ + +DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012F274); + +DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ + +DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012F40C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_8012F49C); + +DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ + +DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ + +DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ + +DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ + +DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801815D8[]; + +void func_8012F828(int param_1) +{ + *(unsigned char *)(param_1 + 0xC1) = 4; + if (*(unsigned int *)(param_1 + 0xB4) & 8) { + func_80131170(param_1, D_801815D8, 0xB); + } + func_80131CA8(param_1, 9); +} + + +DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ + + +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern void func_80131CA8(int a0, int a1); +extern u8 D_801815E4[]; + +void func_8012F8C8(u8* arg0) { + *(u8*)(arg0 + 0xC1) = 7; + if (*(u32*)(arg0 + 0xB4) & 0x80) { + ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801815E4, 0xB); + } + ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); +} + + +DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ + +DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ + +DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ + +DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ + +DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. +// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for +// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be +// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an +// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). +// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: +// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. +// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which +// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because +// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. +// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out +// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, +// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what +// blocks reorg from sharing a downstream constant into a branch delay slot.) + + +s32 func_8012FCC4(s32 param_1) { + extern int D_801815F0; + + int v1 = *(int *)(((int)param_1) + 0xC4); + *(char *)(((int)param_1) + 0xC1) = 8; + if (v1 & 2) { + *(char *)(((int)param_1) + 0xC1) = 1; + func_80131CA8(((int)param_1), 3); + return; + } + if (v1 & 1) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 1); + return; + } + if (*(int *)(((int)param_1) + 0xB4) & 0x100) { + ((void (*)(int))func_80131B14)(((int)param_1)); + if (*(short *)(((int)param_1) + 0x76) <= 0) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); + return; + } + if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { + *(char *)(((int)param_1) + 0xC2) = 0; + } else { + *(short *)(((int)param_1) + 0x98) = 0; + *(char *)(((int)param_1) + 0xC2) = 1; + } + ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801815F0); + *(int *)(((int)param_1) + 0x1C) = 0; + func_80131CA8(((int)param_1), 0x1C); + return; + } + func_80131CA8(((int)param_1), 0x1C); +} + + + +DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ + +DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ + +DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ + +DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ + +DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ + +DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ + +DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ + +DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ + +DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ + +DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ + +DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ + +DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ + +DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ + +DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ + +DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ + +DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ + +DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80130650); + +DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ + +DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ + +DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ + +DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ + +DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ + +DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80130A18); + +DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ + +DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80130C08); + + +extern void (*D_801815F8[])(void); + +void func_80130D0C(void *a0) { + D_801815F8[*(u8 *)((s32)a0 + 0xC1)](); +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181648[]; +extern s16 D_80181678[]; +extern s16 D_801816D8[]; +extern s16 D_801816E0[]; +extern s16 D_80181700[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181678; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801816D8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801816E0; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181700; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181648; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + + +// @class: loop-guard +// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps +// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` +// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); +// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's +// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC +// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). + + +void func_80131170(s32 p, s32 b, s32 c) { + extern u8 D_801815CC[]; + + func_80131B14(); + *(u8 *)(((u8 *)p) + 0xC2) = 0; + *(u8 *)(((u8 *)p) + 0xC3) = 0; + *(s16 *)(((u8 *)p) + 0x98) = 0; + if (((u8 *)b) == 0) { + ((u8 *)b) = D_801815CC; + } + func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); + *(s32 *)(((u8 *)p) + 0x1C) = 0; + if (c != 0) { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } else { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } +tail: + if (*(s16 *)(((u8 *)p) + 0x76) > 0) { + return; + } + if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); + } else { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); + } +} + + + +// @class: struct +// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) + +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ + + +s32 func_801312D0(s32 param_1, void *param_2) +{ + extern int func_80131CF4(int, int); + extern M8_801312D0 D_80181720; + + int iVar5; + + iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); + if (iVar5 != 0) { + ((short *)param_2)[2] = 0; + ((short *)param_2)[0] = 0; + ((short *)param_2)[1] = (short)iVar5; + } else { + *(M8_801312D0 *)((short *)param_2) = D_80181720; + } +} + + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80131340); + +DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80131A34); + +DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` +// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be +// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a +// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). +// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; +// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the +// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); +// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. + +void func_80131B14() { + extern void func_8002A520(void *); + extern void func_8002A790(void *); + extern u8 D_80181728; + + register u8 *a0v __asm__("$4"); + u8 *p = a0v; + + + s32 e = *(u8 *)(p + 0x5E); + + if (*(s16 *)(p + 0x60) != 0) { + if (e == 0x1D) { + *(s16 *)(p + 0x82) = 0; + *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); + *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); + *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); + } + { + s32 dec; + s32 q = *(s32 *)(p + 0x78); + if (q != 0) { + dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; + if (dec <= 0) dec = 1; + } + *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; + } + ((void (*)(void *))func_8016AA50)(p); + if (*(u16 *)(p + 0x82) & 1) { + ((void (*)(void *))func_8016B428)(p); + ((void(*)(void *))func_80019064)(&D_80181728); + } + } + + *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; + + if (e != 0x1D) { + if (*(u8 *)(p + 0xC8)) func_8002A520(p); + if (*(u8 *)(p + 0xC9)) func_8002A790(p); + } + + if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; + + { + s32 r = *(s32 *)(p + 0x20); + *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; + { + s32 r2 = *(s32 *)(p + 0x20); + *(s16 *)(r2 + 0x14) = 0; + *(s16 *)(r2 + 0x10) = 0; + } + } + + ((void (*)(void *))func_8012B2CC)(p); + ((void (*)(void *))func_8012B23C)(p); +} + + + +DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80131CA8); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80131CF4); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80131D68); + + +extern void (*D_80181738[])(struct S80131E00 *a0); + +void func_80131E00(struct S80131E00 *a0, s32 a1) { + a0->field_B0 = a1; + D_80181738[a1](a0); +} + + +DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ + +DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ + +DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ + + +extern void (*D_80181790[])(void); + +void func_80131EEC(void *a0) { + D_80181790[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801817D8[])(void); + +void func_80131F28(void *a0) { + D_801817D8[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801817E0[])(void); + +void func_80131F64(void *a0) { + D_801817E0[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801817E8[])(void); + +void func_80131FA0(void *a0) { + D_801817E8[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801817F0[])(void); + +void func_80131FDC(void *a0) { + D_801817F0[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80132018); + +DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80181798; + +void func_801320D8(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80181798; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +s32 func_80132144(s32 param_1) +{ + extern int D_801817A8; + + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(((int)param_1) + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(((int)param_1)); + } else { + ((void(*)(int, int))func_8001C214)(v0, 0); + *(int *)(((int)param_1) + 0x58) = (int)&D_801817A8; + *(short *)(((int)param_1) + 0x5c) = 0x80; + *(unsigned short *)(((int)param_1) + 2) += 1; + } +} + + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_801817B8; + +void func_801321B0(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_801817B8; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_801817C8; + +void func_8013221C(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_801817C8; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + +DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ + +DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_801325B8); + +DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ + +DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ + +DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ + +DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ + +DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ + +DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80132F40); + +DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_801330E0); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80133298); + +DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ + +DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH + +extern s32 D_801A0F00; +extern s32 D_801A0F04[]; +extern int D_801A0F08; +extern void func_80136BC4(s32 a0); + +void func_801336E8(void *a0, int a1, int a2) { + if (a0 != 0) { + (*(void * *)&D_801A0F00) = a0; + ((void (*)(void))func_80136BC4)(); + } + (*(int *)&D_801A0F04) = a1; + D_801A0F08 = a2; +} + + + + +extern s32 D_801A0F04[]; +extern s32 D_801A0F00; +extern void func_80136BC4(s32); + +void func_8013373C(s16 arg0) { + s32 temp = D_801A0F04[arg0]; + if (temp != 0) { + D_801A0F00 = temp; + func_80136BC4(temp); + } +} + + +// @class: regalloc-order +#include "common.h" + +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; + + +s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { + extern s32 func_80047D3C(s32); + extern s32 func_80133AB0(s16, s16, s16, s32); + extern Box_80133784 * D_801817F8; + extern Box_80133784 * D_801817FC; + extern s16 D_801A0F0C; + extern u16 D_801A0F10; + + register s32 s1 __asm__("$17"); + s32 s2; + register s16 s3 __asm__("$19"); + register s32 s4 __asm__("$20"); + register s16 a0v __asm__("$4"); + register s16 arg0s __asm__("$21"); + s32 dx, dy, dz; + s32 r, ret; + + a0v = ((s16)arg0); + s1 = 0; + s3 = 0; + s4 = 0; + s2 = 0; + arg0s = a0v; + D_801817F8->f6 = -0x7FFF; + D_801817FC->f6 = 0x7FFF; + D_801817F8->f0 = ((Box_80133784 *)arg1)->f0; + D_801817F8->f4 = ((Box_80133784 *)arg1)->f4; + D_801817FC->f0 = ((Box_80133784 *)arg2)->f0; + D_801817FC->f4 = ((Box_80133784 *)arg2)->f4; + D_801A0F10 = 0; + D_801A0F0C = 0; + + if ((s16)a0v == 0) { + s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; + s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; + s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; + if (sx == 0 && sy == 0) { + s32 zt = (sz == 0); + __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); + } + D_801817F8->f2 = ((Box_80133784 *)arg1)->f2 - 4; + r = func_80047D3C(sx * sx + sz * sz); + if (r < 3) { + r = 4; + } else if (r < 5) { + r += 1; + } + D_801817FC->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; + } else { + D_801817F8->f2 = ((Box_80133784 *)arg1)->f2; + if ((s16)a0v == 2) { + D_801817FC->f0 = D_801817F8->f0; + D_801817FC->f2 = D_801817F8->f2 + 6; + s2 = 1; + D_801817FC->f4 = D_801817F8->f4; + } else { + D_801817FC->f2 = ((Box_80133784 *)arg2)->f2; + } + } + + while (1) { + s32 ret0; + register s32 retc __asm__("$3"); + __asm__ __volatile__(""); + ret0 = func_80133AB0(arg0s, (s16)D_801817F8->f0, (s16)D_801817F8->f4, (*(s32*)&D_801A0F00)); + __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); + ret = retc; + if (ret == 0) goto after; + s4 |= ret; + if (s2 != 0) goto after; + { + s16 oldc = s3; + s3 = s3 + 1; + if (oldc >= 5) break; + } + } + + D_801817FC->f0 = D_801817F8->f0; + D_801817FC->f2 = D_801817F8->f2; + s1 = 0x2000; + D_801817FC->f4 = D_801817F8->f4; + goto store_out; + +after: + if ((s16)s4 != 0 || D_801A0F0C != 0) { + s16 t; + __asm__ __volatile__("" :: "r"(s4)); + t = D_801817F8->f6; + if (t >= -0xBCB) { + if (t < -0x578) { + s1 |= 0x4000; + } else { + s1 |= 0x8000; + } + } + if ((s16)D_801817FC->f6 < -0xBCB) { + s1 |= 0x2000; + } + store_out: + ((Box_80133784 *)arg2)->f0 = D_801817FC->f0; + ((Box_80133784 *)arg2)->f2 = D_801817FC->f2; + ((Box_80133784 *)arg2)->f4 = D_801817FC->f4; + ((Box_80133784 *)arg2)->f6 = D_801A0F10; + return s1 & 0xFFFF; + } + ((Box_80133784 *)arg2)->f6 = D_801A0F10; + return 0; +} + + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80133AB0); + + +s32 func_80133CD4(arg0, cmd, base, arr) + s16 arg0; + s16 *cmd; + s16 *base; + s32 *arr; +{ + typedef struct { s16 e[4]; } ElemK; + + extern u16 *D_801817FC; + extern u16 *D_801817F8; + extern s16 *D_80181804; + extern s16 *D_80181800; + extern s32 *D_8018180C; + extern s32 *D_80181810; + extern u16 D_801A0F10; + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern u16 D_801152AE; + extern u8 D_801152B0; + extern s32 func_80134310(); + extern s32 func_8013435C(); + + s16 *s3 = ((ElemK *)base)[cmd[1]].e; + s32 s6 = arr[cmd[2]]; + s32 s0var, s1var; + s32 s2a; + s16 y; + + if (func_80134310(s3, D_801817FC, s6) >= 0) + return 0; + + s1var = func_80134310(s3, D_801817F8, s6); + if (s1var < 0) + return 0; + + s0var = func_80134310(s3, D_80181804, 0); + { + u16 *pac = D_801817F8; + s16 *pb8 = D_80181804; + s16 *pb4 = D_80181800; + s32 neg = -s1var; + pb4[0] = pac[0] + neg * pb8[0] / s0var; + pb4[1] = pac[1] + neg * pb8[1] / s0var; + pb4[2] = pac[2] + neg * pb8[2] / s0var; + if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) + return 0; + } + if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80181800, arr[cmd[6]], s3)) + return 0; + if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80181800, arr[cmd[8]], s3)) + return 0; + if (arg0 < 0) { + if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80181800, arr[cmd[10]], s3)) + return 0; + } + if (arg0 & 0x10) { + if (*(u16 *)cmd & 0x100) + return 0; + } + if (*(u16 *)cmd & 0x200) { + D_801A0F10 = *(u16 *)cmd; + return 0; + } + + { + s32 ret = func_80134310(s3, D_801817FC, s6); + s32 *pc0; + s32 *pc4; + u16 *pb0; + s32 t, o2; + s32 q3v; + + { + s32 *pw = D_8018180C; + ((struct { s32 w; } *)pw)->w = s3[0]; + pw[1] = s3[1]; + pw[2] = s3[2]; + } + s1var = -ret; + + __asm__ __volatile__( + "lwc2 $9, 0(%0)\n" + "lwc2 $10, 4(%0)\n" + "lwc2 $11, 8(%0)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : "r"(D_8018180C) : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"(D_80181810) : "memory"); + + pc0 = D_8018180C; + pc4 = D_80181810; + s0var = pc4[0] + pc4[1] + pc4[2]; + pb0 = D_801817FC; + pb0[0] += s1var * pc0[0] / s0var; + pb0[1] += s1var * pc0[1] / s0var; + q3v = s1var * pc0[2] / s0var; + + { + s32 h; + h = ((s16 *)pb0)[0]; + s1var = h << 16; + __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); + s0var = h << 16; + } + pb0[2] += q3v; + s2a = (s16)pb0[2] << 16; + + t = pc0[0] << 4; + pc0[0] = t; + if (t < 0) s1var |= 0xFFFF; + t = pc0[1] << 4; + pc0[1] = t; + if (t < 0) s0var |= 0xFFFF; + o2 = pc0[2]; + t = o2 << 4; + pc0[2] = t; + if (t < 0) s2a |= 0xFFFF; + s2a += o2 << 5; + s1var += pc0[0] << 1; + s0var += pc0[1] << 1; + + do { + s32 *pl = D_8018180C; + u16 *pb; + s1var += pl[0]; + s0var += pl[1]; + s2a += pl[2]; + pb = D_801817FC; + pb[0] = s1var >> 16; + pb[1] = s0var >> 16; + pb[2] = s2a >> 16; + ret = func_80134310(s3, pb, s6); + } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); + } + + y = s3[1]; + if (y >= -0xBCB) { + D_801817F8[3] = y; + { + typedef struct { s8 c[8]; } Blk8; + *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; + } + if (*(u8 *)cmd != 0) + goto ret1; + return -1; + } + { + typedef struct { u16 h; } H16; + u16 *s3u = (u16 *)s3; + u16 *bp = D_801817FC; + u16 w; + ((H16 *)D_801152A8)->h = s3u[0]; + w = s3u[1]; + bp[3] = w; + ((H16 *)&D_801152AA)->h = w; + ((H16 *)&D_801152AC)->h = s3u[2]; + ((H16 *)&D_801152AE)->h = s3u[3]; + } +ret1: + return 1; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80134310); + +DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (83 ins, relocation-masked) + + + +s32 func_801343C4(s32 angle, s32 p1, s32 p2) +{ + extern int func_80133AB0(int, s16, s16, int); + extern s16 * D_801817F8; + extern s16 * D_801817FC; + extern u16 D_801A0F10; + extern u16 D_801A0F0C; + + s16 *pac; + s16 *pb0; + s16 *pacs, *pb0s; + u16 *pb0u; + int a1v, a2v, d94, b0; + int sangle = ((s16)angle); + + pac = D_801817F8; + d94 = D_801A0F00; + pb0 = D_801817FC; + pac[0] = ((u16 *)p1)[0]; + pac[1] = ((u16 *)p1)[1]; + pac[2] = ((u16 *)p1)[2]; + pb0[0] = ((u16 *)p2)[0]; + pb0[1] = ((u16 *)p2)[1]; + pb0[2] = ((u16 *)p2)[2]; + + a1v = pac[0]; a2v = pac[2]; + __asm__ __volatile__("" ::: "memory"); + D_801A0F10 = 0; + D_801A0F0C = 0; + if (func_80133AB0(sangle, a1v, a2v, d94)) { + setdst: + pb0u = (u16 *)D_801817FC; + ((u16 *)p2)[0] = pb0u[0]; + ((u16 *)p2)[1] = pb0u[1]; + ((u16 *)p2)[2] = pb0u[2]; + ((u16 *)p2)[3] = D_801A0F10; + return 1; + } + + pacs = D_801817F8; + pb0s = D_801817FC; + b0 = pb0s[0]; + if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && + (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { + return 0; + } + if (func_80133AB0(sangle, b0, pb0s[2], D_801A0F00)) { + goto setdst; + } + return 0; +} + + + +// @class: schedule +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; + + +s32 func_80134510(s32 param) { + extern s32 func_801345F8(s32); + extern Foo_80134510_80134510 * D_801817F8; + extern Foo_80134510_80134510 * D_801817FC; + extern Foo_80134510_80134510 * D_80181800; + extern u16 D_801A0F10; + + + s32 ret = 0; + Foo_80134510_80134510 *b0 = D_801817FC; + Foo_80134510_80134510 *ac = D_801817F8; + u16 t0 = ((Foo_80134510_80134510 *)param)->f0; + u16 t2, t4; + + ((Foo_80134510_80134510 *)param)->f6 = 0; + ac->f0 = t0; + b0->f0 = t0; + t2 = ((Foo_80134510_80134510 *)param)->f2; + ac->f2 = t2 - 4; + b0->f2 = t2 + 0x2FC; + t4 = ((Foo_80134510_80134510 *)param)->f4; + ac->f4 = t4; + b0->f4 = t4; + + if (func_801345F8((*(s32*)&D_801A0F00)) != 0) { + s16 x; + ((Foo_80134510_80134510 *)param)->f2 = D_80181800->f2 - 2; + x = D_801817F8->f6; + if (x >= -3019) { + if (x < -1400) { + ret = 0x4000; + } else { + ret = 0x8000; + } + } else { + ret = 0x2000; + } + D_801817F8->f6 = D_801A0F10; + } + return ret; +} + + + +// @class: regalloc-order +// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. + + +s32 func_801345F8(s32 arg) +{ + extern int func_801347A0(short, u16 *, int, int); + extern u16 * D_801817F8; + extern u16 D_801A0F10; + + register u16 *param_1 __asm__("$5") = ((u16 *)arg); + register u16 *cc __asm__("$4") = D_801817F8; + int c8000 = 0x8000; + register int zr __asm__("$0"); + u32 c1, c2, uVar6, uVar2, cnt, v14; + u16 *ptmp, *puVar4, *puVar7, uVar1; + int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; + + c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; + uVar6 = c1 + zr; + if ((c1 & 0xffff) < (u32)param_1[2]) { + c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; + uVar2 = c2 + zr; + if ((c2 & 0xffff) < (u32)param_1[3]) + goto do_mult; + return 0; + found: + D_801A0F10 = *puVar7; + return 1; + do_mult: + tbl = *(int *)(param_1 + 4); + uVar10 = *(int *)(param_1 + 6); + uVar3 = *(int *)(param_1 + 8); + iVar9 = *(int *)(param_1 + 0xc); + iVar8 = *(int *)(param_1 + 0xe); + ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); + cnt = (u32)ptmp[1]; + v14 = *(int *)(param_1 + 10); + puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; + while (((cnt-- + zr) & 0xffff) != 0) { + uVar1 = *puVar4; + hi = uVar1 & 0x8000; + harg = hi + zr; + if (hi == 0) + puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); + else + puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); + if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) + goto found; + puVar4 = puVar4 - 1; + } + } + return 0; +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. +#include "common.h" + +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; + +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; + +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; + + + +s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); + extern s16 * D_801817FC; + extern SVec_801347A0 * D_801817F8; + extern SVec_801347A0 * D_80181800; + + Elem_801347A0 *pElem; + s32 val; + register s32 iv __asm__("$4"); + s32 q; + s32 dvsr; + + pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; + val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; + if (func_80134A28((s32)pElem, (s32)D_801817FC, val) >= 0) { + return 0; + } + iv = func_80134A28((s32)pElem, (s32)D_801817F8, val); + if (iv < 0) { + return 0; + } + iv = -iv; + dvsr = pElem->f2 * 48; + q = (iv * 48) / dvsr; + D_80181800->f0 = D_801817F8->f0; + D_80181800->f2 = D_801817F8->f2 + q; + D_80181800->f4 = D_801817F8->f4; + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { + return 0; + } + if ((s16)arg0) { + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80181800, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { + return 0; + } + } + if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { + return 0; + } + D_80181800->f0 = D_801817F8->f0; + D_80181800->f4 = D_801817F8->f4; + (*(Elem_801347A0*)D_801152A8) = *pElem; + D_801817F8->f6 = pElem->f2; + return 1; +} + + + +DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80134A74); + +// @class: regalloc-order +// @try: variant B — direct pins m=$s5($21), c=$s6($22) + + +s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); + extern void * D_801817F8; + extern void * D_801817FC; + extern void * D_80181800; + extern void * D_80181804; + extern u16 D_801A0F10; + + s32 temp_a3; + s32 temp_s1; + s32 temp_v0; + s32 temp_v0_2; + s32 var_v0; + u16 temp_a1; + s32 temp_s4; + s32 c = arg0; + __asm__ __volatile__("" : "=r"(c) : "0"(c)); + __asm__ __volatile__("" : : "r"(arg0)); + + temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); + temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); + var_v0 = 0; + if (func_80134FB8(temp_s4, (s32) D_801817FC, temp_s1) >= 0) { + return var_v0; + } + temp_v0 = func_80134FB8(temp_s4, (s32) D_801817F8, temp_s1); + if (temp_v0 < 0) { + goto block_13; + } + temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80181804, 0); + temp_a3 = -temp_v0; + { + u16 *pB4 = (u16 *)D_80181800; + u16 *pAC = (u16 *)D_801817F8; + s16 *pB8 = (s16 *)D_80181804; + pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; + pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; + pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { + return var_v0; + } + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80181800, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { + return var_v0; + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80181800, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { + return var_v0; + } + if ((arg0 << 16) < 0) { + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80181800, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { + return var_v0; + } + } + if (c & 1) { + if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { + goto block_14; + } + return 0; + } + temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); + if (!(temp_a1 & 0x200)) { + goto block_14; + } + D_801A0F10 = temp_a1; +block_13: + return 0; +block_14: + __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); + VectorNormalSS(D_80181804, D_80181804); + { + u16 *pB8 = (u16 *)D_80181804; + u16 *pB4b = (u16 *)D_80181800; + pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); + var_v0 = 1; + pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); + pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); + } + return var_v0; +} + + + +DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype D_801817FC + D_801817F8 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + extern int func_80134A74(int, s16, s16, int); + extern s16 * D_801817FC; + extern s16 * D_801817F8; + extern u8 D_80181804; + extern s16 *D_80181800; + extern u16 D_801A0F10; + + register s16 *pb0 __asm__("$9"); /* D_801817FC -> $t1 */ + register s16 *pac __asm__("$6"); /* D_801817F8 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_80181804 -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = D_801817FC; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = D_801817F8; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80181804); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_801A0F00; + __asm__ __volatile__("" ::: "memory"); + D_801A0F10 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_80181800); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_801A0F10; + return 1; + } + { + register u16 *qb __asm__("$4"); /* D_801817F8 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* D_801817FC[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* D_801817FC -> $a2 (reloaded) */ + qb = (u16 *)D_801817F8; + qa = (u16 *)D_801817FC; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801A0F00)) + goto found; + return 0; + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (62 ins, relocation-masked) + + +extern u8 D_801817FC; +extern u8 D_801817F8; +extern s16 *D_80181800; +extern u8 D_80181804; +extern int D_801A0F00; +extern u16 D_801A0F10; + +extern int func_80134A74(int, s16, s16, int); + +int func_80135168(u16 arg0, u16 *p1, u16 *p2) +{ + register s16 *pb0 __asm__("$8"); + register s16 *pac __asm__("$6"); + register s16 *pb8 __asm__("$7"); + u16 *pb4; + u16 a, b; + int a1v, a2v, d94; + + pb0 = (*(s16 * *)&D_801817FC); + __asm__ __volatile__("" : : "r"(pb0)); + + a = p2[0]; pac = (*(s16 * *)&D_801817F8); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80181804); pac[0] = b; pb8[0] = a - b; + a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; + a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; + + a1v = pac[0]; a2v = pac[2]; d94 = D_801A0F00; + __asm__ __volatile__("" ::: "memory"); + D_801A0F10 = 0; + if (func_80134A74(arg0, a1v, a2v, d94)) { + pb4 = (*(u16 * *)&D_80181800); + p2[0] = pb4[0]; + p2[1] = pb4[1]; + p2[2] = pb4[2]; + p2[3] = D_801A0F10; + return 1; + } + return 0; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80135260); + + +/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). + * + * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 + * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does + * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in + * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). + * + * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): + * the two output buffers D_801817F8 / D_801817FC are written through a pointer in each of the two + * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a + * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also + * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each + * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks + * the lowest-free scratch over its OWN window: + * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) + * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) + * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail + * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. + * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades + * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the + * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. + * + * Zero file-scope footprint (block-scoped typedefs + externs; D_801817F8/B0 read via the ambient + * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for + * family_sweep --edit-remap with no cc1 crash. + * + * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. + */ +s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) +{ + typedef struct { s32 vx, vy, vz, pad; } Vec32; + typedef struct { s16 vx, vy, vz, pad; } Vec16; + typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; + extern void func_80048EAC(void *m0, void *m1); + extern void func_8004914C(void *m); + extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); + extern void ApplyRotMatrixLV(void *in, void *out); + extern void ApplyRotMatrix(void *in, void *out); + extern s32 D_801A0F14, D_801A0F18, D_801A0F1C, D_801A0F20; + extern s16 D_801A0F24; + extern s32 D_801A0F34; + extern s16 D_801A0F38, D_801A0F3A, D_801A0F3C, D_801A0F3E, D_801A0F40, D_801A0F42; + + Vec32 in0, in1, rotout; + Mat32 mat2; + Vec16 vecin; + s32 result; + s32 mode; + s32 q1, q2; + s32 p; + s32 t18, t1A, t1C; + s32 *m; + + in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); + in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); + if ((param_2 & 0x10000000) == 0) { + if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { + return 0; + } + } + mode = param_2 & 0x60000000; + if (mode != 0) { + result = 1; + if (param_2 >= 0) { + mode &= 0x40000000; + } + in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); + in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); + switch (mode) { + case 0x60000000: + m = &D_801A0F14; + *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); + q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); + q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); + D_801A0F18 = 0; + D_801A0F20 = 0; + D_801A0F1C = q1; + D_801A0F24 = q2; + func_80048EAC((void *)((s32)param_1 + 0x34), m); + ApplyTransposeMatrixLV(m, &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + /* fallthrough */ + case 0x20000000: + p = (param_2 & 0xFFFFFFF) | 0x80000000; + t18 = *(s16 *)((s32)param_1 + 0x18); + t1A = *(s16 *)((s32)param_1 + 0x1A); + t1C = *(u16 *)((s32)param_1 + 0x1C); + mat2.w4 = 0; + mat2.wC = 0; + mat2.w0 = t18; + mat2.w8 = t1A; + mat2.h10 = t1C; + func_8004914C(&mat2); + vecin.vx = *(u16 *)(p + 4); + vecin.vy = *(u16 *)(p + 8); + vecin.vz = *(u16 *)(p + 0xC); + ApplyRotMatrix(&vecin, &rotout); + D_801A0F38 = rotout.vx; + D_801A0F3C = rotout.vy; + D_801A0F40 = rotout.vz; + vecin.vx = *(u16 *)(p + 6); + vecin.vy = *(u16 *)(p + 0xA); + vecin.vz = *(u16 *)(p + 0xE); + ApplyRotMatrix(&vecin, &rotout); + D_801A0F34 = 0; + D_801A0F3A = rotout.vx; + D_801A0F3E = rotout.vy; + D_801A0F42 = rotout.vz; + result += 2; + break; + case 0x40000000: + ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + break; + } + { + s16 *p = *(s16 **)&D_801817F8; + p[0] = in0.vx; + p[1] = in0.vy; + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_801817FC; + p[0] = in1.vx; + p[1] = in1.vy; + p[2] = in1.vz; + } + return result; + } + { + s16 *p = *(s16 **)&D_801817F8; + p[0] = in0.vx; + p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_801817FC; + p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); + p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); + } + return 1; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80135888); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80135A4C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80135D20); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80135EB0); + + +s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + register s32 a1v __asm__("$11"); + register s32 a2v __asm__("$12"); + register s32 n __asm__("$5"); + register s16 *b4 __asm__("$7"); + s32 d; + s32 dx; + s32 denom; + s32 result; + s32 frame_pad[2]; + (void)&frame_pad; + __asm__("" : "=r"(a1v) : "0"(arg1)); + a2v = arg2; + + if (!(arg1 & 1)) { + dx = (s16) arg2 - (*(s16 **)&D_801817F8)[2]; + d = dx; + denom = -(*(s16 **)&D_80181804)[2]; + } else { + denom = (*(s16 **)&D_80181804)[2]; + d = (*(s16 **)&D_801817F8)[2] - (s16) arg2; + dx = -d; + } + n = -d; + { + register s16 *b8 __asm__("$6") = *(s16 **)&D_80181804; + u16 *ac = *(u16 **)&D_801817F8; + b4 = D_80181800; + b4[0] = ac[0] + n * b8[0] / denom; + b4[1] = ac[1] + n * b8[1] / denom; + b4[2] = ac[2] + dx; + } + + if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; + if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; + if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; + if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; + if (a1v & 0x8000) { + u16 *b0 = *(u16 **)&D_801817FC; + b4[0] = b0[0]; + b4[1] = b0[1]; + } + D_801152AA = 0; + (*(s16 *)D_801152A8) = 0; + if (a1v & 1) { + D_80181800[2] = a2v + 2; + __asm__ __volatile__(""); + D_801152AC = 0xFFF; + } else { + D_801152AC = -0xFFF; + D_80181800[2] = a2v - 2; + } + __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); + (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; + D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; + result = 1; + D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; + return result; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_801365B8); + + +// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) +// D_801817F8/B0/B8 are file-scope `extern u8`, D_80181800 is `extern s32 []`; each HOLDS a +// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. +// D_80181800 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the +// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar +// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the +// siblings read it once via *(u16**)&sym == direct lw either way). + +s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + + register u16 *ac __asm__("$4"); + register s16 *b8 __asm__("$6"); + register s16 *b4 __asm__("$9"); + register s32 r __asm__("$3"); + register s32 pos __asm__("$12"); + register s32 a1v __asm__("$5"); + s16 temp_v0; + s16 temp_v1; + s32 var_a3; + s16 var_v0_3; + s32 temp_a1; + s32 var_t0; + s32 var_v1; + s16 *b4b; + u16 *p; + + __asm__ ("" : "=r"(a1v) : "0"(arg1)); + pos = arg2; + if (!(a1v & 1)) { + var_t0 = (s16) arg2 - (*(s16 **)&D_801817F8)[1]; + var_v1 = var_t0; + var_a3 = -(*(s16 **)&D_80181804)[1]; + } else { + var_a3 = (*(s16 **)&D_80181804)[1]; + var_v1 = (*(s16 **)&D_801817F8)[1] - (s16) arg2; + var_t0 = -var_v1; + } + b8 = (*(s16 **)&D_80181804); + ac = (*(u16 **)&D_801817F8); + b4 = D_80181800; + temp_a1 = -var_v1; + r = (temp_a1 * b8[0]) / var_a3; + b4[0] = ac[0] + r; + b4[1] = ac[1] + var_t0; + r = (temp_a1 * b8[2]) / var_a3; + temp_v0 = ac[2] + r; + b4[2] = temp_v0; + temp_v1 = b4[0]; + if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { + return 0; + } + if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { + return 0; + } + if (arg1 & 0x8000) { + p = (*(u16 **)&D_801817FC); + b4[0] = (s16) p[0]; + b4[2] = (s16) p[2]; + } + D_801152AC = 0; + (*(s16 *)D_801152A8) = 0; + if (arg1 & 1) { + b4b = D_80181800; + D_801152AA = 0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos + 2; + } else { + b4b = D_80181800; + D_801152AA = -0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos - 2; + } + b4b[1] = var_v0_3; + __asm__ __volatile__("" :: "r"(pos)); + (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); + D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); + D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); + return 1; +} + + +// @class: schedule +// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a +// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE +// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses +// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] +// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the +// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; +// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits +// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the +// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). + + +extern s16 *D_80181800; /* holds a pointer value (*(u16**)&D_80181800) */ + +s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { + extern void ApplyMatrixSV(void *m, void *v0, void *v1); + extern void ApplyRotMatrix(void *v0, void *v1); + extern u16 D_80126722; + extern s16 D_80126724; + extern s16 D_801152AA; + extern s16 D_801152AC; + + s32 out[4]; + u16 *pb4; + + if (a0) { + ApplyMatrixSV((void *)a3, *(void **)&D_80181800, *(void **)&D_80181800); + ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); + ApplyRotMatrix((void *)D_801152A8, (void *)out); + *(s16 *)D_801152A8 = out[0]; + D_801152AA = out[1]; + D_801152AC = out[2]; + } + + pb4 = *(u16 **)&D_80181800; + *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); + *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); + *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); + + *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); + D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); + D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); +} + + + +DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ + +DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ + +DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ + +DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ + +DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ + + +extern unsigned short D_800B99F0; +extern void (*D_80181814[])(void); + +void func_80136C54(void) +{ + D_80181814[D_800B99F0](); +} + + +// @class: struct +// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_8019FF28 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). + +typedef struct { char s[10]; } S10_80136C90; + +s32 func_80136C90() +{ + extern void func_8001534C(int, void *, int, int, int, int); + extern S10_80136C90 D_8019FF28; + + S10_80136C90 buf = D_8019FF28; + func_8001534C(0, &buf, 0x78, 0x10, 0, 0); +} + + + +DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ + +DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80136DFC); + +DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ + +DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80136F3C); + +DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80137178); + +DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ + +DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80137614); + +DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ + +DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_801376E8); + +DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ + +DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_801378F0); + +DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ + +DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_801379FC); + + +// @class: remat +// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer +extern s32 D_80127548[]; +extern int D_80181868; +extern int D_801269F0; +extern void func_80138BE0(int p); + +void func_80137B80(void) { + int *p = &D_801269F0; + (*(int *)&D_80127548) = 0x24; + if (*p != 0) { + ((void (*)(int *))func_80138BE0)(p); + } + D_80181868 += 1; +} + + +DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. + +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int D_80181868; +extern int D_801269F0; + +extern void func_801392FC(); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); + +int func_80137D08(int arg0, int arg1, short arg2) +{ + unsigned char buf[3]; + + D_800A5E60 = arg0; + D_80126A0A = arg2; + ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); + if ((*(short *)&D_801269F4) == 7) { + buf[0] = 0x39; + buf[1] = 0xFF; + buf[2] = 0x71; + ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); + } else if ((*(short *)&D_801269F4) == 3) { + if (D_80181868 & 4) { + ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); + } + } + return D_800A5E60; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8012ACE0", func_80137DD4); + +DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ diff --git a/src/ov_SC03_011/ov_SC03_011_jr_801380E0.c b/src/ov_SC03_011/ov_SC03_011_jr_801380E0.c new file mode 100644 index 000000000..31d806257 --- /dev/null +++ b/src/ov_SC03_011/ov_SC03_011_jr_801380E0.c @@ -0,0 +1,3320 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019FCD4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80181500[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A0E94; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A2390; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019FCD4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018123C)(); +extern s16 (*D_80181240)(); +extern M2C_UNK (*D_80181248)(); +extern s32 (*D_8018124C)(); +extern s32 D_801A0E90; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019FCD8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80181594; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80184A78; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801815AC; +extern M2C_UNK D_801815B4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801815BC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801815D8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801815E4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801815F8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181648[]; +extern s16 D_80181678[]; +extern s16 D_801816D8[]; +extern s16 D_801816E0[]; +extern s16 D_80181700[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80181738[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80181790[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801817D8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801817E0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801817E8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801817F0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80181798; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801817B8; +extern void func_801321B0(int param_1); +extern int D_801817C8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A0F00; +extern s32 D_801A0F04[]; +extern int D_801A0F08; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801817FC; +extern u8 D_801817F8; +extern s16 *D_80181800; +extern u8 D_80181804; +extern int D_801A0F00; +extern u16 D_801A0F10; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80181800; /* holds a pointer value (*(u16**)&D_80181800) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80181814[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80181868; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018186C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018186C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801818B0; +extern u8 D_801818F4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801818B0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801818F4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181938[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80181974[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80181974; + if (((s16)a1) < 0xC00) { + tbl = D_80181938; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801819B0, D_801819B2, D_801819B4, D_801819B6, D_801819B8, D_801819BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801819B2 < ang)) goto outer_else; + if (!(ang < D_801819B8)) goto inner_else; + if (ang < D_801819B4) { *(s16 *)L = D_801819B4; goto done; } + if (D_801819B6 < ang) { *(s16 *)L = D_801819B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801819B0) { *(s16 *)L = D_801819B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801819BA < ang) { *(s16 *)L = D_801819BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A0F78; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A0F78, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A0F78; +extern s8 D_801A0F7C; +extern s8 D_801A0F7D; + +void func_8013C9C4(void * arg0) +{ + D_801A0F78 = arg0; + D_801A0F7C = 0; + D_801A0F7D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A0F78; +extern s8 D_801A0F7C; +extern s8 D_801A0F7D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A0F78; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A0F7D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A0F7C)) * 2) + D_801A0F78); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A0F7D = (unsigned char) p[1]; + D_801A0F7C = D_801A0F7C + 1; + if (D_801A0F7D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A0F7C = 0; + *base = 0; + } + } + else + { + D_801A0F7D = c - 1; + } + } + return; +} + + + +extern s32 D_801A0F9C; +extern s32 D_801A0F90; +extern s32 D_801A0F94; +extern s32 D_801A0FA0; + +void func_8013CABC(void) { + D_801A0F9C = 1; + D_801A0F90 = 1; + D_801A0F94 = 0; + D_801A0FA0 = 1; +} + + + +extern s32 D_801A0F90; +extern s32 D_801A0F94; +extern s32 D_801A0F98; +extern s32 D_801A0F9C; +extern s32 D_801A0FA0; + +void func_8013CAE8(void) { + D_801A0F90 = 1; + D_801A0F9C = 0; + D_801A0F94 = 0; + D_801A0F98 = -1; + D_801A0FA0 = 0; +} + + + +extern s32 D_801A0F9C; +extern s32 D_801A0FA0; +extern s32 D_801A0FC8; +extern s32 D_801A0FCC; + +void func_8013CB20(void) +{ + D_801A0FC8 = D_801A0FA0; + D_801A0FCC = D_801A0F9C; + D_801A0FA0 = 1; + D_801A0F9C = 0; +} + + + +extern s32 D_801A0FC8; +extern s32 D_801A0FCC; +extern s32 D_801A0FA0; +extern s32 D_801A0F9C; + +void func_8013CB5C(void) { + D_801A0FA0 = D_801A0FC8; + D_801A0F9C = D_801A0FCC; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A22A8; + extern u8 D_801A22A9; + extern u8 D_801A22AA; + extern u8 D_801A22AB; + extern u8 D_801A22AC; + extern u8 D_801A22AD; + extern u8 D_801A22AE; + extern u8 D_801A22AF; + extern u8 D_801A22B0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A22A8; t1 = D_801A22A9; t2 = D_801A22AA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A22AB; t1 = D_801A22AC; t2 = D_801A22AD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A22AE; t1 = D_801A22AF; t2 = D_801A22B0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A0FA8; +extern s32 D_801A0F90; +extern s32 D_801A0FAC; +extern s32 D_801A0F9C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A0FA8 != 0) { + if (D_801A0FA8 != 2) { + if (((D_801A0FA8 < 3) && (D_801A0FA8 == 1)) && + (D_801A0FAC = D_801A0FAC + 1, 0x23a < D_801A0FAC)) { + D_801A0F90 = D_801A0FA8; + D_801A0FA8 = 2; + } + } else { + D_801A0F90 = D_801A0F90 + -1; + if (D_801A0F90 == 0) { + D_801A0F90 = D_801A0FA8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A0F9C == 0) { + D_801A0FA8 = D_801A0FA8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A0F9C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A0F9C; +} + + + +extern s32 D_801A0FA8; + +void func_8013D164(void) { + D_801A0FA8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A238A; +extern u8 D_801A2402; +extern u8 D_801A22B2; +extern u8 D_801A236C; +extern u8 D_801A2290; +extern u8 D_801A22B1; +extern s32 D_801A2370; + +void func_8013D330(void) { + if ((D_801A238A & 0xff) != D_801A2402) { + D_801A238A = ((D_801A238A & 0xff) < D_801A2402) ? (D_801A238A + 1) : (D_801A238A - 1); + } + if ((D_801A22B2 & 0xff) != D_801A236C) { + D_801A22B2 = ((D_801A22B2 & 0xff) < D_801A236C) ? (D_801A22B2 + 1) : (D_801A22B2 - 1); + } + if ((D_801A2290 & 0xff) != D_801A22B1) { + D_801A2290 = ((D_801A2290 & 0xff) < D_801A22B1) ? (D_801A2290 + 1) : (D_801A2290 - 1); + } + D_801A2370 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A0F80; +extern void *D_801A0F84; +extern void *D_801A0F88; +extern s32 D_801A0FB0; +extern s32 D_801A0FB4; +extern s32 D_801A0FB8; +extern s32 D_801A22E4[]; + +extern u8 D_80181AA8[]; +extern u8 D_80181B50[]; +extern u8 D_80181A00[]; +extern u8 D_80181AFC[]; +extern u8 D_80181B7C[]; +extern u8 D_80181A54[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A0FB0 = param_2; + D_801A0FB4 = (param_2 >> 2) & 3; + D_801A0FB8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A0F80 = D_80181AA8; + D_801A0F84 = D_80181B50; + D_801A0F88 = D_80181A00; + } else { + D_801A0F80 = D_80181AFC; + D_801A0F84 = D_80181B7C; + D_801A0F88 = D_80181A54; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A0FB8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A0FB0 & 2) != 0) { + D_801A22E4[0] = 0x140; + D_801A22E4[3] = 0x80; + if (p[0x37] == 4) { + D_801A22E4[0] = 0x140; + D_801A22E4[3] = 0; + } + if (p[0x37] == 0) { + D_801A22E4[0] = 0x140; + D_801A22E4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A0F88)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A0F88; +extern s16 *D_801A0F8C; +extern s32 D_801A0F9C; +extern s32 D_801A0FBC; +extern s32 D_801A0FC0; +extern s32 D_801A0FC4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A0F8C != 0) { + D_801A0F9C = 0; + p = (int *)(param_1 * 12 + (int)D_801A0F88); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A0FBC != x) { + flag = 1; + if (D_801A0FBC < x) { + if (x - D_801A0FBC < 5) { + D_801A0FBC = x; + } else { + D_801A0FBC = D_801A0FBC + 4; + } + } else { + if (D_801A0FBC - x < 5) { + D_801A0FBC = x; + } else { + D_801A0FBC = D_801A0FBC - 4; + } + } + } + if (D_801A0FC0 != y) { + flag = 1; + if (D_801A0FC0 < y) { + if (y - D_801A0FC0 < 5) { + D_801A0FC0 = y; + } else { + D_801A0FC0 = D_801A0FC0 + 4; + } + } else { + if (D_801A0FC0 - y < 5) { + D_801A0FC0 = y; + } else { + D_801A0FC0 = D_801A0FC0 - 4; + } + } + } + if (D_801A0FC4 != z) { + flag = 1; + if (D_801A0FC4 < z) { + if (z - D_801A0FC4 < 5) { + D_801A0FC4 = z; + } else { + D_801A0FC4 = D_801A0FC4 + 4; + } + } else { + if (D_801A0FC4 - z < 5) { + D_801A0FC4 = z; + } else { + D_801A0FC4 = D_801A0FC4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A0F9C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80181C0C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A0F8C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A0FBC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0FC0); + uVar5 = (*(int*)&D_801A0FC4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80181C0C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A0FA4; + +s32 func_8013E054(void) { + return D_801A0FA4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80182608; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801825E0; +extern s16 D_801825E2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80182608; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801825E0 = 2; + D_801825E2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801825E2 = 0; + D_801825E0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A0FD8; + extern void * D_801A0FDC; + extern unsigned char D_80182280; + extern unsigned char D_80182298; + extern unsigned char D_8018230C; + extern unsigned char D_80182314; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A0FD8 = &D_80182280; + D_801A0FDC = &D_8018230C; + } else { + D_801A0FD8 = &D_80182298; + D_801A0FDC = &D_80182314; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80182608/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80182608 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80182608)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801825E4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801825E4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801825E4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801825E0; +extern s16 D_801825E2; +extern unsigned char D_801825E4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801825E2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801825E0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801825E2; + if (*r < 3) { + *r = *r + 1; + } + D_801825E0 = (u16)D_801825E0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801825E4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801825E4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801825E4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013FAF8); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8013FFD8); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8014032C); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80140608); + + +// @class: iv-combine +// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source +// pointer compile to fixed offsets when written base[0..n]; the target advances +// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead +// final increment, yielding the "increment N-2 then offset 0/2" tail). + +extern u8 *D_801822C0; +extern u8 *D_801822C4; +extern u8 *D_801822C8; +extern u8 *D_801822CC; +extern u8 *D_801822D0; +extern u16 *D_801822D4[]; +extern u16 *D_801822DC[]; +extern u16 *D_801822FC[]; + +extern s32 func_80028D58(void); +extern s32 func_80028DE0(void); +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); + +void func_801407F4(void) +{ + u8 *puVar1; + s32 iVar2; + u16 *puVar3; + + puVar1 = D_801822C0; + iVar2 = func_80028D58(); + puVar3 = D_801822D4[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + puVar1 = D_801822C4; + iVar2 = func_80028DE0(); + puVar3 = D_801822D4[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + iVar2 = func_80028FBC(); + *(s16 *)(D_801822C8 + 0x18) = *D_801822DC[iVar2]; + iVar2 = func_80029000(); + *(s16 *)(D_801822CC + 0x18) = *D_801822DC[iVar2]; + + puVar1 = D_801822D0; + iVar2 = func_80028D9C(); + puVar3 = D_801822FC[iVar2]; + *(s16 *)(puVar1 + 0x12) = *puVar3++; + *(s16 *)(puVar1 + 0x14) = *puVar3++; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + *(s16 *)(puVar1 + 0x1c) = *puVar3++; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80140958); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80140D68); + + +// @class: struct +// @stuck: none — MATCH + +extern unsigned char D_80078E7F; +extern unsigned char D_80078E7E; +extern unsigned char D_80078E7D; +extern M2C_UNK D_801821FC; + +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); + +void func_80140E6C(void) { + void *puVar1; + unsigned int uVar2; + unsigned int uVar3; + unsigned int uVar4; + + puVar1 = (*(void * *)&D_801821FC); + uVar2 = func_800D2CA8(D_80078E7F, 0x18); + uVar3 = func_800D2CA8(D_80078E7E, 0xc); + uVar4 = func_800D2CA8(D_80078E7D, 0); + func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); +} + + + + +// @class: plumbing +// @stuck: none — MATCH (128/128 ins, match_one confirmed) + +extern short D_80115128; +extern u8 D_8018220C; +extern char *D_8018222C; +extern char *D_80182230; +extern char *D_80182234; +extern char *D_80182238; +extern char *D_8018223C; + +extern int func_80029FE4(void); +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); +extern char *func_8002AAB4(void); +extern char *strcpy(char *, const char *); +extern int func_8002A26C(void); +extern int func_8002A2B0(void); +extern int func_8002A4B8(void); +extern s32 func_8002A4FC(s32 a0); +extern int func_8002A998(void); +extern int func_8002A9DC(void); +extern int func_8002A728(void); +extern int func_8002A76C(void); +extern int func_80029FD4(void); + +void func_80140F00(void) { + char *p; + int r; + + if (D_80115128 == 0) { + p = (*(char * *)&D_8018220C); + r = func_800D2CA8(func_80029FE4() + 1, 0x18); + func_800D2D10(r, 2, p + 4, 1); + strcpy(p + 0xA, func_8002AAB4()); + + p = D_8018222C; + r = func_800D2CA8(func_8002A26C() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A2B0(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182230; + r = func_800D2CA8(func_8002A4B8() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182234; + r = func_800D2CA8(func_8002A998() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A9DC(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182238; + r = func_800D2CA8(func_8002A728() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A76C(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_8018223C; + r = func_800D2CA8(func_80029FD4(), 4); + func_800D2D10(r, 7, p + 0x18, -1); + } +} + + + +// @class: other +// @stuck: none — MATCH + +extern short D_80115128; +extern unsigned short D_80115172; +extern unsigned short D_801820C6; +extern unsigned short D_801820CA; +extern unsigned short D_801820CE; +extern unsigned short D_801820D2; + +extern s32 func_8002A1B4(void); +extern short func_8002A28C(void); +extern short func_8002A27C(void); +extern s32 func_8002A400(void); +extern short func_8002A4D8(void); +extern short func_8002A4C8(void); +extern s32 func_8002A8E0(void); +extern short func_8002A9B8(void); +extern short func_8002A9A8(void); +extern s32 func_8002A670(void); +extern short func_8002A748(void); +extern short func_8002A738(void); +extern int func_801412A8(int, int, int, int, int, int); + +int func_80141100(int param_1) +{ + short sVar1; + int iVar7; + + if (D_80115128 == 0) { + iVar7 = D_80115172 + 0x31; + sVar1 = D_801820C6; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); + sVar1 = D_801820CA; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); + sVar1 = D_801820CE; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); + sVar1 = D_801820D2; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); + } + return param_1; +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_801412A8); + +DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ + +DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ + +DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ + + +extern unsigned short D_80115112; +extern void (*D_8018265C[])(void); + +void func_80141788(void) +{ + D_8018265C[D_80115112](); +} + + +DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ + +DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80141874); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_801418F8); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80141A60); + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80141B90); + +DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) + +extern u16 D_80115110; +extern u8 D_801825BC; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80141C0C(s32 param_1) +{ + func_8002D4C8(*(u16 *)(&D_801825BC + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); +} + + +DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ + +DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ + +DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ + +DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_801424E4); + + +extern void (*D_8018269C[])(void); + +void func_801425CC(void *a0) { + D_8018269C[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: schedule +// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail + +extern void func_8012C1B8(void); +extern s32 func_8012C1DC(s32 a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern s32 func_8012AD50(void *a0); +extern s32 D_80182680; + +void func_80142608(s32 param_1) +{ + register s32 iVar1 __asm__("$16"); + + if (*(short *)(param_1 + 0x70) != 0) { + iVar1 = ((s32 (*)(void))func_8012C1B8)(); + } else { + iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); + } + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CA1C(iVar1, (s32)&D_80182680); + *(short *)(iVar1 + 0x1a) = 0x200; + *(short *)(iVar1 + 0x18) = 0x200; + *(short *)(param_1 + 0xfc) = 0x40; + if (*(short *)(param_1 + 0x70) != 0) { + goto ad50; + } + if (*(s32 *)(param_1 + 100) != 0) { + *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); + goto ad50; + } + } + ((void (*)(s32))func_8012CAE4)(param_1); + return; +ad50: + *(short *)(param_1 + 0x98) = 0; + *(s32 *)(param_1 + 0x90) = 0; + ((void (*)(s32))func_8012AD50)(param_1); +} + + +DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ + +DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ + +DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ + +DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ + +DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801826B0[])(); + +void func_801427EC(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801826B0[*(u16 *)(param_1 + 2)](); + } +} + + +DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ + +DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801826CC[])(); + +void func_8014292C(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801826CC[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_8018289C[])(); + +void func_80142978(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_8018289C[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80182954[])(); + +void func_801429C4(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80182954[*(u16 *)(param_1 + 2)](); + } +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80142A10); + + +// @class: struct +// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) + +extern u16 D_800B99D8; +extern struct packed_word D_801A0664; +extern u8 D_801A0FE0; +extern u8 D_801A0FE1; +extern u8 D_801A0FE2; + +void func_80142A80(void) +{ + u16 flags; + union word_bytes local; + s32 mul; + + flags = D_800B99D8; + local.pw = D_801A0664; + + if (flags & 0x10) { + mul = (s8)((flags & 0xf) >> 1) + 9; + } else { + mul = 0x10 - (s8)((flags & 0xf) >> 1); + } + + D_801A0FE0 = mul * (local.b[0] >> 4); + D_801A0FE1 = mul * (local.b[1] >> 4); + D_801A0FE2 = mul * (local.b[2] >> 4); +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80142B2C); + +DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ + +DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ + +DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ + +DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ + +DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ + +DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern int D_801826A4; + +void func_80142DC4(int param_1) +{ + int v0; + + *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_801826A4); + *(short *)(v0 + 0x1a) = 0x1800; + *(short *)(v0 + 0x18) = 0x1800; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_801826C0[]; + +void func_80142E38(int param_1) +{ + short sVar1; + int iVar2; + + *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_801826C0); + sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; + *(short *)(iVar2 + 0x1a) = sVar1; + *(short *)(iVar2 + 0x18) = sVar1; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80142EC0); + +DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ + +DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result +// survives across func_8001CA1C while $v0 serves the pre-call store/test; +// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_801828AC[]; +extern unsigned char D_8018290C[]; + +void func_8014305C(int param_1) +{ + register int s0_param __asm__("$16") = param_1; + register int s1_copy __asm__("$17"); + int iVar2; + short sVar1; + + iVar2 = ((int (*)(void))func_8012C1B8)(); + *(int *)(s0_param + 0x20) = iVar2; + s1_copy = iVar2; + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(s0_param); + } else { + ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_801828AC); + sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; + *(short *)(s1_copy + 0x1a) = sVar1; + *(short *)(s1_copy + 0x18) = sVar1; + *(short *)(s0_param + 0xfc) = 0; + func_8012A828(s0_param, D_8018290C); + ((void (*)(int))func_80142B2C)(s0_param); + } +} + + +DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ + +DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) + + +extern void *memcpy(void *, const void *, u32); + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern int func_8001CA88(int, void *); +extern s32 func_8012E504(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80142B2C(void *arg0); + +extern u8 D_801A0660; +extern u8 D_801A0FE0; +extern u8 D_801A0FE4; + +void func_801431E8(s32 param_1) { + u8 buf[8]; + s32 iVar5; + u16 uVar2; + s16 sVar4; + + register s32 d __asm__("$16"); + memcpy(buf, &D_801A0660, 4); + iVar5 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = iVar5; + d = iVar5; + if (iVar5 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, void *))func_8001CA88)(d, &D_801A0FE0); + uVar2 = *(u16 *)(param_1 + 0x70); + *(s16 *)(d + 0x76) = -0x10; + sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; + *(s16 *)(d + 0x1a) = sVar4; + *(s16 *)(d + 0x18) = sVar4; + *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; + if (func_8012E504(param_1, 0x33) == 0) { + *(s16 *)(param_1 + 0xfc) = 1; + func_800233CC(&D_801A0FE0, 0x10); + memcpy(&D_801A0FE4, buf, 4); + } else { + *(s16 *)(param_1 + 0xfc) = 0; + } + ((void (*)(s32))func_80142B2C)(param_1); + } +} + + +DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ + +DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ + +DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) + +extern u8 D_800D387C[]; +extern u32 D_80182A64[]; + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80143458(s32 param_1) +{ + s32 p; + u16 v; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + p = *(s32 *)(param_1 + 0x20); + if (*(s32 *)(p + 4) == 0) { + *(s32 *)(p + 4) = 0x50000000; + } + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + v = *(u16 *)(param_1 + 0x34) & 0x7fff; + if (v != 0) { + p = *(s32 *)(param_1 + 0x20); + *(u16 *)(p + 0x1a) = v; + *(u16 *)(p + 0x18) = v; + } + + func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, + D_80182A64[*(u16 *)(param_1 + 0x34) & 3]); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + +DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_8014358C); + +DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ + +DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ + +DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ + +DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ + +DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ + +DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ + + +extern void (*D_80182B8C[])(void); + +void func_80143B30(void *a0) { + D_80182B8C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ + +DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ + + +extern void (*D_80182B98[])(void); + +void func_80143C38(void *a0) { + D_80182B98[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ + + +extern void (*D_80182BA0[])(void); + +void func_80143C98(void *a0) { + D_80182BA0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80143D28); + + +extern void (*D_80182BE8[])(void); + +void func_80143E68(void *a0) { + D_80182BE8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ + +DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ + +DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ + +DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ + + +extern void (*D_80182BFC[])(void); + +void func_80144054(void *a0) { + D_80182BFC[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80144090); + +extern void func_8012C218(void *a0); + +// @class: struct +// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) + +extern void (*D_80182C04[])(); + +void func_801442F8(int param_1) +{ + int iVar1; + + D_80182C04[*(u16 *)(param_1 + 2)](); + iVar1 = *(int *)(param_1 + 0x1c) + 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (0x1d < iVar1) { + func_8012C218(param_1); + } +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern u8 D_80182B80; + +void func_80144364(int param_1) { + int iVar3; + u16 uVar2; + s16 sVar1; + + iVar3 = ((s32 (*)(void))func_8012C194)(); + if (iVar3 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); + *(int *)(param_1 + 0xCC) = iVar3; + *(u16 *)(param_1 + 0xFC) = uVar2; + func_8001CB6C((u8 *)iVar3, (s32)&D_80182B80, 0x250, 0x1A0); + *(s32 *)(iVar3 + 4) = 0x60000000; + *(u8 *)(iVar3 + 0x27) = 0x14; + *(u16 *)(iVar3 + 0x10) = 0x400; + *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); + *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); + *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); + sVar1 = *(s16 *)(param_1 + 0x70); + if (sVar1 != 0) { + *(s16 *)(iVar3 + 0x1A) = sVar1; + *(s16 *)(iVar3 + 0x18) = sVar1; + } else { + *(u16 *)(iVar3 + 0x1A) = 0x2000; + *(u16 *)(iVar3 + 0x18) = 0x2000; + } + *(u16 *)(param_1 + 2) = 1; + } +} + + + + +extern void func_80016714(void *a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *a0); +extern s32 D_80182B94; + +void func_80144458(void *arg0) { + s32 temp_s0; + void *temp_s2; + void *temp_v0; + + temp_s2 = M2C_FIELD(arg0, void **, 0xCC); + if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { + temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); + if (temp_v0 != NULL) { + temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; + M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80182B94 * 0x10); + M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80182B94 * 0x10); + func_8012AD80(arg0); + } + } + M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); + M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); + M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); + if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { + func_80016714(temp_s2, 0x38); + func_8012C218(arg0); + } +} + + +DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ + +DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ + +DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_80182BA8; +extern u8 D_80182BB4; + +void func_8014477C(void *param_1) { + s32 v0; + s32 v1; + register s32 uVar2 __asm__("$2"); + register s32 addr __asm__("$3"); + s32 gv; + s32 fv; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)param_1 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(param_1); + return; + } + ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80182BA8); + if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { + *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); + uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); + if (uVar2 != 0) { + addr = uVar2 & 0xFFFFFFF; + gv = *(u16 *)((addr | 0x80000000) + 8); + fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; + *(u16 *)((s32)param_1 + 0xA) = gv + fv; + } else { + *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; + } + } + ((void (*)(void *, void *))func_8012A828)(param_1, &D_80182BB4); + v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; + *(s16 *)((s32)param_1 + 0x2) = 1; + *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; + *(s32 *)((s32)param_1 + 0x1C) = 0x78; +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); + +extern u8 D_80182B80; +extern u8 D_80182BF0; + +void func_80144880(s32 param_1) +{ + register s32 obj __asm__("$16"); /* $s0 */ + register s32 self __asm__("$17") = param_1; /* $s1 */ + register s32 b __asm__("$2"); /* $v0 */ + s32 e; + + obj = ((s32 (*)(void))func_8012C194)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(self); + } else { + *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); + *(s32 *)(self + 0xCC) = obj; + if (*(s16 *)(self + 0x70) == 1) { + func_8001CB6C((u8 *)obj, (s32)&D_80182B80, 0x250, 0x1A0); + b = 0x14; + } else { + func_8001CB6C((u8 *)obj, (s32)&D_80182BF0, 0x300, 0x1D0); + b = 0x6A; + } + *(u8 *)(obj + 0x27) = (u8)b; + *(s32 *)(obj + 4) = 0x60000000; + *(u16 *)(obj + 0x10) = 0x400; + *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); + *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); + e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); + *(u16 *)(obj + 0x1A) = 0x4000; + *(u16 *)(obj + 0x18) = 0x4000; + *(u16 *)(obj + 0xC) = (u16)e; + *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; + } +} + + +DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ + + +extern void (*D_80182C0C[])(void); + +void func_801449C8(void *a0) { + D_80182C0C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ + + +extern void (*D_80182C14[])(void); + +void func_80144A2C(void *a0) { + D_80182C14[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ + +DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ + +DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ + +DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_801380E0", func_80144B14); + diff --git a/src/ov_SC03_012/ov_SC03_012_jr_8012ACE0.c b/src/ov_SC03_012/ov_SC03_012_jr_8012ACE0.c index 30f407988..84bf9a578 100644 --- a/src/ov_SC03_012/ov_SC03_012_jr_8012ACE0.c +++ b/src/ov_SC03_012/ov_SC03_012_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E74C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E74C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E790; -extern u8 D_8017E7D4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E790; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E7D4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E818[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E854[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E854; - if (((s16)a1) < 0xC00) { - tbl = D_8017E818; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E890, D_8017E892, D_8017E894, D_8017E896, D_8017E898, D_8017E89A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E892 < ang)) goto outer_else; - if (!(ang < D_8017E898)) goto inner_else; - if (ang < D_8017E894) { *(s16 *)L = D_8017E894; goto done; } - if (D_8017E896 < ang) { *(s16 *)L = D_8017E896; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E890) { *(s16 *)L = D_8017E890; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E89A < ang) { *(s16 *)L = D_8017E89A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80193D98; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80193D98, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80193D98; -extern s8 D_80193D9C; -extern s8 D_80193D9D; - -void func_8013C9C4(void * arg0) -{ - D_80193D98 = arg0; - D_80193D9C = 0; - D_80193D9D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80193D98; -extern s8 D_80193D9C; -extern s8 D_80193D9D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80193D98; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80193D9D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80193D9C)) * 2) + D_80193D98); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80193D9D = (unsigned char) p[1]; - D_80193D9C = D_80193D9C + 1; - if (D_80193D9D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80193D9C = 0; - *base = 0; - } - } - else - { - D_80193D9D = c - 1; - } - } - return; -} - - - -extern s32 D_80193DBC; -extern s32 D_80193DB0; -extern s32 D_80193DB4; -extern s32 D_80193DC0; - -void func_8013CABC(void) { - D_80193DBC = 1; - D_80193DB0 = 1; - D_80193DB4 = 0; - D_80193DC0 = 1; -} - - - -extern s32 D_80193DB0; -extern s32 D_80193DB4; -extern s32 D_80193DB8; -extern s32 D_80193DBC; -extern s32 D_80193DC0; - -void func_8013CAE8(void) { - D_80193DB0 = 1; - D_80193DBC = 0; - D_80193DB4 = 0; - D_80193DB8 = -1; - D_80193DC0 = 0; -} - - - -extern s32 D_80193DBC; -extern s32 D_80193DC0; -extern s32 D_80193DE8; -extern s32 D_80193DEC; - -void func_8013CB20(void) -{ - D_80193DE8 = D_80193DC0; - D_80193DEC = D_80193DBC; - D_80193DC0 = 1; - D_80193DBC = 0; -} - - - -extern s32 D_80193DE8; -extern s32 D_80193DEC; -extern s32 D_80193DC0; -extern s32 D_80193DBC; - -void func_8013CB5C(void) { - D_80193DC0 = D_80193DE8; - D_80193DBC = D_80193DEC; -} - - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80195008; - extern u8 D_80195009; - extern u8 D_8019500A; - extern u8 D_8019500B; - extern u8 D_8019500C; - extern u8 D_8019500D; - extern u8 D_8019500E; - extern u8 D_8019500F; - extern u8 D_80195010; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80195008; t1 = D_80195009; t2 = D_8019500A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019500B; t1 = D_8019500C; t2 = D_8019500D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019500E; t1 = D_8019500F; t2 = D_80195010; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80193DC8; -extern s32 D_80193DB0; -extern s32 D_80193DCC; -extern s32 D_80193DBC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80193DC8 != 0) { - if (D_80193DC8 != 2) { - if (((D_80193DC8 < 3) && (D_80193DC8 == 1)) && - (D_80193DCC = D_80193DCC + 1, 0x23a < D_80193DCC)) { - D_80193DB0 = D_80193DC8; - D_80193DC8 = 2; - } - } else { - D_80193DB0 = D_80193DB0 + -1; - if (D_80193DB0 == 0) { - D_80193DB0 = D_80193DC8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80193DBC == 0) { - D_80193DC8 = D_80193DC8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80193DBC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80193DBC; -} - - - -extern s32 D_80193DC8; - -void func_8013D164(void) { - D_80193DC8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801950EA; -extern u8 D_8019515E; -extern u8 D_80195012; -extern u8 D_801950CC; -extern u8 D_80194FF0; -extern u8 D_80195011; -extern s32 D_801950D0; - -void func_8013D330(void) { - if ((D_801950EA & 0xff) != D_8019515E) { - D_801950EA = ((D_801950EA & 0xff) < D_8019515E) ? (D_801950EA + 1) : (D_801950EA - 1); - } - if ((D_80195012 & 0xff) != D_801950CC) { - D_80195012 = ((D_80195012 & 0xff) < D_801950CC) ? (D_80195012 + 1) : (D_80195012 - 1); - } - if ((D_80194FF0 & 0xff) != D_80195011) { - D_80194FF0 = ((D_80194FF0 & 0xff) < D_80195011) ? (D_80194FF0 + 1) : (D_80194FF0 - 1); - } - D_801950D0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80193DA0; -extern void *D_80193DA4; -extern void *D_80193DA8; -extern s32 D_80193DD0; -extern s32 D_80193DD4; -extern s32 D_80193DD8; -extern s32 D_80195044[]; - -extern u8 D_8017E988[]; -extern u8 D_8017EA30[]; -extern u8 D_8017E8E0[]; -extern u8 D_8017E9DC[]; -extern u8 D_8017EA5C[]; -extern u8 D_8017E934[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80193DD0 = param_2; - D_80193DD4 = (param_2 >> 2) & 3; - D_80193DD8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80193DA0 = D_8017E988; - D_80193DA4 = D_8017EA30; - D_80193DA8 = D_8017E8E0; - } else { - D_80193DA0 = D_8017E9DC; - D_80193DA4 = D_8017EA5C; - D_80193DA8 = D_8017E934; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80193DD8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80193DD0 & 2) != 0) { - D_80195044[0] = 0x140; - D_80195044[3] = 0x80; - if (p[0x37] == 4) { - D_80195044[0] = 0x140; - D_80195044[3] = 0; - } - if (p[0x37] == 0) { - D_80195044[0] = 0x140; - D_80195044[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80193DA8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80193DA8; -extern s16 *D_80193DAC; -extern s32 D_80193DBC; -extern s32 D_80193DDC; -extern s32 D_80193DE0; -extern s32 D_80193DE4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80193DAC != 0) { - D_80193DBC = 0; - p = (int *)(param_1 * 12 + (int)D_80193DA8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80193DDC != x) { - flag = 1; - if (D_80193DDC < x) { - if (x - D_80193DDC < 5) { - D_80193DDC = x; - } else { - D_80193DDC = D_80193DDC + 4; - } - } else { - if (D_80193DDC - x < 5) { - D_80193DDC = x; - } else { - D_80193DDC = D_80193DDC - 4; - } - } - } - if (D_80193DE0 != y) { - flag = 1; - if (D_80193DE0 < y) { - if (y - D_80193DE0 < 5) { - D_80193DE0 = y; - } else { - D_80193DE0 = D_80193DE0 + 4; - } - } else { - if (D_80193DE0 - y < 5) { - D_80193DE0 = y; - } else { - D_80193DE0 = D_80193DE0 - 4; - } - } - } - if (D_80193DE4 != z) { - flag = 1; - if (D_80193DE4 < z) { - if (z - D_80193DE4 < 5) { - D_80193DE4 = z; - } else { - D_80193DE4 = D_80193DE4 + 4; - } - } else { - if (D_80193DE4 - z < 5) { - D_80193DE4 = z; - } else { - D_80193DE4 = D_80193DE4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80193DBC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017EAEC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80193DAC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80193DDC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80193DE0); - uVar5 = (*(int*)&D_80193DE4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017EAEC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80193DC4; - -s32 func_8013E054(void) { - return D_80193DC4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F4E8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F4C0; -extern s16 D_8017F4C2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F4E8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F4C0 = 2; - D_8017F4C2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F4C2 = 0; - D_8017F4C0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80193DF8; - extern void * D_80193DFC; - extern unsigned char D_8017F160; - extern unsigned char D_8017F178; - extern unsigned char D_8017F1EC; - extern unsigned char D_8017F1F4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80193DF8 = &D_8017F160; - D_80193DFC = &D_8017F1EC; - } else { - D_80193DF8 = &D_8017F178; - D_80193DFC = &D_8017F1F4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F4E8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F4E8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F4E8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F4C4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F4C4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F4C4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F4C0; -extern s16 D_8017F4C2; -extern unsigned char D_8017F4C4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F4C2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F4C0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F4C2; - if (*r < 3) { - *r = *r + 1; - } - D_8017F4C0 = (u16)D_8017F4C0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F4C4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F4C4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F4C4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_012/ov_SC03_012_jr_801380E0.c b/src/ov_SC03_012/ov_SC03_012_jr_801380E0.c new file mode 100644 index 000000000..bfeb6337f --- /dev/null +++ b/src/ov_SC03_012/ov_SC03_012_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80192B30; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E3E0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80193CB4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801950F0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80192B30; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E11C)(); +extern s16 (*D_8017E120)(); +extern M2C_UNK (*D_8017E128)(); +extern s32 (*D_8017E12C)(); +extern s32 D_80193CB0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80192B34; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E474; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181958; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E48C; +extern M2C_UNK D_8017E494; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E49C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E4B8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E4C4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E4D8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E528[]; +extern s16 D_8017E558[]; +extern s16 D_8017E5B8[]; +extern s16 D_8017E5C0[]; +extern s16 D_8017E5E0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E618[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E670[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E6B8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E6C0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E6C8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E6D0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E678; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E698; +extern void func_801321B0(int param_1); +extern int D_8017E6A8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80193D20; +extern s32 D_80193D24[]; +extern int D_80193D28; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E6DC; +extern u8 D_8017E6D8; +extern s16 *D_8017E6E0; +extern u8 D_8017E6E4; +extern int D_80193D20; +extern u16 D_80193D30; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E6E0; /* holds a pointer value (*(u16**)&D_8017E6E0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E6F4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E748; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E74C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E74C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E790; +extern u8 D_8017E7D4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E790; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E7D4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E818[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E854[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E854; + if (((s16)a1) < 0xC00) { + tbl = D_8017E818; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E890, D_8017E892, D_8017E894, D_8017E896, D_8017E898, D_8017E89A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E892 < ang)) goto outer_else; + if (!(ang < D_8017E898)) goto inner_else; + if (ang < D_8017E894) { *(s16 *)L = D_8017E894; goto done; } + if (D_8017E896 < ang) { *(s16 *)L = D_8017E896; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E890) { *(s16 *)L = D_8017E890; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E89A < ang) { *(s16 *)L = D_8017E89A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80193D98; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80193D98, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80193D98; +extern s8 D_80193D9C; +extern s8 D_80193D9D; + +void func_8013C9C4(void * arg0) +{ + D_80193D98 = arg0; + D_80193D9C = 0; + D_80193D9D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80193D98; +extern s8 D_80193D9C; +extern s8 D_80193D9D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80193D98; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80193D9D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80193D9C)) * 2) + D_80193D98); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80193D9D = (unsigned char) p[1]; + D_80193D9C = D_80193D9C + 1; + if (D_80193D9D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80193D9C = 0; + *base = 0; + } + } + else + { + D_80193D9D = c - 1; + } + } + return; +} + + + +extern s32 D_80193DBC; +extern s32 D_80193DB0; +extern s32 D_80193DB4; +extern s32 D_80193DC0; + +void func_8013CABC(void) { + D_80193DBC = 1; + D_80193DB0 = 1; + D_80193DB4 = 0; + D_80193DC0 = 1; +} + + + +extern s32 D_80193DB0; +extern s32 D_80193DB4; +extern s32 D_80193DB8; +extern s32 D_80193DBC; +extern s32 D_80193DC0; + +void func_8013CAE8(void) { + D_80193DB0 = 1; + D_80193DBC = 0; + D_80193DB4 = 0; + D_80193DB8 = -1; + D_80193DC0 = 0; +} + + + +extern s32 D_80193DBC; +extern s32 D_80193DC0; +extern s32 D_80193DE8; +extern s32 D_80193DEC; + +void func_8013CB20(void) +{ + D_80193DE8 = D_80193DC0; + D_80193DEC = D_80193DBC; + D_80193DC0 = 1; + D_80193DBC = 0; +} + + + +extern s32 D_80193DE8; +extern s32 D_80193DEC; +extern s32 D_80193DC0; +extern s32 D_80193DBC; + +void func_8013CB5C(void) { + D_80193DC0 = D_80193DE8; + D_80193DBC = D_80193DEC; +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80195008; + extern u8 D_80195009; + extern u8 D_8019500A; + extern u8 D_8019500B; + extern u8 D_8019500C; + extern u8 D_8019500D; + extern u8 D_8019500E; + extern u8 D_8019500F; + extern u8 D_80195010; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80195008; t1 = D_80195009; t2 = D_8019500A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019500B; t1 = D_8019500C; t2 = D_8019500D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019500E; t1 = D_8019500F; t2 = D_80195010; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80193DC8; +extern s32 D_80193DB0; +extern s32 D_80193DCC; +extern s32 D_80193DBC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80193DC8 != 0) { + if (D_80193DC8 != 2) { + if (((D_80193DC8 < 3) && (D_80193DC8 == 1)) && + (D_80193DCC = D_80193DCC + 1, 0x23a < D_80193DCC)) { + D_80193DB0 = D_80193DC8; + D_80193DC8 = 2; + } + } else { + D_80193DB0 = D_80193DB0 + -1; + if (D_80193DB0 == 0) { + D_80193DB0 = D_80193DC8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80193DBC == 0) { + D_80193DC8 = D_80193DC8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80193DBC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80193DBC; +} + + + +extern s32 D_80193DC8; + +void func_8013D164(void) { + D_80193DC8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801950EA; +extern u8 D_8019515E; +extern u8 D_80195012; +extern u8 D_801950CC; +extern u8 D_80194FF0; +extern u8 D_80195011; +extern s32 D_801950D0; + +void func_8013D330(void) { + if ((D_801950EA & 0xff) != D_8019515E) { + D_801950EA = ((D_801950EA & 0xff) < D_8019515E) ? (D_801950EA + 1) : (D_801950EA - 1); + } + if ((D_80195012 & 0xff) != D_801950CC) { + D_80195012 = ((D_80195012 & 0xff) < D_801950CC) ? (D_80195012 + 1) : (D_80195012 - 1); + } + if ((D_80194FF0 & 0xff) != D_80195011) { + D_80194FF0 = ((D_80194FF0 & 0xff) < D_80195011) ? (D_80194FF0 + 1) : (D_80194FF0 - 1); + } + D_801950D0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80193DA0; +extern void *D_80193DA4; +extern void *D_80193DA8; +extern s32 D_80193DD0; +extern s32 D_80193DD4; +extern s32 D_80193DD8; +extern s32 D_80195044[]; + +extern u8 D_8017E988[]; +extern u8 D_8017EA30[]; +extern u8 D_8017E8E0[]; +extern u8 D_8017E9DC[]; +extern u8 D_8017EA5C[]; +extern u8 D_8017E934[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80193DD0 = param_2; + D_80193DD4 = (param_2 >> 2) & 3; + D_80193DD8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80193DA0 = D_8017E988; + D_80193DA4 = D_8017EA30; + D_80193DA8 = D_8017E8E0; + } else { + D_80193DA0 = D_8017E9DC; + D_80193DA4 = D_8017EA5C; + D_80193DA8 = D_8017E934; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80193DD8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80193DD0 & 2) != 0) { + D_80195044[0] = 0x140; + D_80195044[3] = 0x80; + if (p[0x37] == 4) { + D_80195044[0] = 0x140; + D_80195044[3] = 0; + } + if (p[0x37] == 0) { + D_80195044[0] = 0x140; + D_80195044[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80193DA8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80193DA8; +extern s16 *D_80193DAC; +extern s32 D_80193DBC; +extern s32 D_80193DDC; +extern s32 D_80193DE0; +extern s32 D_80193DE4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80193DAC != 0) { + D_80193DBC = 0; + p = (int *)(param_1 * 12 + (int)D_80193DA8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80193DDC != x) { + flag = 1; + if (D_80193DDC < x) { + if (x - D_80193DDC < 5) { + D_80193DDC = x; + } else { + D_80193DDC = D_80193DDC + 4; + } + } else { + if (D_80193DDC - x < 5) { + D_80193DDC = x; + } else { + D_80193DDC = D_80193DDC - 4; + } + } + } + if (D_80193DE0 != y) { + flag = 1; + if (D_80193DE0 < y) { + if (y - D_80193DE0 < 5) { + D_80193DE0 = y; + } else { + D_80193DE0 = D_80193DE0 + 4; + } + } else { + if (D_80193DE0 - y < 5) { + D_80193DE0 = y; + } else { + D_80193DE0 = D_80193DE0 - 4; + } + } + } + if (D_80193DE4 != z) { + flag = 1; + if (D_80193DE4 < z) { + if (z - D_80193DE4 < 5) { + D_80193DE4 = z; + } else { + D_80193DE4 = D_80193DE4 + 4; + } + } else { + if (D_80193DE4 - z < 5) { + D_80193DE4 = z; + } else { + D_80193DE4 = D_80193DE4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80193DBC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017EAEC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80193DAC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80193DDC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80193DE0); + uVar5 = (*(int*)&D_80193DE4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017EAEC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80193DC4; + +s32 func_8013E054(void) { + return D_80193DC4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F4E8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F4C0; +extern s16 D_8017F4C2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F4E8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F4C0 = 2; + D_8017F4C2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F4C2 = 0; + D_8017F4C0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80193DF8; + extern void * D_80193DFC; + extern unsigned char D_8017F160; + extern unsigned char D_8017F178; + extern unsigned char D_8017F1EC; + extern unsigned char D_8017F1F4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80193DF8 = &D_8017F160; + D_80193DFC = &D_8017F1EC; + } else { + D_80193DF8 = &D_8017F178; + D_80193DFC = &D_8017F1F4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F4E8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F4E8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F4E8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F4C4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F4C4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F4C4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F4C0; +extern s16 D_8017F4C2; +extern unsigned char D_8017F4C4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F4C2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F4C0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F4C2; + if (*r < 3) { + *r = *r + 1; + } + D_8017F4C0 = (u16)D_8017F4C0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F4C4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F4C4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F4C4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_013/ov_SC03_013_jr_8012ACE0.c b/src/ov_SC03_013/ov_SC03_013_jr_8012ACE0.c index 0ea3e1084..e22eea679 100644 --- a/src/ov_SC03_013/ov_SC03_013_jr_8012ACE0.c +++ b/src/ov_SC03_013/ov_SC03_013_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80181534[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80181534[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80181578; -extern u8 D_801815BC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80181578; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801815BC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181600[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018163C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018163C; - if (((s16)a1) < 0xC00) { - tbl = D_80181600; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80181678, D_8018167A, D_8018167C, D_8018167E, D_80181680, D_80181682; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018167A < ang)) goto outer_else; - if (!(ang < D_80181680)) goto inner_else; - if (ang < D_8018167C) { *(s16 *)L = D_8018167C; goto done; } - if (D_8018167E < ang) { *(s16 *)L = D_8018167E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80181678) { *(s16 *)L = D_80181678; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80181682 < ang) { *(s16 *)L = D_80181682; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801AC068; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801AC068, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801AC068; -extern s8 D_801AC06C; -extern s8 D_801AC06D; - -void func_8013C9C4(void * arg0) -{ - D_801AC068 = arg0; - D_801AC06C = 0; - D_801AC06D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801AC068; -extern s8 D_801AC06C; -extern s8 D_801AC06D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801AC068; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801AC06D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801AC06C)) * 2) + D_801AC068); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801AC06D = (unsigned char) p[1]; - D_801AC06C = D_801AC06C + 1; - if (D_801AC06D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801AC06C = 0; - *base = 0; - } - } - else - { - D_801AC06D = c - 1; - } - } - return; -} - - - -extern s32 D_801AC08C; -extern s32 D_801AC080; -extern s32 D_801AC084; -extern s32 D_801AC090; - -void func_8013CABC(void) { - D_801AC08C = 1; - D_801AC080 = 1; - D_801AC084 = 0; - D_801AC090 = 1; -} - - - -extern s32 D_801AC080; -extern s32 D_801AC084; -extern s32 D_801AC088; -extern s32 D_801AC08C; -extern s32 D_801AC090; - -void func_8013CAE8(void) { - D_801AC080 = 1; - D_801AC08C = 0; - D_801AC084 = 0; - D_801AC088 = -1; - D_801AC090 = 0; -} - - - -extern s32 D_801AC08C; -extern s32 D_801AC090; -extern s32 D_801AC0B8; -extern s32 D_801AC0BC; - -void func_8013CB20(void) -{ - D_801AC0B8 = D_801AC090; - D_801AC0BC = D_801AC08C; - D_801AC090 = 1; - D_801AC08C = 0; -} - - - -extern s32 D_801AC0B8; -extern s32 D_801AC0BC; -extern s32 D_801AC090; -extern s32 D_801AC08C; - -void func_8013CB5C(void) { - D_801AC090 = D_801AC0B8; - D_801AC08C = D_801AC0BC; -} - - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AD400; - extern u8 D_801AD401; - extern u8 D_801AD402; - extern u8 D_801AD403; - extern u8 D_801AD404; - extern u8 D_801AD405; - extern u8 D_801AD406; - extern u8 D_801AD407; - extern u8 D_801AD408; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AD400; t1 = D_801AD401; t2 = D_801AD402; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AD403; t1 = D_801AD404; t2 = D_801AD405; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AD406; t1 = D_801AD407; t2 = D_801AD408; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801AC098; -extern s32 D_801AC080; -extern s32 D_801AC09C; -extern s32 D_801AC08C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801AC098 != 0) { - if (D_801AC098 != 2) { - if (((D_801AC098 < 3) && (D_801AC098 == 1)) && - (D_801AC09C = D_801AC09C + 1, 0x23a < D_801AC09C)) { - D_801AC080 = D_801AC098; - D_801AC098 = 2; - } - } else { - D_801AC080 = D_801AC080 + -1; - if (D_801AC080 == 0) { - D_801AC080 = D_801AC098; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801AC08C == 0) { - D_801AC098 = D_801AC098 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801AC08C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801AC08C; -} - - - -extern s32 D_801AC098; - -void func_8013D164(void) { - D_801AC098 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AD4E2; -extern u8 D_801AD556; -extern u8 D_801AD40A; -extern u8 D_801AD4C4; -extern u8 D_801AD3E8; -extern u8 D_801AD409; -extern s32 D_801AD4C8; - -void func_8013D330(void) { - if ((D_801AD4E2 & 0xff) != D_801AD556) { - D_801AD4E2 = ((D_801AD4E2 & 0xff) < D_801AD556) ? (D_801AD4E2 + 1) : (D_801AD4E2 - 1); - } - if ((D_801AD40A & 0xff) != D_801AD4C4) { - D_801AD40A = ((D_801AD40A & 0xff) < D_801AD4C4) ? (D_801AD40A + 1) : (D_801AD40A - 1); - } - if ((D_801AD3E8 & 0xff) != D_801AD409) { - D_801AD3E8 = ((D_801AD3E8 & 0xff) < D_801AD409) ? (D_801AD3E8 + 1) : (D_801AD3E8 - 1); - } - D_801AD4C8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801AC070; -extern void *D_801AC074; -extern void *D_801AC078; -extern s32 D_801AC0A0; -extern s32 D_801AC0A4; -extern s32 D_801AC0A8; -extern s32 D_801AD43C[]; - -extern u8 D_80181770[]; -extern u8 D_80181818[]; -extern u8 D_801816C8[]; -extern u8 D_801817C4[]; -extern u8 D_80181844[]; -extern u8 D_8018171C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801AC0A0 = param_2; - D_801AC0A4 = (param_2 >> 2) & 3; - D_801AC0A8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801AC070 = D_80181770; - D_801AC074 = D_80181818; - D_801AC078 = D_801816C8; - } else { - D_801AC070 = D_801817C4; - D_801AC074 = D_80181844; - D_801AC078 = D_8018171C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801AC0A8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801AC0A0 & 2) != 0) { - D_801AD43C[0] = 0x140; - D_801AD43C[3] = 0x80; - if (p[0x37] == 4) { - D_801AD43C[0] = 0x140; - D_801AD43C[3] = 0; - } - if (p[0x37] == 0) { - D_801AD43C[0] = 0x140; - D_801AD43C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801AC078)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801AC078; -extern s16 *D_801AC07C; -extern s32 D_801AC08C; -extern s32 D_801AC0AC; -extern s32 D_801AC0B0; -extern s32 D_801AC0B4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801AC07C != 0) { - D_801AC08C = 0; - p = (int *)(param_1 * 12 + (int)D_801AC078); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801AC0AC != x) { - flag = 1; - if (D_801AC0AC < x) { - if (x - D_801AC0AC < 5) { - D_801AC0AC = x; - } else { - D_801AC0AC = D_801AC0AC + 4; - } - } else { - if (D_801AC0AC - x < 5) { - D_801AC0AC = x; - } else { - D_801AC0AC = D_801AC0AC - 4; - } - } - } - if (D_801AC0B0 != y) { - flag = 1; - if (D_801AC0B0 < y) { - if (y - D_801AC0B0 < 5) { - D_801AC0B0 = y; - } else { - D_801AC0B0 = D_801AC0B0 + 4; - } - } else { - if (D_801AC0B0 - y < 5) { - D_801AC0B0 = y; - } else { - D_801AC0B0 = D_801AC0B0 - 4; - } - } - } - if (D_801AC0B4 != z) { - flag = 1; - if (D_801AC0B4 < z) { - if (z - D_801AC0B4 < 5) { - D_801AC0B4 = z; - } else { - D_801AC0B4 = D_801AC0B4 + 4; - } - } else { - if (D_801AC0B4 - z < 5) { - D_801AC0B4 = z; - } else { - D_801AC0B4 = D_801AC0B4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801AC08C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801818D4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801AC07C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AC0AC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AC0B0); - uVar5 = (*(int*)&D_801AC0B4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801818D4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801AC094; - -s32 func_8013E054(void) { - return D_801AC094; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801822D0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801822A8; -extern s16 D_801822AA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801822D0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801822A8 = 2; - D_801822AA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801822AA = 0; - D_801822A8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801AC0C8; - extern void * D_801AC0CC; - extern unsigned char D_80181F48; - extern unsigned char D_80181F60; - extern unsigned char D_80181FD4; - extern unsigned char D_80181FDC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801AC0C8 = &D_80181F48; - D_801AC0CC = &D_80181FD4; - } else { - D_801AC0C8 = &D_80181F60; - D_801AC0CC = &D_80181FDC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801822D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801822D0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801822D0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801822AC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801822AC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801822AC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801822A8; -extern s16 D_801822AA; -extern unsigned char D_801822AC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801822AA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801822A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801822AA; - if (*r < 3) { - *r = *r + 1; - } - D_801822A8 = (u16)D_801822A8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822AC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801822AC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822AC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_013/ov_SC03_013_jr_801380E0.c b/src/ov_SC03_013/ov_SC03_013_jr_801380E0.c new file mode 100644 index 000000000..2426d2d86 --- /dev/null +++ b/src/ov_SC03_013/ov_SC03_013_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AADC8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801811C8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801ABF84; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AD4E8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AADC8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180F04)(); +extern s16 (*D_80180F08)(); +extern M2C_UNK (*D_80180F10)(); +extern s32 (*D_80180F14)(); +extern s32 D_801ABF80; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AADCC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018125C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80184740; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80181274; +extern M2C_UNK D_8018127C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80181284; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801812A0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801812AC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801812C0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181310[]; +extern s16 D_80181340[]; +extern s16 D_801813A0[]; +extern s16 D_801813A8[]; +extern s16 D_801813C8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80181400[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80181458[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801814A0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801814A8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801814B0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801814B8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80181460; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80181480; +extern void func_801321B0(int param_1); +extern int D_80181490; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801ABFF0; +extern s32 D_801ABFF4[]; +extern int D_801ABFF8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801814C4; +extern u8 D_801814C0; +extern s16 *D_801814C8; +extern u8 D_801814CC; +extern int D_801ABFF0; +extern u16 D_801AC000; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801814C8; /* holds a pointer value (*(u16**)&D_801814C8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801814DC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80181530; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80181534[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80181534[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80181578; +extern u8 D_801815BC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80181578; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801815BC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181600[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018163C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018163C; + if (((s16)a1) < 0xC00) { + tbl = D_80181600; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80181678, D_8018167A, D_8018167C, D_8018167E, D_80181680, D_80181682; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018167A < ang)) goto outer_else; + if (!(ang < D_80181680)) goto inner_else; + if (ang < D_8018167C) { *(s16 *)L = D_8018167C; goto done; } + if (D_8018167E < ang) { *(s16 *)L = D_8018167E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80181678) { *(s16 *)L = D_80181678; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181682 < ang) { *(s16 *)L = D_80181682; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801AC068; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801AC068, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801AC068; +extern s8 D_801AC06C; +extern s8 D_801AC06D; + +void func_8013C9C4(void * arg0) +{ + D_801AC068 = arg0; + D_801AC06C = 0; + D_801AC06D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801AC068; +extern s8 D_801AC06C; +extern s8 D_801AC06D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801AC068; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801AC06D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801AC06C)) * 2) + D_801AC068); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801AC06D = (unsigned char) p[1]; + D_801AC06C = D_801AC06C + 1; + if (D_801AC06D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801AC06C = 0; + *base = 0; + } + } + else + { + D_801AC06D = c - 1; + } + } + return; +} + + + +extern s32 D_801AC08C; +extern s32 D_801AC080; +extern s32 D_801AC084; +extern s32 D_801AC090; + +void func_8013CABC(void) { + D_801AC08C = 1; + D_801AC080 = 1; + D_801AC084 = 0; + D_801AC090 = 1; +} + + + +extern s32 D_801AC080; +extern s32 D_801AC084; +extern s32 D_801AC088; +extern s32 D_801AC08C; +extern s32 D_801AC090; + +void func_8013CAE8(void) { + D_801AC080 = 1; + D_801AC08C = 0; + D_801AC084 = 0; + D_801AC088 = -1; + D_801AC090 = 0; +} + + + +extern s32 D_801AC08C; +extern s32 D_801AC090; +extern s32 D_801AC0B8; +extern s32 D_801AC0BC; + +void func_8013CB20(void) +{ + D_801AC0B8 = D_801AC090; + D_801AC0BC = D_801AC08C; + D_801AC090 = 1; + D_801AC08C = 0; +} + + + +extern s32 D_801AC0B8; +extern s32 D_801AC0BC; +extern s32 D_801AC090; +extern s32 D_801AC08C; + +void func_8013CB5C(void) { + D_801AC090 = D_801AC0B8; + D_801AC08C = D_801AC0BC; +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AD400; + extern u8 D_801AD401; + extern u8 D_801AD402; + extern u8 D_801AD403; + extern u8 D_801AD404; + extern u8 D_801AD405; + extern u8 D_801AD406; + extern u8 D_801AD407; + extern u8 D_801AD408; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AD400; t1 = D_801AD401; t2 = D_801AD402; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AD403; t1 = D_801AD404; t2 = D_801AD405; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AD406; t1 = D_801AD407; t2 = D_801AD408; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801AC098; +extern s32 D_801AC080; +extern s32 D_801AC09C; +extern s32 D_801AC08C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801AC098 != 0) { + if (D_801AC098 != 2) { + if (((D_801AC098 < 3) && (D_801AC098 == 1)) && + (D_801AC09C = D_801AC09C + 1, 0x23a < D_801AC09C)) { + D_801AC080 = D_801AC098; + D_801AC098 = 2; + } + } else { + D_801AC080 = D_801AC080 + -1; + if (D_801AC080 == 0) { + D_801AC080 = D_801AC098; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801AC08C == 0) { + D_801AC098 = D_801AC098 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801AC08C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801AC08C; +} + + + +extern s32 D_801AC098; + +void func_8013D164(void) { + D_801AC098 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AD4E2; +extern u8 D_801AD556; +extern u8 D_801AD40A; +extern u8 D_801AD4C4; +extern u8 D_801AD3E8; +extern u8 D_801AD409; +extern s32 D_801AD4C8; + +void func_8013D330(void) { + if ((D_801AD4E2 & 0xff) != D_801AD556) { + D_801AD4E2 = ((D_801AD4E2 & 0xff) < D_801AD556) ? (D_801AD4E2 + 1) : (D_801AD4E2 - 1); + } + if ((D_801AD40A & 0xff) != D_801AD4C4) { + D_801AD40A = ((D_801AD40A & 0xff) < D_801AD4C4) ? (D_801AD40A + 1) : (D_801AD40A - 1); + } + if ((D_801AD3E8 & 0xff) != D_801AD409) { + D_801AD3E8 = ((D_801AD3E8 & 0xff) < D_801AD409) ? (D_801AD3E8 + 1) : (D_801AD3E8 - 1); + } + D_801AD4C8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801AC070; +extern void *D_801AC074; +extern void *D_801AC078; +extern s32 D_801AC0A0; +extern s32 D_801AC0A4; +extern s32 D_801AC0A8; +extern s32 D_801AD43C[]; + +extern u8 D_80181770[]; +extern u8 D_80181818[]; +extern u8 D_801816C8[]; +extern u8 D_801817C4[]; +extern u8 D_80181844[]; +extern u8 D_8018171C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801AC0A0 = param_2; + D_801AC0A4 = (param_2 >> 2) & 3; + D_801AC0A8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801AC070 = D_80181770; + D_801AC074 = D_80181818; + D_801AC078 = D_801816C8; + } else { + D_801AC070 = D_801817C4; + D_801AC074 = D_80181844; + D_801AC078 = D_8018171C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801AC0A8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801AC0A0 & 2) != 0) { + D_801AD43C[0] = 0x140; + D_801AD43C[3] = 0x80; + if (p[0x37] == 4) { + D_801AD43C[0] = 0x140; + D_801AD43C[3] = 0; + } + if (p[0x37] == 0) { + D_801AD43C[0] = 0x140; + D_801AD43C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801AC078)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801AC078; +extern s16 *D_801AC07C; +extern s32 D_801AC08C; +extern s32 D_801AC0AC; +extern s32 D_801AC0B0; +extern s32 D_801AC0B4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801AC07C != 0) { + D_801AC08C = 0; + p = (int *)(param_1 * 12 + (int)D_801AC078); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801AC0AC != x) { + flag = 1; + if (D_801AC0AC < x) { + if (x - D_801AC0AC < 5) { + D_801AC0AC = x; + } else { + D_801AC0AC = D_801AC0AC + 4; + } + } else { + if (D_801AC0AC - x < 5) { + D_801AC0AC = x; + } else { + D_801AC0AC = D_801AC0AC - 4; + } + } + } + if (D_801AC0B0 != y) { + flag = 1; + if (D_801AC0B0 < y) { + if (y - D_801AC0B0 < 5) { + D_801AC0B0 = y; + } else { + D_801AC0B0 = D_801AC0B0 + 4; + } + } else { + if (D_801AC0B0 - y < 5) { + D_801AC0B0 = y; + } else { + D_801AC0B0 = D_801AC0B0 - 4; + } + } + } + if (D_801AC0B4 != z) { + flag = 1; + if (D_801AC0B4 < z) { + if (z - D_801AC0B4 < 5) { + D_801AC0B4 = z; + } else { + D_801AC0B4 = D_801AC0B4 + 4; + } + } else { + if (D_801AC0B4 - z < 5) { + D_801AC0B4 = z; + } else { + D_801AC0B4 = D_801AC0B4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801AC08C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801818D4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801AC07C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AC0AC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AC0B0); + uVar5 = (*(int*)&D_801AC0B4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801818D4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801AC094; + +s32 func_8013E054(void) { + return D_801AC094; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801822D0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801822A8; +extern s16 D_801822AA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801822D0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801822A8 = 2; + D_801822AA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801822AA = 0; + D_801822A8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801AC0C8; + extern void * D_801AC0CC; + extern unsigned char D_80181F48; + extern unsigned char D_80181F60; + extern unsigned char D_80181FD4; + extern unsigned char D_80181FDC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801AC0C8 = &D_80181F48; + D_801AC0CC = &D_80181FD4; + } else { + D_801AC0C8 = &D_80181F60; + D_801AC0CC = &D_80181FDC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801822D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801822D0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801822D0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801822AC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801822AC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801822AC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801822A8; +extern s16 D_801822AA; +extern unsigned char D_801822AC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801822AA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801822A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801822AA; + if (*r < 3) { + *r = *r + 1; + } + D_801822A8 = (u16)D_801822A8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822AC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801822AC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822AC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.c b/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.c index 01f51188c..7fe974a9c 100644 --- a/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.c +++ b/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018BB70[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018BB70[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018BBB4; -extern u8 D_8018BBF8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018BBB4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018BBF8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018BC3C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018BC78[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018BC78; - if (((s16)a1) < 0xC00) { - tbl = D_8018BC3C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018BCB4, D_8018BCB6, D_8018BCB8, D_8018BCBA, D_8018BCBC, D_8018BCBE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018BCB6 < ang)) goto outer_else; - if (!(ang < D_8018BCBC)) goto inner_else; - if (ang < D_8018BCB8) { *(s16 *)L = D_8018BCB8; goto done; } - if (D_8018BCBA < ang) { *(s16 *)L = D_8018BCBA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018BCB4) { *(s16 *)L = D_8018BCB4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018BCBE < ang) { *(s16 *)L = D_8018BCBE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E95E8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E95E8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E95E8; -extern s8 D_801E95EC; -extern s8 D_801E95ED; - -void func_8013C9C4(void * arg0) -{ - D_801E95E8 = arg0; - D_801E95EC = 0; - D_801E95ED = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E95E8; -extern s8 D_801E95EC; -extern s8 D_801E95ED; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E95E8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E95ED; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E95EC)) * 2) + D_801E95E8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E95ED = (unsigned char) p[1]; - D_801E95EC = D_801E95EC + 1; - if (D_801E95ED == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E95EC = 0; - *base = 0; - } - } - else - { - D_801E95ED = c - 1; - } - } - return; -} - - - -extern s32 D_801E960C; -extern s32 D_801E9600; -extern s32 D_801E9604; -extern s32 D_801E9610; - -void func_8013CABC(void) { - D_801E960C = 1; - D_801E9600 = 1; - D_801E9604 = 0; - D_801E9610 = 1; -} - - - -extern s32 D_801E9600; -extern s32 D_801E9604; -extern s32 D_801E9608; -extern s32 D_801E960C; -extern s32 D_801E9610; - -void func_8013CAE8(void) { - D_801E9600 = 1; - D_801E960C = 0; - D_801E9604 = 0; - D_801E9608 = -1; - D_801E9610 = 0; -} - - - -extern s32 D_801E960C; -extern s32 D_801E9610; -extern s32 D_801E9638; -extern s32 D_801E963C; - -void func_8013CB20(void) -{ - D_801E9638 = D_801E9610; - D_801E963C = D_801E960C; - D_801E9610 = 1; - D_801E960C = 0; -} - - - -extern s32 D_801E9638; -extern s32 D_801E963C; -extern s32 D_801E9610; -extern s32 D_801E960C; - -void func_8013CB5C(void) { - D_801E9610 = D_801E9638; - D_801E960C = D_801E963C; -} - - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EAEE8; - extern u8 D_801EAEE9; - extern u8 D_801EAEEA; - extern u8 D_801EAEEB; - extern u8 D_801EAEEC; - extern u8 D_801EAEED; - extern u8 D_801EAEEE; - extern u8 D_801EAEEF; - extern u8 D_801EAEF0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EAEE8; t1 = D_801EAEE9; t2 = D_801EAEEA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EAEEB; t1 = D_801EAEEC; t2 = D_801EAEED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EAEEE; t1 = D_801EAEEF; t2 = D_801EAEF0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E9618; -extern s32 D_801E9600; -extern s32 D_801E961C; -extern s32 D_801E960C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E9618 != 0) { - if (D_801E9618 != 2) { - if (((D_801E9618 < 3) && (D_801E9618 == 1)) && - (D_801E961C = D_801E961C + 1, 0x23a < D_801E961C)) { - D_801E9600 = D_801E9618; - D_801E9618 = 2; - } - } else { - D_801E9600 = D_801E9600 + -1; - if (D_801E9600 == 0) { - D_801E9600 = D_801E9618; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E960C == 0) { - D_801E9618 = D_801E9618 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E960C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E960C; -} - - - -extern s32 D_801E9618; - -void func_8013D164(void) { - D_801E9618 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EAFCA; -extern u8 D_801EB03E; -extern u8 D_801EAEF2; -extern u8 D_801EAFAC; -extern u8 D_801EAED0; -extern u8 D_801EAEF1; -extern s32 D_801EAFB0; - -void func_8013D330(void) { - if ((D_801EAFCA & 0xff) != D_801EB03E) { - D_801EAFCA = ((D_801EAFCA & 0xff) < D_801EB03E) ? (D_801EAFCA + 1) : (D_801EAFCA - 1); - } - if ((D_801EAEF2 & 0xff) != D_801EAFAC) { - D_801EAEF2 = ((D_801EAEF2 & 0xff) < D_801EAFAC) ? (D_801EAEF2 + 1) : (D_801EAEF2 - 1); - } - if ((D_801EAED0 & 0xff) != D_801EAEF1) { - D_801EAED0 = ((D_801EAED0 & 0xff) < D_801EAEF1) ? (D_801EAED0 + 1) : (D_801EAED0 - 1); - } - D_801EAFB0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E95F0; -extern void *D_801E95F4; -extern void *D_801E95F8; -extern s32 D_801E9620; -extern s32 D_801E9624; -extern s32 D_801E9628; -extern s32 D_801EAF24[]; - -extern u8 D_8018BDAC[]; -extern u8 D_8018BE54[]; -extern u8 D_8018BD04[]; -extern u8 D_8018BE00[]; -extern u8 D_8018BE80[]; -extern u8 D_8018BD58[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E9620 = param_2; - D_801E9624 = (param_2 >> 2) & 3; - D_801E9628 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E95F0 = D_8018BDAC; - D_801E95F4 = D_8018BE54; - D_801E95F8 = D_8018BD04; - } else { - D_801E95F0 = D_8018BE00; - D_801E95F4 = D_8018BE80; - D_801E95F8 = D_8018BD58; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E9628 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E9620 & 2) != 0) { - D_801EAF24[0] = 0x140; - D_801EAF24[3] = 0x80; - if (p[0x37] == 4) { - D_801EAF24[0] = 0x140; - D_801EAF24[3] = 0; - } - if (p[0x37] == 0) { - D_801EAF24[0] = 0x140; - D_801EAF24[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E95F8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E95F8; -extern s16 *D_801E95FC; -extern s32 D_801E960C; -extern s32 D_801E962C; -extern s32 D_801E9630; -extern s32 D_801E9634; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E95FC != 0) { - D_801E960C = 0; - p = (int *)(param_1 * 12 + (int)D_801E95F8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E962C != x) { - flag = 1; - if (D_801E962C < x) { - if (x - D_801E962C < 5) { - D_801E962C = x; - } else { - D_801E962C = D_801E962C + 4; - } - } else { - if (D_801E962C - x < 5) { - D_801E962C = x; - } else { - D_801E962C = D_801E962C - 4; - } - } - } - if (D_801E9630 != y) { - flag = 1; - if (D_801E9630 < y) { - if (y - D_801E9630 < 5) { - D_801E9630 = y; - } else { - D_801E9630 = D_801E9630 + 4; - } - } else { - if (D_801E9630 - y < 5) { - D_801E9630 = y; - } else { - D_801E9630 = D_801E9630 - 4; - } - } - } - if (D_801E9634 != z) { - flag = 1; - if (D_801E9634 < z) { - if (z - D_801E9634 < 5) { - D_801E9634 = z; - } else { - D_801E9634 = D_801E9634 + 4; - } - } else { - if (D_801E9634 - z < 5) { - D_801E9634 = z; - } else { - D_801E9634 = D_801E9634 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E960C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018BF10[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E95FC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E962C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E9630); - uVar5 = (*(int*)&D_801E9634); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018BF10); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E9614; - -s32 func_8013E054(void) { - return D_801E9614; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018C90C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018C8E4; -extern s16 D_8018C8E6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018C90C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018C8E4 = 2; - D_8018C8E6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018C8E6 = 0; - D_8018C8E4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E9648; - extern void * D_801E964C; - extern unsigned char D_8018C584; - extern unsigned char D_8018C59C; - extern unsigned char D_8018C610; - extern unsigned char D_8018C618; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E9648 = &D_8018C584; - D_801E964C = &D_8018C610; - } else { - D_801E9648 = &D_8018C59C; - D_801E964C = &D_8018C618; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018C90C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C90C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018C90C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018C8E8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C8E8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C8E8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018C8E4; -extern s16 D_8018C8E6; -extern unsigned char D_8018C8E8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C8E6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018C8E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018C8E6; - if (*r < 3) { - *r = *r + 1; - } - D_8018C8E4 = (u16)D_8018C8E4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018C8E8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_014/ov_SC03_014_jr_801380E0.c b/src/ov_SC03_014/ov_SC03_014_jr_801380E0.c new file mode 100644 index 000000000..2c1b3ac05 --- /dev/null +++ b/src/ov_SC03_014/ov_SC03_014_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E819C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018B804[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E9504; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EAFD0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E819C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018B540)(); +extern s16 (*D_8018B544)(); +extern M2C_UNK (*D_8018B54C)(); +extern s32 (*D_8018B550)(); +extern s32 D_801E9500; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E81A0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018B898; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018ED7C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018B8B0; +extern M2C_UNK D_8018B8B8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018B8C0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018B8DC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018B8E8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018B8FC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B94C[]; +extern s16 D_8018B97C[]; +extern s16 D_8018B9DC[]; +extern s16 D_8018B9E4[]; +extern s16 D_8018BA04[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018BA3C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018BA94[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018BADC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018BAE4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018BAEC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018BAF4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018BA9C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018BABC; +extern void func_801321B0(int param_1); +extern int D_8018BACC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E9570; +extern s32 D_801E9574[]; +extern int D_801E9578; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018BB00; +extern u8 D_8018BAFC; +extern s16 *D_8018BB04; +extern u8 D_8018BB08; +extern int D_801E9570; +extern u16 D_801E9580; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018BB04; /* holds a pointer value (*(u16**)&D_8018BB04) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018BB18[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018BB6C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018BB70[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018BB70[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018BBB4; +extern u8 D_8018BBF8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018BBB4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018BBF8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018BC3C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018BC78[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018BC78; + if (((s16)a1) < 0xC00) { + tbl = D_8018BC3C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018BCB4, D_8018BCB6, D_8018BCB8, D_8018BCBA, D_8018BCBC, D_8018BCBE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018BCB6 < ang)) goto outer_else; + if (!(ang < D_8018BCBC)) goto inner_else; + if (ang < D_8018BCB8) { *(s16 *)L = D_8018BCB8; goto done; } + if (D_8018BCBA < ang) { *(s16 *)L = D_8018BCBA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018BCB4) { *(s16 *)L = D_8018BCB4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018BCBE < ang) { *(s16 *)L = D_8018BCBE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E95E8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E95E8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E95E8; +extern s8 D_801E95EC; +extern s8 D_801E95ED; + +void func_8013C9C4(void * arg0) +{ + D_801E95E8 = arg0; + D_801E95EC = 0; + D_801E95ED = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E95E8; +extern s8 D_801E95EC; +extern s8 D_801E95ED; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E95E8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E95ED; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E95EC)) * 2) + D_801E95E8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E95ED = (unsigned char) p[1]; + D_801E95EC = D_801E95EC + 1; + if (D_801E95ED == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E95EC = 0; + *base = 0; + } + } + else + { + D_801E95ED = c - 1; + } + } + return; +} + + + +extern s32 D_801E960C; +extern s32 D_801E9600; +extern s32 D_801E9604; +extern s32 D_801E9610; + +void func_8013CABC(void) { + D_801E960C = 1; + D_801E9600 = 1; + D_801E9604 = 0; + D_801E9610 = 1; +} + + + +extern s32 D_801E9600; +extern s32 D_801E9604; +extern s32 D_801E9608; +extern s32 D_801E960C; +extern s32 D_801E9610; + +void func_8013CAE8(void) { + D_801E9600 = 1; + D_801E960C = 0; + D_801E9604 = 0; + D_801E9608 = -1; + D_801E9610 = 0; +} + + + +extern s32 D_801E960C; +extern s32 D_801E9610; +extern s32 D_801E9638; +extern s32 D_801E963C; + +void func_8013CB20(void) +{ + D_801E9638 = D_801E9610; + D_801E963C = D_801E960C; + D_801E9610 = 1; + D_801E960C = 0; +} + + + +extern s32 D_801E9638; +extern s32 D_801E963C; +extern s32 D_801E9610; +extern s32 D_801E960C; + +void func_8013CB5C(void) { + D_801E9610 = D_801E9638; + D_801E960C = D_801E963C; +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EAEE8; + extern u8 D_801EAEE9; + extern u8 D_801EAEEA; + extern u8 D_801EAEEB; + extern u8 D_801EAEEC; + extern u8 D_801EAEED; + extern u8 D_801EAEEE; + extern u8 D_801EAEEF; + extern u8 D_801EAEF0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EAEE8; t1 = D_801EAEE9; t2 = D_801EAEEA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EAEEB; t1 = D_801EAEEC; t2 = D_801EAEED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EAEEE; t1 = D_801EAEEF; t2 = D_801EAEF0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E9618; +extern s32 D_801E9600; +extern s32 D_801E961C; +extern s32 D_801E960C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E9618 != 0) { + if (D_801E9618 != 2) { + if (((D_801E9618 < 3) && (D_801E9618 == 1)) && + (D_801E961C = D_801E961C + 1, 0x23a < D_801E961C)) { + D_801E9600 = D_801E9618; + D_801E9618 = 2; + } + } else { + D_801E9600 = D_801E9600 + -1; + if (D_801E9600 == 0) { + D_801E9600 = D_801E9618; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E960C == 0) { + D_801E9618 = D_801E9618 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E960C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E960C; +} + + + +extern s32 D_801E9618; + +void func_8013D164(void) { + D_801E9618 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EAFCA; +extern u8 D_801EB03E; +extern u8 D_801EAEF2; +extern u8 D_801EAFAC; +extern u8 D_801EAED0; +extern u8 D_801EAEF1; +extern s32 D_801EAFB0; + +void func_8013D330(void) { + if ((D_801EAFCA & 0xff) != D_801EB03E) { + D_801EAFCA = ((D_801EAFCA & 0xff) < D_801EB03E) ? (D_801EAFCA + 1) : (D_801EAFCA - 1); + } + if ((D_801EAEF2 & 0xff) != D_801EAFAC) { + D_801EAEF2 = ((D_801EAEF2 & 0xff) < D_801EAFAC) ? (D_801EAEF2 + 1) : (D_801EAEF2 - 1); + } + if ((D_801EAED0 & 0xff) != D_801EAEF1) { + D_801EAED0 = ((D_801EAED0 & 0xff) < D_801EAEF1) ? (D_801EAED0 + 1) : (D_801EAED0 - 1); + } + D_801EAFB0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E95F0; +extern void *D_801E95F4; +extern void *D_801E95F8; +extern s32 D_801E9620; +extern s32 D_801E9624; +extern s32 D_801E9628; +extern s32 D_801EAF24[]; + +extern u8 D_8018BDAC[]; +extern u8 D_8018BE54[]; +extern u8 D_8018BD04[]; +extern u8 D_8018BE00[]; +extern u8 D_8018BE80[]; +extern u8 D_8018BD58[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E9620 = param_2; + D_801E9624 = (param_2 >> 2) & 3; + D_801E9628 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E95F0 = D_8018BDAC; + D_801E95F4 = D_8018BE54; + D_801E95F8 = D_8018BD04; + } else { + D_801E95F0 = D_8018BE00; + D_801E95F4 = D_8018BE80; + D_801E95F8 = D_8018BD58; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E9628 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E9620 & 2) != 0) { + D_801EAF24[0] = 0x140; + D_801EAF24[3] = 0x80; + if (p[0x37] == 4) { + D_801EAF24[0] = 0x140; + D_801EAF24[3] = 0; + } + if (p[0x37] == 0) { + D_801EAF24[0] = 0x140; + D_801EAF24[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E95F8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E95F8; +extern s16 *D_801E95FC; +extern s32 D_801E960C; +extern s32 D_801E962C; +extern s32 D_801E9630; +extern s32 D_801E9634; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E95FC != 0) { + D_801E960C = 0; + p = (int *)(param_1 * 12 + (int)D_801E95F8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E962C != x) { + flag = 1; + if (D_801E962C < x) { + if (x - D_801E962C < 5) { + D_801E962C = x; + } else { + D_801E962C = D_801E962C + 4; + } + } else { + if (D_801E962C - x < 5) { + D_801E962C = x; + } else { + D_801E962C = D_801E962C - 4; + } + } + } + if (D_801E9630 != y) { + flag = 1; + if (D_801E9630 < y) { + if (y - D_801E9630 < 5) { + D_801E9630 = y; + } else { + D_801E9630 = D_801E9630 + 4; + } + } else { + if (D_801E9630 - y < 5) { + D_801E9630 = y; + } else { + D_801E9630 = D_801E9630 - 4; + } + } + } + if (D_801E9634 != z) { + flag = 1; + if (D_801E9634 < z) { + if (z - D_801E9634 < 5) { + D_801E9634 = z; + } else { + D_801E9634 = D_801E9634 + 4; + } + } else { + if (D_801E9634 - z < 5) { + D_801E9634 = z; + } else { + D_801E9634 = D_801E9634 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E960C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018BF10[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E95FC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E962C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E9630); + uVar5 = (*(int*)&D_801E9634); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018BF10); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E9614; + +s32 func_8013E054(void) { + return D_801E9614; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018C90C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018C8E4; +extern s16 D_8018C8E6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018C90C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018C8E4 = 2; + D_8018C8E6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018C8E6 = 0; + D_8018C8E4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E9648; + extern void * D_801E964C; + extern unsigned char D_8018C584; + extern unsigned char D_8018C59C; + extern unsigned char D_8018C610; + extern unsigned char D_8018C618; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E9648 = &D_8018C584; + D_801E964C = &D_8018C610; + } else { + D_801E9648 = &D_8018C59C; + D_801E964C = &D_8018C618; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018C90C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C90C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018C90C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018C8E8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C8E8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C8E8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018C8E4; +extern s16 D_8018C8E6; +extern unsigned char D_8018C8E8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C8E6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018C8E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018C8E6; + if (*r < 3) { + *r = *r + 1; + } + D_8018C8E4 = (u16)D_8018C8E4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018C8E8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.c b/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.c index 5a88843f3..c03a1acec 100644 --- a/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.c +++ b/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018BB70[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018BB70[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018BBB4; -extern u8 D_8018BBF8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018BBB4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018BBF8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018BC3C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018BC78[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018BC78; - if (((s16)a1) < 0xC00) { - tbl = D_8018BC3C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018BCB4, D_8018BCB6, D_8018BCB8, D_8018BCBA, D_8018BCBC, D_8018BCBE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018BCB6 < ang)) goto outer_else; - if (!(ang < D_8018BCBC)) goto inner_else; - if (ang < D_8018BCB8) { *(s16 *)L = D_8018BCB8; goto done; } - if (D_8018BCBA < ang) { *(s16 *)L = D_8018BCBA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018BCB4) { *(s16 *)L = D_8018BCB4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018BCBE < ang) { *(s16 *)L = D_8018BCBE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E95E8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E95E8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E95E8; -extern s8 D_801E95EC; -extern s8 D_801E95ED; - -void func_8013C9C4(void * arg0) -{ - D_801E95E8 = arg0; - D_801E95EC = 0; - D_801E95ED = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E95E8; -extern s8 D_801E95EC; -extern s8 D_801E95ED; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E95E8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E95ED; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E95EC)) * 2) + D_801E95E8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E95ED = (unsigned char) p[1]; - D_801E95EC = D_801E95EC + 1; - if (D_801E95ED == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E95EC = 0; - *base = 0; - } - } - else - { - D_801E95ED = c - 1; - } - } - return; -} - - - -extern s32 D_801E960C; -extern s32 D_801E9600; -extern s32 D_801E9604; -extern s32 D_801E9610; - -void func_8013CABC(void) { - D_801E960C = 1; - D_801E9600 = 1; - D_801E9604 = 0; - D_801E9610 = 1; -} - - - -extern s32 D_801E9600; -extern s32 D_801E9604; -extern s32 D_801E9608; -extern s32 D_801E960C; -extern s32 D_801E9610; - -void func_8013CAE8(void) { - D_801E9600 = 1; - D_801E960C = 0; - D_801E9604 = 0; - D_801E9608 = -1; - D_801E9610 = 0; -} - - - -extern s32 D_801E960C; -extern s32 D_801E9610; -extern s32 D_801E9638; -extern s32 D_801E963C; - -void func_8013CB20(void) -{ - D_801E9638 = D_801E9610; - D_801E963C = D_801E960C; - D_801E9610 = 1; - D_801E960C = 0; -} - - - -extern s32 D_801E9638; -extern s32 D_801E963C; -extern s32 D_801E9610; -extern s32 D_801E960C; - -void func_8013CB5C(void) { - D_801E9610 = D_801E9638; - D_801E960C = D_801E963C; -} - - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EAEE8; - extern u8 D_801EAEE9; - extern u8 D_801EAEEA; - extern u8 D_801EAEEB; - extern u8 D_801EAEEC; - extern u8 D_801EAEED; - extern u8 D_801EAEEE; - extern u8 D_801EAEEF; - extern u8 D_801EAEF0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EAEE8; t1 = D_801EAEE9; t2 = D_801EAEEA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EAEEB; t1 = D_801EAEEC; t2 = D_801EAEED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EAEEE; t1 = D_801EAEEF; t2 = D_801EAEF0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E9618; -extern s32 D_801E9600; -extern s32 D_801E961C; -extern s32 D_801E960C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E9618 != 0) { - if (D_801E9618 != 2) { - if (((D_801E9618 < 3) && (D_801E9618 == 1)) && - (D_801E961C = D_801E961C + 1, 0x23a < D_801E961C)) { - D_801E9600 = D_801E9618; - D_801E9618 = 2; - } - } else { - D_801E9600 = D_801E9600 + -1; - if (D_801E9600 == 0) { - D_801E9600 = D_801E9618; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E960C == 0) { - D_801E9618 = D_801E9618 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E960C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E960C; -} - - - -extern s32 D_801E9618; - -void func_8013D164(void) { - D_801E9618 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EAFCA; -extern u8 D_801EB03E; -extern u8 D_801EAEF2; -extern u8 D_801EAFAC; -extern u8 D_801EAED0; -extern u8 D_801EAEF1; -extern s32 D_801EAFB0; - -void func_8013D330(void) { - if ((D_801EAFCA & 0xff) != D_801EB03E) { - D_801EAFCA = ((D_801EAFCA & 0xff) < D_801EB03E) ? (D_801EAFCA + 1) : (D_801EAFCA - 1); - } - if ((D_801EAEF2 & 0xff) != D_801EAFAC) { - D_801EAEF2 = ((D_801EAEF2 & 0xff) < D_801EAFAC) ? (D_801EAEF2 + 1) : (D_801EAEF2 - 1); - } - if ((D_801EAED0 & 0xff) != D_801EAEF1) { - D_801EAED0 = ((D_801EAED0 & 0xff) < D_801EAEF1) ? (D_801EAED0 + 1) : (D_801EAED0 - 1); - } - D_801EAFB0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E95F0; -extern void *D_801E95F4; -extern void *D_801E95F8; -extern s32 D_801E9620; -extern s32 D_801E9624; -extern s32 D_801E9628; -extern s32 D_801EAF24[]; - -extern u8 D_8018BDAC[]; -extern u8 D_8018BE54[]; -extern u8 D_8018BD04[]; -extern u8 D_8018BE00[]; -extern u8 D_8018BE80[]; -extern u8 D_8018BD58[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E9620 = param_2; - D_801E9624 = (param_2 >> 2) & 3; - D_801E9628 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E95F0 = D_8018BDAC; - D_801E95F4 = D_8018BE54; - D_801E95F8 = D_8018BD04; - } else { - D_801E95F0 = D_8018BE00; - D_801E95F4 = D_8018BE80; - D_801E95F8 = D_8018BD58; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E9628 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E9620 & 2) != 0) { - D_801EAF24[0] = 0x140; - D_801EAF24[3] = 0x80; - if (p[0x37] == 4) { - D_801EAF24[0] = 0x140; - D_801EAF24[3] = 0; - } - if (p[0x37] == 0) { - D_801EAF24[0] = 0x140; - D_801EAF24[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E95F8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E95F8; -extern s16 *D_801E95FC; -extern s32 D_801E960C; -extern s32 D_801E962C; -extern s32 D_801E9630; -extern s32 D_801E9634; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E95FC != 0) { - D_801E960C = 0; - p = (int *)(param_1 * 12 + (int)D_801E95F8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E962C != x) { - flag = 1; - if (D_801E962C < x) { - if (x - D_801E962C < 5) { - D_801E962C = x; - } else { - D_801E962C = D_801E962C + 4; - } - } else { - if (D_801E962C - x < 5) { - D_801E962C = x; - } else { - D_801E962C = D_801E962C - 4; - } - } - } - if (D_801E9630 != y) { - flag = 1; - if (D_801E9630 < y) { - if (y - D_801E9630 < 5) { - D_801E9630 = y; - } else { - D_801E9630 = D_801E9630 + 4; - } - } else { - if (D_801E9630 - y < 5) { - D_801E9630 = y; - } else { - D_801E9630 = D_801E9630 - 4; - } - } - } - if (D_801E9634 != z) { - flag = 1; - if (D_801E9634 < z) { - if (z - D_801E9634 < 5) { - D_801E9634 = z; - } else { - D_801E9634 = D_801E9634 + 4; - } - } else { - if (D_801E9634 - z < 5) { - D_801E9634 = z; - } else { - D_801E9634 = D_801E9634 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E960C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018BF10[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E95FC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E962C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E9630); - uVar5 = (*(int*)&D_801E9634); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018BF10); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E9614; - -s32 func_8013E054(void) { - return D_801E9614; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018C90C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018C8E4; -extern s16 D_8018C8E6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018C90C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018C8E4 = 2; - D_8018C8E6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018C8E6 = 0; - D_8018C8E4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E9648; - extern void * D_801E964C; - extern unsigned char D_8018C584; - extern unsigned char D_8018C59C; - extern unsigned char D_8018C610; - extern unsigned char D_8018C618; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E9648 = &D_8018C584; - D_801E964C = &D_8018C610; - } else { - D_801E9648 = &D_8018C59C; - D_801E964C = &D_8018C618; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018C90C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C90C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018C90C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018C8E8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C8E8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C8E8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018C8E4; -extern s16 D_8018C8E6; -extern unsigned char D_8018C8E8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C8E6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018C8E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018C8E6; - if (*r < 3) { - *r = *r + 1; - } - D_8018C8E4 = (u16)D_8018C8E4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018C8E8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_015/ov_SC03_015_jr_801380E0.c b/src/ov_SC03_015/ov_SC03_015_jr_801380E0.c new file mode 100644 index 000000000..57251e068 --- /dev/null +++ b/src/ov_SC03_015/ov_SC03_015_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E819C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018B804[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E9504; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EAFD0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E819C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018B540)(); +extern s16 (*D_8018B544)(); +extern M2C_UNK (*D_8018B54C)(); +extern s32 (*D_8018B550)(); +extern s32 D_801E9500; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E81A0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018B898; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018ED7C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018B8B0; +extern M2C_UNK D_8018B8B8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018B8C0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018B8DC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018B8E8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018B8FC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B94C[]; +extern s16 D_8018B97C[]; +extern s16 D_8018B9DC[]; +extern s16 D_8018B9E4[]; +extern s16 D_8018BA04[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018BA3C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018BA94[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018BADC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018BAE4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018BAEC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018BAF4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018BA9C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018BABC; +extern void func_801321B0(int param_1); +extern int D_8018BACC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E9570; +extern s32 D_801E9574[]; +extern int D_801E9578; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018BB00; +extern u8 D_8018BAFC; +extern s16 *D_8018BB04; +extern u8 D_8018BB08; +extern int D_801E9570; +extern u16 D_801E9580; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018BB04; /* holds a pointer value (*(u16**)&D_8018BB04) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018BB18[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018BB6C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018BB70[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018BB70[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018BBB4; +extern u8 D_8018BBF8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018BBB4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018BBF8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018BC3C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018BC78[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018BC78; + if (((s16)a1) < 0xC00) { + tbl = D_8018BC3C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018BCB4, D_8018BCB6, D_8018BCB8, D_8018BCBA, D_8018BCBC, D_8018BCBE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018BCB6 < ang)) goto outer_else; + if (!(ang < D_8018BCBC)) goto inner_else; + if (ang < D_8018BCB8) { *(s16 *)L = D_8018BCB8; goto done; } + if (D_8018BCBA < ang) { *(s16 *)L = D_8018BCBA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018BCB4) { *(s16 *)L = D_8018BCB4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018BCBE < ang) { *(s16 *)L = D_8018BCBE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E95E8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E95E8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E95E8; +extern s8 D_801E95EC; +extern s8 D_801E95ED; + +void func_8013C9C4(void * arg0) +{ + D_801E95E8 = arg0; + D_801E95EC = 0; + D_801E95ED = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E95E8; +extern s8 D_801E95EC; +extern s8 D_801E95ED; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E95E8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E95ED; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E95EC)) * 2) + D_801E95E8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E95ED = (unsigned char) p[1]; + D_801E95EC = D_801E95EC + 1; + if (D_801E95ED == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E95EC = 0; + *base = 0; + } + } + else + { + D_801E95ED = c - 1; + } + } + return; +} + + + +extern s32 D_801E960C; +extern s32 D_801E9600; +extern s32 D_801E9604; +extern s32 D_801E9610; + +void func_8013CABC(void) { + D_801E960C = 1; + D_801E9600 = 1; + D_801E9604 = 0; + D_801E9610 = 1; +} + + + +extern s32 D_801E9600; +extern s32 D_801E9604; +extern s32 D_801E9608; +extern s32 D_801E960C; +extern s32 D_801E9610; + +void func_8013CAE8(void) { + D_801E9600 = 1; + D_801E960C = 0; + D_801E9604 = 0; + D_801E9608 = -1; + D_801E9610 = 0; +} + + + +extern s32 D_801E960C; +extern s32 D_801E9610; +extern s32 D_801E9638; +extern s32 D_801E963C; + +void func_8013CB20(void) +{ + D_801E9638 = D_801E9610; + D_801E963C = D_801E960C; + D_801E9610 = 1; + D_801E960C = 0; +} + + + +extern s32 D_801E9638; +extern s32 D_801E963C; +extern s32 D_801E9610; +extern s32 D_801E960C; + +void func_8013CB5C(void) { + D_801E9610 = D_801E9638; + D_801E960C = D_801E963C; +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EAEE8; + extern u8 D_801EAEE9; + extern u8 D_801EAEEA; + extern u8 D_801EAEEB; + extern u8 D_801EAEEC; + extern u8 D_801EAEED; + extern u8 D_801EAEEE; + extern u8 D_801EAEEF; + extern u8 D_801EAEF0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EAEE8; t1 = D_801EAEE9; t2 = D_801EAEEA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EAEEB; t1 = D_801EAEEC; t2 = D_801EAEED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EAEEE; t1 = D_801EAEEF; t2 = D_801EAEF0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E9618; +extern s32 D_801E9600; +extern s32 D_801E961C; +extern s32 D_801E960C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E9618 != 0) { + if (D_801E9618 != 2) { + if (((D_801E9618 < 3) && (D_801E9618 == 1)) && + (D_801E961C = D_801E961C + 1, 0x23a < D_801E961C)) { + D_801E9600 = D_801E9618; + D_801E9618 = 2; + } + } else { + D_801E9600 = D_801E9600 + -1; + if (D_801E9600 == 0) { + D_801E9600 = D_801E9618; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E960C == 0) { + D_801E9618 = D_801E9618 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E960C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E960C; +} + + + +extern s32 D_801E9618; + +void func_8013D164(void) { + D_801E9618 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EAFCA; +extern u8 D_801EB03E; +extern u8 D_801EAEF2; +extern u8 D_801EAFAC; +extern u8 D_801EAED0; +extern u8 D_801EAEF1; +extern s32 D_801EAFB0; + +void func_8013D330(void) { + if ((D_801EAFCA & 0xff) != D_801EB03E) { + D_801EAFCA = ((D_801EAFCA & 0xff) < D_801EB03E) ? (D_801EAFCA + 1) : (D_801EAFCA - 1); + } + if ((D_801EAEF2 & 0xff) != D_801EAFAC) { + D_801EAEF2 = ((D_801EAEF2 & 0xff) < D_801EAFAC) ? (D_801EAEF2 + 1) : (D_801EAEF2 - 1); + } + if ((D_801EAED0 & 0xff) != D_801EAEF1) { + D_801EAED0 = ((D_801EAED0 & 0xff) < D_801EAEF1) ? (D_801EAED0 + 1) : (D_801EAED0 - 1); + } + D_801EAFB0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E95F0; +extern void *D_801E95F4; +extern void *D_801E95F8; +extern s32 D_801E9620; +extern s32 D_801E9624; +extern s32 D_801E9628; +extern s32 D_801EAF24[]; + +extern u8 D_8018BDAC[]; +extern u8 D_8018BE54[]; +extern u8 D_8018BD04[]; +extern u8 D_8018BE00[]; +extern u8 D_8018BE80[]; +extern u8 D_8018BD58[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E9620 = param_2; + D_801E9624 = (param_2 >> 2) & 3; + D_801E9628 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E95F0 = D_8018BDAC; + D_801E95F4 = D_8018BE54; + D_801E95F8 = D_8018BD04; + } else { + D_801E95F0 = D_8018BE00; + D_801E95F4 = D_8018BE80; + D_801E95F8 = D_8018BD58; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E9628 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E9620 & 2) != 0) { + D_801EAF24[0] = 0x140; + D_801EAF24[3] = 0x80; + if (p[0x37] == 4) { + D_801EAF24[0] = 0x140; + D_801EAF24[3] = 0; + } + if (p[0x37] == 0) { + D_801EAF24[0] = 0x140; + D_801EAF24[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E95F8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E95F8; +extern s16 *D_801E95FC; +extern s32 D_801E960C; +extern s32 D_801E962C; +extern s32 D_801E9630; +extern s32 D_801E9634; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E95FC != 0) { + D_801E960C = 0; + p = (int *)(param_1 * 12 + (int)D_801E95F8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E962C != x) { + flag = 1; + if (D_801E962C < x) { + if (x - D_801E962C < 5) { + D_801E962C = x; + } else { + D_801E962C = D_801E962C + 4; + } + } else { + if (D_801E962C - x < 5) { + D_801E962C = x; + } else { + D_801E962C = D_801E962C - 4; + } + } + } + if (D_801E9630 != y) { + flag = 1; + if (D_801E9630 < y) { + if (y - D_801E9630 < 5) { + D_801E9630 = y; + } else { + D_801E9630 = D_801E9630 + 4; + } + } else { + if (D_801E9630 - y < 5) { + D_801E9630 = y; + } else { + D_801E9630 = D_801E9630 - 4; + } + } + } + if (D_801E9634 != z) { + flag = 1; + if (D_801E9634 < z) { + if (z - D_801E9634 < 5) { + D_801E9634 = z; + } else { + D_801E9634 = D_801E9634 + 4; + } + } else { + if (D_801E9634 - z < 5) { + D_801E9634 = z; + } else { + D_801E9634 = D_801E9634 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E960C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018BF10[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E95FC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E962C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E9630); + uVar5 = (*(int*)&D_801E9634); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018BF10); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E9614; + +s32 func_8013E054(void) { + return D_801E9614; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018C90C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018C8E4; +extern s16 D_8018C8E6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018C90C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018C8E4 = 2; + D_8018C8E6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018C8E6 = 0; + D_8018C8E4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E9648; + extern void * D_801E964C; + extern unsigned char D_8018C584; + extern unsigned char D_8018C59C; + extern unsigned char D_8018C610; + extern unsigned char D_8018C618; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E9648 = &D_8018C584; + D_801E964C = &D_8018C610; + } else { + D_801E9648 = &D_8018C59C; + D_801E964C = &D_8018C618; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018C90C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C90C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018C90C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018C8E8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C8E8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C8E8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018C8E4; +extern s16 D_8018C8E6; +extern unsigned char D_8018C8E8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C8E6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018C8E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018C8E6; + if (*r < 3) { + *r = *r + 1; + } + D_8018C8E4 = (u16)D_8018C8E4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018C8E8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C8E8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_023/ov_SC03_023_jr_8012ACE0.c b/src/ov_SC03_023/ov_SC03_023_jr_8012ACE0.c index 485ce549c..ab8a5bbb1 100644 --- a/src/ov_SC03_023/ov_SC03_023_jr_8012ACE0.c +++ b/src/ov_SC03_023/ov_SC03_023_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F4EC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F4EC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F530; -extern u8 D_8017F574; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F530; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F574 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F5B8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F5F4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F5F4; - if (((s16)a1) < 0xC00) { - tbl = D_8017F5B8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F630, D_8017F632, D_8017F634, D_8017F636, D_8017F638, D_8017F63A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F632 < ang)) goto outer_else; - if (!(ang < D_8017F638)) goto inner_else; - if (ang < D_8017F634) { *(s16 *)L = D_8017F634; goto done; } - if (D_8017F636 < ang) { *(s16 *)L = D_8017F636; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F630) { *(s16 *)L = D_8017F630; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F63A < ang) { *(s16 *)L = D_8017F63A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801979C0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801979C0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801979C0; -extern s8 D_801979C4; -extern s8 D_801979C5; - -void func_8013C9C4(void * arg0) -{ - D_801979C0 = arg0; - D_801979C4 = 0; - D_801979C5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801979C0; -extern s8 D_801979C4; -extern s8 D_801979C5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801979C0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801979C5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801979C4)) * 2) + D_801979C0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801979C5 = (unsigned char) p[1]; - D_801979C4 = D_801979C4 + 1; - if (D_801979C5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801979C4 = 0; - *base = 0; - } - } - else - { - D_801979C5 = c - 1; - } - } - return; -} - - - -extern s32 D_801979E4; -extern s32 D_801979D8; -extern s32 D_801979DC; -extern s32 D_801979E8; - -void func_8013CABC(void) { - D_801979E4 = 1; - D_801979D8 = 1; - D_801979DC = 0; - D_801979E8 = 1; -} - - - -extern s32 D_801979D8; -extern s32 D_801979DC; -extern s32 D_801979E0; -extern s32 D_801979E4; -extern s32 D_801979E8; - -void func_8013CAE8(void) { - D_801979D8 = 1; - D_801979E4 = 0; - D_801979DC = 0; - D_801979E0 = -1; - D_801979E8 = 0; -} - - - -extern s32 D_801979E4; -extern s32 D_801979E8; -extern s32 D_80197A10; -extern s32 D_80197A14; - -void func_8013CB20(void) -{ - D_80197A10 = D_801979E8; - D_80197A14 = D_801979E4; - D_801979E8 = 1; - D_801979E4 = 0; -} - - - -extern s32 D_80197A10; -extern s32 D_80197A14; -extern s32 D_801979E8; -extern s32 D_801979E4; - -void func_8013CB5C(void) { - D_801979E8 = D_80197A10; - D_801979E4 = D_80197A14; -} - - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80198C30; - extern u8 D_80198C31; - extern u8 D_80198C32; - extern u8 D_80198C33; - extern u8 D_80198C34; - extern u8 D_80198C35; - extern u8 D_80198C36; - extern u8 D_80198C37; - extern u8 D_80198C38; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80198C30; t1 = D_80198C31; t2 = D_80198C32; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_80198C33; t1 = D_80198C34; t2 = D_80198C35; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_80198C36; t1 = D_80198C37; t2 = D_80198C38; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801979F0; -extern s32 D_801979D8; -extern s32 D_801979F4; -extern s32 D_801979E4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801979F0 != 0) { - if (D_801979F0 != 2) { - if (((D_801979F0 < 3) && (D_801979F0 == 1)) && - (D_801979F4 = D_801979F4 + 1, 0x23a < D_801979F4)) { - D_801979D8 = D_801979F0; - D_801979F0 = 2; - } - } else { - D_801979D8 = D_801979D8 + -1; - if (D_801979D8 == 0) { - D_801979D8 = D_801979F0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801979E4 == 0) { - D_801979F0 = D_801979F0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801979E4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801979E4; -} - - - -extern s32 D_801979F0; - -void func_8013D164(void) { - D_801979F0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_80198D12; -extern u8 D_80198D86; -extern u8 D_80198C3A; -extern u8 D_80198CF4; -extern u8 D_80198C18; -extern u8 D_80198C39; -extern s32 D_80198CF8; - -void func_8013D330(void) { - if ((D_80198D12 & 0xff) != D_80198D86) { - D_80198D12 = ((D_80198D12 & 0xff) < D_80198D86) ? (D_80198D12 + 1) : (D_80198D12 - 1); - } - if ((D_80198C3A & 0xff) != D_80198CF4) { - D_80198C3A = ((D_80198C3A & 0xff) < D_80198CF4) ? (D_80198C3A + 1) : (D_80198C3A - 1); - } - if ((D_80198C18 & 0xff) != D_80198C39) { - D_80198C18 = ((D_80198C18 & 0xff) < D_80198C39) ? (D_80198C18 + 1) : (D_80198C18 - 1); - } - D_80198CF8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801979C8; -extern void *D_801979CC; -extern void *D_801979D0; -extern s32 D_801979F8; -extern s32 D_801979FC; -extern s32 D_80197A00; -extern s32 D_80198C6C[]; - -extern u8 D_8017F728[]; -extern u8 D_8017F7D0[]; -extern u8 D_8017F680[]; -extern u8 D_8017F77C[]; -extern u8 D_8017F7FC[]; -extern u8 D_8017F6D4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801979F8 = param_2; - D_801979FC = (param_2 >> 2) & 3; - D_80197A00 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801979C8 = D_8017F728; - D_801979CC = D_8017F7D0; - D_801979D0 = D_8017F680; - } else { - D_801979C8 = D_8017F77C; - D_801979CC = D_8017F7FC; - D_801979D0 = D_8017F6D4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80197A00 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801979F8 & 2) != 0) { - D_80198C6C[0] = 0x140; - D_80198C6C[3] = 0x80; - if (p[0x37] == 4) { - D_80198C6C[0] = 0x140; - D_80198C6C[3] = 0; - } - if (p[0x37] == 0) { - D_80198C6C[0] = 0x140; - D_80198C6C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801979D0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801979D0; -extern s16 *D_801979D4; -extern s32 D_801979E4; -extern s32 D_80197A04; -extern s32 D_80197A08; -extern s32 D_80197A0C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801979D4 != 0) { - D_801979E4 = 0; - p = (int *)(param_1 * 12 + (int)D_801979D0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80197A04 != x) { - flag = 1; - if (D_80197A04 < x) { - if (x - D_80197A04 < 5) { - D_80197A04 = x; - } else { - D_80197A04 = D_80197A04 + 4; - } - } else { - if (D_80197A04 - x < 5) { - D_80197A04 = x; - } else { - D_80197A04 = D_80197A04 - 4; - } - } - } - if (D_80197A08 != y) { - flag = 1; - if (D_80197A08 < y) { - if (y - D_80197A08 < 5) { - D_80197A08 = y; - } else { - D_80197A08 = D_80197A08 + 4; - } - } else { - if (D_80197A08 - y < 5) { - D_80197A08 = y; - } else { - D_80197A08 = D_80197A08 - 4; - } - } - } - if (D_80197A0C != z) { - flag = 1; - if (D_80197A0C < z) { - if (z - D_80197A0C < 5) { - D_80197A0C = z; - } else { - D_80197A0C = D_80197A0C + 4; - } - } else { - if (D_80197A0C - z < 5) { - D_80197A0C = z; - } else { - D_80197A0C = D_80197A0C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801979E4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F88C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801979D4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80197A04); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80197A08); - uVar5 = (*(int*)&D_80197A0C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F88C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801979EC; - -s32 func_8013E054(void) { - return D_801979EC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180288; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80180260; -extern s16 D_80180262; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180288; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80180260 = 2; - D_80180262 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80180262 = 0; - D_80180260 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80197A20; - extern void * D_80197A24; - extern unsigned char D_8017FF00; - extern unsigned char D_8017FF18; - extern unsigned char D_8017FF8C; - extern unsigned char D_8017FF94; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80197A20 = &D_8017FF00; - D_80197A24 = &D_8017FF8C; - } else { - D_80197A20 = &D_8017FF18; - D_80197A24 = &D_8017FF94; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180288/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180288 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180288)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180264; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180264)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180264)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80180260; -extern s16 D_80180262; -extern unsigned char D_80180264; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180262` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80180260` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80180262; - if (*r < 3) { - *r = *r + 1; - } - D_80180260 = (u16)D_80180260 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180264); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180264; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180264); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_023/ov_SC03_023_jr_801380E0.c b/src/ov_SC03_023/ov_SC03_023_jr_801380E0.c new file mode 100644 index 000000000..da9757f0b --- /dev/null +++ b/src/ov_SC03_023/ov_SC03_023_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80196774; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F180[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801978DC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80198D18; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80196774; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EEBC)(); +extern s16 (*D_8017EEC0)(); +extern M2C_UNK (*D_8017EEC8)(); +extern s32 (*D_8017EECC)(); +extern s32 D_801978D8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80196778; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F214; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801826F8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F22C; +extern M2C_UNK D_8017F234; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F23C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F258[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F264[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F278[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F2C8[]; +extern s16 D_8017F2F8[]; +extern s16 D_8017F358[]; +extern s16 D_8017F360[]; +extern s16 D_8017F380[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F3B8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F410[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F458[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F460[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F468[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F470[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F418; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F438; +extern void func_801321B0(int param_1); +extern int D_8017F448; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80197948; +extern s32 D_8019794C[]; +extern int D_80197950; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F47C; +extern u8 D_8017F478; +extern s16 *D_8017F480; +extern u8 D_8017F484; +extern int D_80197948; +extern u16 D_80197958; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F480; /* holds a pointer value (*(u16**)&D_8017F480) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F494[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F4E8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F4EC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F4EC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F530; +extern u8 D_8017F574; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F530; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F574 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F5B8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F5F4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F5F4; + if (((s16)a1) < 0xC00) { + tbl = D_8017F5B8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F630, D_8017F632, D_8017F634, D_8017F636, D_8017F638, D_8017F63A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F632 < ang)) goto outer_else; + if (!(ang < D_8017F638)) goto inner_else; + if (ang < D_8017F634) { *(s16 *)L = D_8017F634; goto done; } + if (D_8017F636 < ang) { *(s16 *)L = D_8017F636; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F630) { *(s16 *)L = D_8017F630; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F63A < ang) { *(s16 *)L = D_8017F63A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801979C0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801979C0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801979C0; +extern s8 D_801979C4; +extern s8 D_801979C5; + +void func_8013C9C4(void * arg0) +{ + D_801979C0 = arg0; + D_801979C4 = 0; + D_801979C5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801979C0; +extern s8 D_801979C4; +extern s8 D_801979C5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801979C0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801979C5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801979C4)) * 2) + D_801979C0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801979C5 = (unsigned char) p[1]; + D_801979C4 = D_801979C4 + 1; + if (D_801979C5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801979C4 = 0; + *base = 0; + } + } + else + { + D_801979C5 = c - 1; + } + } + return; +} + + + +extern s32 D_801979E4; +extern s32 D_801979D8; +extern s32 D_801979DC; +extern s32 D_801979E8; + +void func_8013CABC(void) { + D_801979E4 = 1; + D_801979D8 = 1; + D_801979DC = 0; + D_801979E8 = 1; +} + + + +extern s32 D_801979D8; +extern s32 D_801979DC; +extern s32 D_801979E0; +extern s32 D_801979E4; +extern s32 D_801979E8; + +void func_8013CAE8(void) { + D_801979D8 = 1; + D_801979E4 = 0; + D_801979DC = 0; + D_801979E0 = -1; + D_801979E8 = 0; +} + + + +extern s32 D_801979E4; +extern s32 D_801979E8; +extern s32 D_80197A10; +extern s32 D_80197A14; + +void func_8013CB20(void) +{ + D_80197A10 = D_801979E8; + D_80197A14 = D_801979E4; + D_801979E8 = 1; + D_801979E4 = 0; +} + + + +extern s32 D_80197A10; +extern s32 D_80197A14; +extern s32 D_801979E8; +extern s32 D_801979E4; + +void func_8013CB5C(void) { + D_801979E8 = D_80197A10; + D_801979E4 = D_80197A14; +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80198C30; + extern u8 D_80198C31; + extern u8 D_80198C32; + extern u8 D_80198C33; + extern u8 D_80198C34; + extern u8 D_80198C35; + extern u8 D_80198C36; + extern u8 D_80198C37; + extern u8 D_80198C38; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80198C30; t1 = D_80198C31; t2 = D_80198C32; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_80198C33; t1 = D_80198C34; t2 = D_80198C35; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_80198C36; t1 = D_80198C37; t2 = D_80198C38; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801979F0; +extern s32 D_801979D8; +extern s32 D_801979F4; +extern s32 D_801979E4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801979F0 != 0) { + if (D_801979F0 != 2) { + if (((D_801979F0 < 3) && (D_801979F0 == 1)) && + (D_801979F4 = D_801979F4 + 1, 0x23a < D_801979F4)) { + D_801979D8 = D_801979F0; + D_801979F0 = 2; + } + } else { + D_801979D8 = D_801979D8 + -1; + if (D_801979D8 == 0) { + D_801979D8 = D_801979F0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801979E4 == 0) { + D_801979F0 = D_801979F0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801979E4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801979E4; +} + + + +extern s32 D_801979F0; + +void func_8013D164(void) { + D_801979F0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_80198D12; +extern u8 D_80198D86; +extern u8 D_80198C3A; +extern u8 D_80198CF4; +extern u8 D_80198C18; +extern u8 D_80198C39; +extern s32 D_80198CF8; + +void func_8013D330(void) { + if ((D_80198D12 & 0xff) != D_80198D86) { + D_80198D12 = ((D_80198D12 & 0xff) < D_80198D86) ? (D_80198D12 + 1) : (D_80198D12 - 1); + } + if ((D_80198C3A & 0xff) != D_80198CF4) { + D_80198C3A = ((D_80198C3A & 0xff) < D_80198CF4) ? (D_80198C3A + 1) : (D_80198C3A - 1); + } + if ((D_80198C18 & 0xff) != D_80198C39) { + D_80198C18 = ((D_80198C18 & 0xff) < D_80198C39) ? (D_80198C18 + 1) : (D_80198C18 - 1); + } + D_80198CF8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801979C8; +extern void *D_801979CC; +extern void *D_801979D0; +extern s32 D_801979F8; +extern s32 D_801979FC; +extern s32 D_80197A00; +extern s32 D_80198C6C[]; + +extern u8 D_8017F728[]; +extern u8 D_8017F7D0[]; +extern u8 D_8017F680[]; +extern u8 D_8017F77C[]; +extern u8 D_8017F7FC[]; +extern u8 D_8017F6D4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801979F8 = param_2; + D_801979FC = (param_2 >> 2) & 3; + D_80197A00 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801979C8 = D_8017F728; + D_801979CC = D_8017F7D0; + D_801979D0 = D_8017F680; + } else { + D_801979C8 = D_8017F77C; + D_801979CC = D_8017F7FC; + D_801979D0 = D_8017F6D4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80197A00 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801979F8 & 2) != 0) { + D_80198C6C[0] = 0x140; + D_80198C6C[3] = 0x80; + if (p[0x37] == 4) { + D_80198C6C[0] = 0x140; + D_80198C6C[3] = 0; + } + if (p[0x37] == 0) { + D_80198C6C[0] = 0x140; + D_80198C6C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801979D0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801979D0; +extern s16 *D_801979D4; +extern s32 D_801979E4; +extern s32 D_80197A04; +extern s32 D_80197A08; +extern s32 D_80197A0C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801979D4 != 0) { + D_801979E4 = 0; + p = (int *)(param_1 * 12 + (int)D_801979D0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80197A04 != x) { + flag = 1; + if (D_80197A04 < x) { + if (x - D_80197A04 < 5) { + D_80197A04 = x; + } else { + D_80197A04 = D_80197A04 + 4; + } + } else { + if (D_80197A04 - x < 5) { + D_80197A04 = x; + } else { + D_80197A04 = D_80197A04 - 4; + } + } + } + if (D_80197A08 != y) { + flag = 1; + if (D_80197A08 < y) { + if (y - D_80197A08 < 5) { + D_80197A08 = y; + } else { + D_80197A08 = D_80197A08 + 4; + } + } else { + if (D_80197A08 - y < 5) { + D_80197A08 = y; + } else { + D_80197A08 = D_80197A08 - 4; + } + } + } + if (D_80197A0C != z) { + flag = 1; + if (D_80197A0C < z) { + if (z - D_80197A0C < 5) { + D_80197A0C = z; + } else { + D_80197A0C = D_80197A0C + 4; + } + } else { + if (D_80197A0C - z < 5) { + D_80197A0C = z; + } else { + D_80197A0C = D_80197A0C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801979E4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F88C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801979D4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80197A04); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80197A08); + uVar5 = (*(int*)&D_80197A0C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F88C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801979EC; + +s32 func_8013E054(void) { + return D_801979EC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180288; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80180260; +extern s16 D_80180262; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180288; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80180260 = 2; + D_80180262 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80180262 = 0; + D_80180260 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80197A20; + extern void * D_80197A24; + extern unsigned char D_8017FF00; + extern unsigned char D_8017FF18; + extern unsigned char D_8017FF8C; + extern unsigned char D_8017FF94; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80197A20 = &D_8017FF00; + D_80197A24 = &D_8017FF8C; + } else { + D_80197A20 = &D_8017FF18; + D_80197A24 = &D_8017FF94; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180288/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180288 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180288)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180264; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180264)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180264)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80180260; +extern s16 D_80180262; +extern unsigned char D_80180264; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180262` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80180260` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80180262; + if (*r < 3) { + *r = *r + 1; + } + D_80180260 = (u16)D_80180260 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180264); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180264; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180264); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_023/nonmatchings/ov_SC03_023_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_024/ov_SC03_024_jr_8012ACE0.c b/src/ov_SC03_024/ov_SC03_024_jr_8012ACE0.c index 199d64366..e19a96f02 100644 --- a/src/ov_SC03_024/ov_SC03_024_jr_8012ACE0.c +++ b/src/ov_SC03_024/ov_SC03_024_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80187510[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80187510[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80187554; -extern u8 D_80187598; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80187554; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80187598 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801875DC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80187618[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80187618; - if (((s16)a1) < 0xC00) { - tbl = D_801875DC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80187654, D_80187656, D_80187658, D_8018765A, D_8018765C, D_8018765E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80187656 < ang)) goto outer_else; - if (!(ang < D_8018765C)) goto inner_else; - if (ang < D_80187658) { *(s16 *)L = D_80187658; goto done; } - if (D_8018765A < ang) { *(s16 *)L = D_8018765A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80187654) { *(s16 *)L = D_80187654; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018765E < ang) { *(s16 *)L = D_8018765E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801BFF58; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801BFF58, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801BFF58; -extern s8 D_801BFF5C; -extern s8 D_801BFF5D; - -void func_8013C9C4(void * arg0) -{ - D_801BFF58 = arg0; - D_801BFF5C = 0; - D_801BFF5D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801BFF58; -extern s8 D_801BFF5C; -extern s8 D_801BFF5D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801BFF58; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801BFF5D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801BFF5C)) * 2) + D_801BFF58); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801BFF5D = (unsigned char) p[1]; - D_801BFF5C = D_801BFF5C + 1; - if (D_801BFF5D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801BFF5C = 0; - *base = 0; - } - } - else - { - D_801BFF5D = c - 1; - } - } - return; -} - - - -extern s32 D_801BFF7C; -extern s32 D_801BFF70; -extern s32 D_801BFF74; -extern s32 D_801BFF80; - -void func_8013CABC(void) { - D_801BFF7C = 1; - D_801BFF70 = 1; - D_801BFF74 = 0; - D_801BFF80 = 1; -} - - - -extern s32 D_801BFF70; -extern s32 D_801BFF74; -extern s32 D_801BFF78; -extern s32 D_801BFF7C; -extern s32 D_801BFF80; - -void func_8013CAE8(void) { - D_801BFF70 = 1; - D_801BFF7C = 0; - D_801BFF74 = 0; - D_801BFF78 = -1; - D_801BFF80 = 0; -} - - - -extern s32 D_801BFF7C; -extern s32 D_801BFF80; -extern s32 D_801BFFA8; -extern s32 D_801BFFAC; - -void func_8013CB20(void) -{ - D_801BFFA8 = D_801BFF80; - D_801BFFAC = D_801BFF7C; - D_801BFF80 = 1; - D_801BFF7C = 0; -} - - - -extern s32 D_801BFFA8; -extern s32 D_801BFFAC; -extern s32 D_801BFF80; -extern s32 D_801BFF7C; - -void func_8013CB5C(void) { - D_801BFF80 = D_801BFFA8; - D_801BFF7C = D_801BFFAC; -} - - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C16F8; - extern u8 D_801C16F9; - extern u8 D_801C16FA; - extern u8 D_801C16FB; - extern u8 D_801C16FC; - extern u8 D_801C16FD; - extern u8 D_801C16FE; - extern u8 D_801C16FF; - extern u8 D_801C1700; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C16F8; t1 = D_801C16F9; t2 = D_801C16FA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C16FB; t1 = D_801C16FC; t2 = D_801C16FD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C16FE; t1 = D_801C16FF; t2 = D_801C1700; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801BFF88; -extern s32 D_801BFF70; -extern s32 D_801BFF8C; -extern s32 D_801BFF7C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801BFF88 != 0) { - if (D_801BFF88 != 2) { - if (((D_801BFF88 < 3) && (D_801BFF88 == 1)) && - (D_801BFF8C = D_801BFF8C + 1, 0x23a < D_801BFF8C)) { - D_801BFF70 = D_801BFF88; - D_801BFF88 = 2; - } - } else { - D_801BFF70 = D_801BFF70 + -1; - if (D_801BFF70 == 0) { - D_801BFF70 = D_801BFF88; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801BFF7C == 0) { - D_801BFF88 = D_801BFF88 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801BFF7C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801BFF7C; -} - - - -extern s32 D_801BFF88; - -void func_8013D164(void) { - D_801BFF88 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C17DA; -extern u8 D_801C184E; -extern u8 D_801C1702; -extern u8 D_801C17BC; -extern u8 D_801C16E0; -extern u8 D_801C1701; -extern s32 D_801C17C0; - -void func_8013D330(void) { - if ((D_801C17DA & 0xff) != D_801C184E) { - D_801C17DA = ((D_801C17DA & 0xff) < D_801C184E) ? (D_801C17DA + 1) : (D_801C17DA - 1); - } - if ((D_801C1702 & 0xff) != D_801C17BC) { - D_801C1702 = ((D_801C1702 & 0xff) < D_801C17BC) ? (D_801C1702 + 1) : (D_801C1702 - 1); - } - if ((D_801C16E0 & 0xff) != D_801C1701) { - D_801C16E0 = ((D_801C16E0 & 0xff) < D_801C1701) ? (D_801C16E0 + 1) : (D_801C16E0 - 1); - } - D_801C17C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801BFF60; -extern void *D_801BFF64; -extern void *D_801BFF68; -extern s32 D_801BFF90; -extern s32 D_801BFF94; -extern s32 D_801BFF98; -extern s32 D_801C1734[]; - -extern u8 D_8018774C[]; -extern u8 D_801877F4[]; -extern u8 D_801876A4[]; -extern u8 D_801877A0[]; -extern u8 D_80187820[]; -extern u8 D_801876F8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801BFF90 = param_2; - D_801BFF94 = (param_2 >> 2) & 3; - D_801BFF98 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801BFF60 = D_8018774C; - D_801BFF64 = D_801877F4; - D_801BFF68 = D_801876A4; - } else { - D_801BFF60 = D_801877A0; - D_801BFF64 = D_80187820; - D_801BFF68 = D_801876F8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801BFF98 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801BFF90 & 2) != 0) { - D_801C1734[0] = 0x140; - D_801C1734[3] = 0x80; - if (p[0x37] == 4) { - D_801C1734[0] = 0x140; - D_801C1734[3] = 0; - } - if (p[0x37] == 0) { - D_801C1734[0] = 0x140; - D_801C1734[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801BFF68)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801BFF68; -extern s16 *D_801BFF6C; -extern s32 D_801BFF7C; -extern s32 D_801BFF9C; -extern s32 D_801BFFA0; -extern s32 D_801BFFA4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801BFF6C != 0) { - D_801BFF7C = 0; - p = (int *)(param_1 * 12 + (int)D_801BFF68); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801BFF9C != x) { - flag = 1; - if (D_801BFF9C < x) { - if (x - D_801BFF9C < 5) { - D_801BFF9C = x; - } else { - D_801BFF9C = D_801BFF9C + 4; - } - } else { - if (D_801BFF9C - x < 5) { - D_801BFF9C = x; - } else { - D_801BFF9C = D_801BFF9C - 4; - } - } - } - if (D_801BFFA0 != y) { - flag = 1; - if (D_801BFFA0 < y) { - if (y - D_801BFFA0 < 5) { - D_801BFFA0 = y; - } else { - D_801BFFA0 = D_801BFFA0 + 4; - } - } else { - if (D_801BFFA0 - y < 5) { - D_801BFFA0 = y; - } else { - D_801BFFA0 = D_801BFFA0 - 4; - } - } - } - if (D_801BFFA4 != z) { - flag = 1; - if (D_801BFFA4 < z) { - if (z - D_801BFFA4 < 5) { - D_801BFFA4 = z; - } else { - D_801BFFA4 = D_801BFFA4 + 4; - } - } else { - if (D_801BFFA4 - z < 5) { - D_801BFFA4 = z; - } else { - D_801BFFA4 = D_801BFFA4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801BFF7C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801878B0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801BFF6C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BFF9C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BFFA0); - uVar5 = (*(int*)&D_801BFFA4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801878B0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801BFF84; - -s32 func_8013E054(void) { - return D_801BFF84; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801882AC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80188284; -extern s16 D_80188286; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801882AC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80188284 = 2; - D_80188286 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80188286 = 0; - D_80188284 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801BFFB8; - extern void * D_801BFFBC; - extern unsigned char D_80187F24; - extern unsigned char D_80187F3C; - extern unsigned char D_80187FB0; - extern unsigned char D_80187FB8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801BFFB8 = &D_80187F24; - D_801BFFBC = &D_80187FB0; - } else { - D_801BFFB8 = &D_80187F3C; - D_801BFFBC = &D_80187FB8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801882AC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801882AC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801882AC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80188288; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188288)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188288)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80188284; -extern s16 D_80188286; -extern unsigned char D_80188288; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188286` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80188284` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80188286; - if (*r < 3) { - *r = *r + 1; - } - D_80188284 = (u16)D_80188284 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188288); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80188288; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188288); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_024/ov_SC03_024_jr_801380E0.c b/src/ov_SC03_024/ov_SC03_024_jr_801380E0.c new file mode 100644 index 000000000..2285891c0 --- /dev/null +++ b/src/ov_SC03_024/ov_SC03_024_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801BEBFC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801871A4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801BFE74; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C17E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801BEBFC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80186EE0)(); +extern s16 (*D_80186EE4)(); +extern M2C_UNK (*D_80186EEC)(); +extern s32 (*D_80186EF0)(); +extern s32 D_801BFE70; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801BEC00; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80187238; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018A71C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80187250; +extern M2C_UNK D_80187258; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80187260; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018727C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80187288[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018729C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801872EC[]; +extern s16 D_8018731C[]; +extern s16 D_8018737C[]; +extern s16 D_80187384[]; +extern s16 D_801873A4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801873DC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80187434[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018747C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80187484[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018748C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80187494[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018743C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018745C; +extern void func_801321B0(int param_1); +extern int D_8018746C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801BFEE0; +extern s32 D_801BFEE4[]; +extern int D_801BFEE8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801874A0; +extern u8 D_8018749C; +extern s16 *D_801874A4; +extern u8 D_801874A8; +extern int D_801BFEE0; +extern u16 D_801BFEF0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801874A4; /* holds a pointer value (*(u16**)&D_801874A4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801874B8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018750C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80187510[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80187510[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80187554; +extern u8 D_80187598; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80187554; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80187598 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801875DC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80187618[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80187618; + if (((s16)a1) < 0xC00) { + tbl = D_801875DC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80187654, D_80187656, D_80187658, D_8018765A, D_8018765C, D_8018765E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187656 < ang)) goto outer_else; + if (!(ang < D_8018765C)) goto inner_else; + if (ang < D_80187658) { *(s16 *)L = D_80187658; goto done; } + if (D_8018765A < ang) { *(s16 *)L = D_8018765A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187654) { *(s16 *)L = D_80187654; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018765E < ang) { *(s16 *)L = D_8018765E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801BFF58; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801BFF58, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801BFF58; +extern s8 D_801BFF5C; +extern s8 D_801BFF5D; + +void func_8013C9C4(void * arg0) +{ + D_801BFF58 = arg0; + D_801BFF5C = 0; + D_801BFF5D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801BFF58; +extern s8 D_801BFF5C; +extern s8 D_801BFF5D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801BFF58; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801BFF5D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801BFF5C)) * 2) + D_801BFF58); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801BFF5D = (unsigned char) p[1]; + D_801BFF5C = D_801BFF5C + 1; + if (D_801BFF5D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801BFF5C = 0; + *base = 0; + } + } + else + { + D_801BFF5D = c - 1; + } + } + return; +} + + + +extern s32 D_801BFF7C; +extern s32 D_801BFF70; +extern s32 D_801BFF74; +extern s32 D_801BFF80; + +void func_8013CABC(void) { + D_801BFF7C = 1; + D_801BFF70 = 1; + D_801BFF74 = 0; + D_801BFF80 = 1; +} + + + +extern s32 D_801BFF70; +extern s32 D_801BFF74; +extern s32 D_801BFF78; +extern s32 D_801BFF7C; +extern s32 D_801BFF80; + +void func_8013CAE8(void) { + D_801BFF70 = 1; + D_801BFF7C = 0; + D_801BFF74 = 0; + D_801BFF78 = -1; + D_801BFF80 = 0; +} + + + +extern s32 D_801BFF7C; +extern s32 D_801BFF80; +extern s32 D_801BFFA8; +extern s32 D_801BFFAC; + +void func_8013CB20(void) +{ + D_801BFFA8 = D_801BFF80; + D_801BFFAC = D_801BFF7C; + D_801BFF80 = 1; + D_801BFF7C = 0; +} + + + +extern s32 D_801BFFA8; +extern s32 D_801BFFAC; +extern s32 D_801BFF80; +extern s32 D_801BFF7C; + +void func_8013CB5C(void) { + D_801BFF80 = D_801BFFA8; + D_801BFF7C = D_801BFFAC; +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C16F8; + extern u8 D_801C16F9; + extern u8 D_801C16FA; + extern u8 D_801C16FB; + extern u8 D_801C16FC; + extern u8 D_801C16FD; + extern u8 D_801C16FE; + extern u8 D_801C16FF; + extern u8 D_801C1700; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C16F8; t1 = D_801C16F9; t2 = D_801C16FA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C16FB; t1 = D_801C16FC; t2 = D_801C16FD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C16FE; t1 = D_801C16FF; t2 = D_801C1700; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801BFF88; +extern s32 D_801BFF70; +extern s32 D_801BFF8C; +extern s32 D_801BFF7C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801BFF88 != 0) { + if (D_801BFF88 != 2) { + if (((D_801BFF88 < 3) && (D_801BFF88 == 1)) && + (D_801BFF8C = D_801BFF8C + 1, 0x23a < D_801BFF8C)) { + D_801BFF70 = D_801BFF88; + D_801BFF88 = 2; + } + } else { + D_801BFF70 = D_801BFF70 + -1; + if (D_801BFF70 == 0) { + D_801BFF70 = D_801BFF88; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801BFF7C == 0) { + D_801BFF88 = D_801BFF88 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801BFF7C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801BFF7C; +} + + + +extern s32 D_801BFF88; + +void func_8013D164(void) { + D_801BFF88 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C17DA; +extern u8 D_801C184E; +extern u8 D_801C1702; +extern u8 D_801C17BC; +extern u8 D_801C16E0; +extern u8 D_801C1701; +extern s32 D_801C17C0; + +void func_8013D330(void) { + if ((D_801C17DA & 0xff) != D_801C184E) { + D_801C17DA = ((D_801C17DA & 0xff) < D_801C184E) ? (D_801C17DA + 1) : (D_801C17DA - 1); + } + if ((D_801C1702 & 0xff) != D_801C17BC) { + D_801C1702 = ((D_801C1702 & 0xff) < D_801C17BC) ? (D_801C1702 + 1) : (D_801C1702 - 1); + } + if ((D_801C16E0 & 0xff) != D_801C1701) { + D_801C16E0 = ((D_801C16E0 & 0xff) < D_801C1701) ? (D_801C16E0 + 1) : (D_801C16E0 - 1); + } + D_801C17C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801BFF60; +extern void *D_801BFF64; +extern void *D_801BFF68; +extern s32 D_801BFF90; +extern s32 D_801BFF94; +extern s32 D_801BFF98; +extern s32 D_801C1734[]; + +extern u8 D_8018774C[]; +extern u8 D_801877F4[]; +extern u8 D_801876A4[]; +extern u8 D_801877A0[]; +extern u8 D_80187820[]; +extern u8 D_801876F8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801BFF90 = param_2; + D_801BFF94 = (param_2 >> 2) & 3; + D_801BFF98 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801BFF60 = D_8018774C; + D_801BFF64 = D_801877F4; + D_801BFF68 = D_801876A4; + } else { + D_801BFF60 = D_801877A0; + D_801BFF64 = D_80187820; + D_801BFF68 = D_801876F8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801BFF98 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801BFF90 & 2) != 0) { + D_801C1734[0] = 0x140; + D_801C1734[3] = 0x80; + if (p[0x37] == 4) { + D_801C1734[0] = 0x140; + D_801C1734[3] = 0; + } + if (p[0x37] == 0) { + D_801C1734[0] = 0x140; + D_801C1734[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801BFF68)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801BFF68; +extern s16 *D_801BFF6C; +extern s32 D_801BFF7C; +extern s32 D_801BFF9C; +extern s32 D_801BFFA0; +extern s32 D_801BFFA4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801BFF6C != 0) { + D_801BFF7C = 0; + p = (int *)(param_1 * 12 + (int)D_801BFF68); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801BFF9C != x) { + flag = 1; + if (D_801BFF9C < x) { + if (x - D_801BFF9C < 5) { + D_801BFF9C = x; + } else { + D_801BFF9C = D_801BFF9C + 4; + } + } else { + if (D_801BFF9C - x < 5) { + D_801BFF9C = x; + } else { + D_801BFF9C = D_801BFF9C - 4; + } + } + } + if (D_801BFFA0 != y) { + flag = 1; + if (D_801BFFA0 < y) { + if (y - D_801BFFA0 < 5) { + D_801BFFA0 = y; + } else { + D_801BFFA0 = D_801BFFA0 + 4; + } + } else { + if (D_801BFFA0 - y < 5) { + D_801BFFA0 = y; + } else { + D_801BFFA0 = D_801BFFA0 - 4; + } + } + } + if (D_801BFFA4 != z) { + flag = 1; + if (D_801BFFA4 < z) { + if (z - D_801BFFA4 < 5) { + D_801BFFA4 = z; + } else { + D_801BFFA4 = D_801BFFA4 + 4; + } + } else { + if (D_801BFFA4 - z < 5) { + D_801BFFA4 = z; + } else { + D_801BFFA4 = D_801BFFA4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801BFF7C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801878B0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801BFF6C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BFF9C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BFFA0); + uVar5 = (*(int*)&D_801BFFA4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801878B0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801BFF84; + +s32 func_8013E054(void) { + return D_801BFF84; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801882AC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80188284; +extern s16 D_80188286; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801882AC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80188284 = 2; + D_80188286 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80188286 = 0; + D_80188284 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801BFFB8; + extern void * D_801BFFBC; + extern unsigned char D_80187F24; + extern unsigned char D_80187F3C; + extern unsigned char D_80187FB0; + extern unsigned char D_80187FB8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801BFFB8 = &D_80187F24; + D_801BFFBC = &D_80187FB0; + } else { + D_801BFFB8 = &D_80187F3C; + D_801BFFBC = &D_80187FB8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801882AC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801882AC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801882AC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80188288; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188288)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188288)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80188284; +extern s16 D_80188286; +extern unsigned char D_80188288; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188286` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80188284` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80188286; + if (*r < 3) { + *r = *r + 1; + } + D_80188284 = (u16)D_80188284 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188288); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80188288; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188288); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_028/ov_SC03_028_jr_8012ACE0.c b/src/ov_SC03_028/ov_SC03_028_jr_8012ACE0.c index 6a19af61f..88fbd3a2f 100644 --- a/src/ov_SC03_028/ov_SC03_028_jr_8012ACE0.c +++ b/src/ov_SC03_028/ov_SC03_028_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018BFDC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018BFDC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018C020; -extern u8 D_8018C064; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018C020; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018C064 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018C0A8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018C0E4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018C0E4; - if (((s16)a1) < 0xC00) { - tbl = D_8018C0A8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018C120, D_8018C122, D_8018C124, D_8018C126, D_8018C128, D_8018C12A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018C122 < ang)) goto outer_else; - if (!(ang < D_8018C128)) goto inner_else; - if (ang < D_8018C124) { *(s16 *)L = D_8018C124; goto done; } - if (D_8018C126 < ang) { *(s16 *)L = D_8018C126; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018C120) { *(s16 *)L = D_8018C120; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018C12A < ang) { *(s16 *)L = D_8018C12A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801EA290; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801EA290, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801EA290; -extern s8 D_801EA294; -extern s8 D_801EA295; - -void func_8013C9C4(void * arg0) -{ - D_801EA290 = arg0; - D_801EA294 = 0; - D_801EA295 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801EA290; -extern s8 D_801EA294; -extern s8 D_801EA295; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801EA290; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801EA295; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801EA294)) * 2) + D_801EA290); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801EA295 = (unsigned char) p[1]; - D_801EA294 = D_801EA294 + 1; - if (D_801EA295 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801EA294 = 0; - *base = 0; - } - } - else - { - D_801EA295 = c - 1; - } - } - return; -} - - - -extern s32 D_801EA2B4; -extern s32 D_801EA2A8; -extern s32 D_801EA2AC; -extern s32 D_801EA2B8; - -void func_8013CABC(void) { - D_801EA2B4 = 1; - D_801EA2A8 = 1; - D_801EA2AC = 0; - D_801EA2B8 = 1; -} - - - -extern s32 D_801EA2A8; -extern s32 D_801EA2AC; -extern s32 D_801EA2B0; -extern s32 D_801EA2B4; -extern s32 D_801EA2B8; - -void func_8013CAE8(void) { - D_801EA2A8 = 1; - D_801EA2B4 = 0; - D_801EA2AC = 0; - D_801EA2B0 = -1; - D_801EA2B8 = 0; -} - - - -extern s32 D_801EA2B4; -extern s32 D_801EA2B8; -extern s32 D_801EA2E0; -extern s32 D_801EA2E4; - -void func_8013CB20(void) -{ - D_801EA2E0 = D_801EA2B8; - D_801EA2E4 = D_801EA2B4; - D_801EA2B8 = 1; - D_801EA2B4 = 0; -} - - - -extern s32 D_801EA2E0; -extern s32 D_801EA2E4; -extern s32 D_801EA2B8; -extern s32 D_801EA2B4; - -void func_8013CB5C(void) { - D_801EA2B8 = D_801EA2E0; - D_801EA2B4 = D_801EA2E4; -} - - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801EC4B0; - extern u8 D_801EC4B1; - extern u8 D_801EC4B2; - extern u8 D_801EC4B3; - extern u8 D_801EC4B4; - extern u8 D_801EC4B5; - extern u8 D_801EC4B6; - extern u8 D_801EC4B7; - extern u8 D_801EC4B8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801EC4B0; t1 = D_801EC4B1; t2 = D_801EC4B2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801EC4B3; t1 = D_801EC4B4; t2 = D_801EC4B5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801EC4B6; t1 = D_801EC4B7; t2 = D_801EC4B8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801EA2C0; -extern s32 D_801EA2A8; -extern s32 D_801EA2C4; -extern s32 D_801EA2B4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801EA2C0 != 0) { - if (D_801EA2C0 != 2) { - if (((D_801EA2C0 < 3) && (D_801EA2C0 == 1)) && - (D_801EA2C4 = D_801EA2C4 + 1, 0x23a < D_801EA2C4)) { - D_801EA2A8 = D_801EA2C0; - D_801EA2C0 = 2; - } - } else { - D_801EA2A8 = D_801EA2A8 + -1; - if (D_801EA2A8 == 0) { - D_801EA2A8 = D_801EA2C0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801EA2B4 == 0) { - D_801EA2C0 = D_801EA2C0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801EA2B4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801EA2B4; -} - - - -extern s32 D_801EA2C0; - -void func_8013D164(void) { - D_801EA2C0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801EC592; -extern u8 D_801EC606; -extern u8 D_801EC4BA; -extern u8 D_801EC574; -extern u8 D_801EC498; -extern u8 D_801EC4B9; -extern s32 D_801EC578; - -void func_8013D330(void) { - if ((D_801EC592 & 0xff) != D_801EC606) { - D_801EC592 = ((D_801EC592 & 0xff) < D_801EC606) ? (D_801EC592 + 1) : (D_801EC592 - 1); - } - if ((D_801EC4BA & 0xff) != D_801EC574) { - D_801EC4BA = ((D_801EC4BA & 0xff) < D_801EC574) ? (D_801EC4BA + 1) : (D_801EC4BA - 1); - } - if ((D_801EC498 & 0xff) != D_801EC4B9) { - D_801EC498 = ((D_801EC498 & 0xff) < D_801EC4B9) ? (D_801EC498 + 1) : (D_801EC498 - 1); - } - D_801EC578 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801EA298; -extern void *D_801EA29C; -extern void *D_801EA2A0; -extern s32 D_801EA2C8; -extern s32 D_801EA2CC; -extern s32 D_801EA2D0; -extern s32 D_801EC4EC[]; - -extern u8 D_8018C218[]; -extern u8 D_8018C2C0[]; -extern u8 D_8018C170[]; -extern u8 D_8018C26C[]; -extern u8 D_8018C2EC[]; -extern u8 D_8018C1C4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801EA2C8 = param_2; - D_801EA2CC = (param_2 >> 2) & 3; - D_801EA2D0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801EA298 = D_8018C218; - D_801EA29C = D_8018C2C0; - D_801EA2A0 = D_8018C170; - } else { - D_801EA298 = D_8018C26C; - D_801EA29C = D_8018C2EC; - D_801EA2A0 = D_8018C1C4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801EA2D0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801EA2C8 & 2) != 0) { - D_801EC4EC[0] = 0x140; - D_801EC4EC[3] = 0x80; - if (p[0x37] == 4) { - D_801EC4EC[0] = 0x140; - D_801EC4EC[3] = 0; - } - if (p[0x37] == 0) { - D_801EC4EC[0] = 0x140; - D_801EC4EC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801EA2A0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801EA2A0; -extern s16 *D_801EA2A4; -extern s32 D_801EA2B4; -extern s32 D_801EA2D4; -extern s32 D_801EA2D8; -extern s32 D_801EA2DC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801EA2A4 != 0) { - D_801EA2B4 = 0; - p = (int *)(param_1 * 12 + (int)D_801EA2A0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801EA2D4 != x) { - flag = 1; - if (D_801EA2D4 < x) { - if (x - D_801EA2D4 < 5) { - D_801EA2D4 = x; - } else { - D_801EA2D4 = D_801EA2D4 + 4; - } - } else { - if (D_801EA2D4 - x < 5) { - D_801EA2D4 = x; - } else { - D_801EA2D4 = D_801EA2D4 - 4; - } - } - } - if (D_801EA2D8 != y) { - flag = 1; - if (D_801EA2D8 < y) { - if (y - D_801EA2D8 < 5) { - D_801EA2D8 = y; - } else { - D_801EA2D8 = D_801EA2D8 + 4; - } - } else { - if (D_801EA2D8 - y < 5) { - D_801EA2D8 = y; - } else { - D_801EA2D8 = D_801EA2D8 - 4; - } - } - } - if (D_801EA2DC != z) { - flag = 1; - if (D_801EA2DC < z) { - if (z - D_801EA2DC < 5) { - D_801EA2DC = z; - } else { - D_801EA2DC = D_801EA2DC + 4; - } - } else { - if (D_801EA2DC - z < 5) { - D_801EA2DC = z; - } else { - D_801EA2DC = D_801EA2DC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801EA2B4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018C37C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801EA2A4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EA2D4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EA2D8); - uVar5 = (*(int*)&D_801EA2DC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018C37C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801EA2BC; - -s32 func_8013E054(void) { - return D_801EA2BC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018CD78; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018CD50; -extern s16 D_8018CD52; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018CD78; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018CD50 = 2; - D_8018CD52 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018CD52 = 0; - D_8018CD50 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801EA2F0; - extern void * D_801EA2F4; - extern unsigned char D_8018C9F0; - extern unsigned char D_8018CA08; - extern unsigned char D_8018CA7C; - extern unsigned char D_8018CA84; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801EA2F0 = &D_8018C9F0; - D_801EA2F4 = &D_8018CA7C; - } else { - D_801EA2F0 = &D_8018CA08; - D_801EA2F4 = &D_8018CA84; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018CD78/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018CD78 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018CD78)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018CD54; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018CD54)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018CD54)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018CD50; -extern s16 D_8018CD52; -extern unsigned char D_8018CD54; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018CD52` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018CD50` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018CD52; - if (*r < 3) { - *r = *r + 1; - } - D_8018CD50 = (u16)D_8018CD50 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CD54); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018CD54; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CD54); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_028/ov_SC03_028_jr_801380E0.c b/src/ov_SC03_028/ov_SC03_028_jr_801380E0.c new file mode 100644 index 000000000..49f9c7378 --- /dev/null +++ b/src/ov_SC03_028/ov_SC03_028_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E8D84; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018BC70[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801EA1AC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801EC598; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E8D84; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018B9AC)(); +extern s16 (*D_8018B9B0)(); +extern M2C_UNK (*D_8018B9B8)(); +extern s32 (*D_8018B9BC)(); +extern s32 D_801EA1A8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E8D88; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018BD04; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018F1E8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018BD1C; +extern M2C_UNK D_8018BD24; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018BD2C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018BD48[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018BD54[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018BD68[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018BDB8[]; +extern s16 D_8018BDE8[]; +extern s16 D_8018BE48[]; +extern s16 D_8018BE50[]; +extern s16 D_8018BE70[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018BEA8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018BF00[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018BF48[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018BF50[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018BF58[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018BF60[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018BF08; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018BF28; +extern void func_801321B0(int param_1); +extern int D_8018BF38; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801EA218; +extern s32 D_801EA21C[]; +extern int D_801EA220; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018BF6C; +extern u8 D_8018BF68; +extern s16 *D_8018BF70; +extern u8 D_8018BF74; +extern int D_801EA218; +extern u16 D_801EA228; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018BF70; /* holds a pointer value (*(u16**)&D_8018BF70) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018BF84[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018BFD8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018BFDC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018BFDC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018C020; +extern u8 D_8018C064; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018C020; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018C064 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018C0A8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018C0E4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018C0E4; + if (((s16)a1) < 0xC00) { + tbl = D_8018C0A8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018C120, D_8018C122, D_8018C124, D_8018C126, D_8018C128, D_8018C12A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018C122 < ang)) goto outer_else; + if (!(ang < D_8018C128)) goto inner_else; + if (ang < D_8018C124) { *(s16 *)L = D_8018C124; goto done; } + if (D_8018C126 < ang) { *(s16 *)L = D_8018C126; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018C120) { *(s16 *)L = D_8018C120; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018C12A < ang) { *(s16 *)L = D_8018C12A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801EA290; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801EA290, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801EA290; +extern s8 D_801EA294; +extern s8 D_801EA295; + +void func_8013C9C4(void * arg0) +{ + D_801EA290 = arg0; + D_801EA294 = 0; + D_801EA295 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801EA290; +extern s8 D_801EA294; +extern s8 D_801EA295; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801EA290; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801EA295; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801EA294)) * 2) + D_801EA290); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801EA295 = (unsigned char) p[1]; + D_801EA294 = D_801EA294 + 1; + if (D_801EA295 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801EA294 = 0; + *base = 0; + } + } + else + { + D_801EA295 = c - 1; + } + } + return; +} + + + +extern s32 D_801EA2B4; +extern s32 D_801EA2A8; +extern s32 D_801EA2AC; +extern s32 D_801EA2B8; + +void func_8013CABC(void) { + D_801EA2B4 = 1; + D_801EA2A8 = 1; + D_801EA2AC = 0; + D_801EA2B8 = 1; +} + + + +extern s32 D_801EA2A8; +extern s32 D_801EA2AC; +extern s32 D_801EA2B0; +extern s32 D_801EA2B4; +extern s32 D_801EA2B8; + +void func_8013CAE8(void) { + D_801EA2A8 = 1; + D_801EA2B4 = 0; + D_801EA2AC = 0; + D_801EA2B0 = -1; + D_801EA2B8 = 0; +} + + + +extern s32 D_801EA2B4; +extern s32 D_801EA2B8; +extern s32 D_801EA2E0; +extern s32 D_801EA2E4; + +void func_8013CB20(void) +{ + D_801EA2E0 = D_801EA2B8; + D_801EA2E4 = D_801EA2B4; + D_801EA2B8 = 1; + D_801EA2B4 = 0; +} + + + +extern s32 D_801EA2E0; +extern s32 D_801EA2E4; +extern s32 D_801EA2B8; +extern s32 D_801EA2B4; + +void func_8013CB5C(void) { + D_801EA2B8 = D_801EA2E0; + D_801EA2B4 = D_801EA2E4; +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801EC4B0; + extern u8 D_801EC4B1; + extern u8 D_801EC4B2; + extern u8 D_801EC4B3; + extern u8 D_801EC4B4; + extern u8 D_801EC4B5; + extern u8 D_801EC4B6; + extern u8 D_801EC4B7; + extern u8 D_801EC4B8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801EC4B0; t1 = D_801EC4B1; t2 = D_801EC4B2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801EC4B3; t1 = D_801EC4B4; t2 = D_801EC4B5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801EC4B6; t1 = D_801EC4B7; t2 = D_801EC4B8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801EA2C0; +extern s32 D_801EA2A8; +extern s32 D_801EA2C4; +extern s32 D_801EA2B4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801EA2C0 != 0) { + if (D_801EA2C0 != 2) { + if (((D_801EA2C0 < 3) && (D_801EA2C0 == 1)) && + (D_801EA2C4 = D_801EA2C4 + 1, 0x23a < D_801EA2C4)) { + D_801EA2A8 = D_801EA2C0; + D_801EA2C0 = 2; + } + } else { + D_801EA2A8 = D_801EA2A8 + -1; + if (D_801EA2A8 == 0) { + D_801EA2A8 = D_801EA2C0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801EA2B4 == 0) { + D_801EA2C0 = D_801EA2C0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801EA2B4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801EA2B4; +} + + + +extern s32 D_801EA2C0; + +void func_8013D164(void) { + D_801EA2C0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801EC592; +extern u8 D_801EC606; +extern u8 D_801EC4BA; +extern u8 D_801EC574; +extern u8 D_801EC498; +extern u8 D_801EC4B9; +extern s32 D_801EC578; + +void func_8013D330(void) { + if ((D_801EC592 & 0xff) != D_801EC606) { + D_801EC592 = ((D_801EC592 & 0xff) < D_801EC606) ? (D_801EC592 + 1) : (D_801EC592 - 1); + } + if ((D_801EC4BA & 0xff) != D_801EC574) { + D_801EC4BA = ((D_801EC4BA & 0xff) < D_801EC574) ? (D_801EC4BA + 1) : (D_801EC4BA - 1); + } + if ((D_801EC498 & 0xff) != D_801EC4B9) { + D_801EC498 = ((D_801EC498 & 0xff) < D_801EC4B9) ? (D_801EC498 + 1) : (D_801EC498 - 1); + } + D_801EC578 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801EA298; +extern void *D_801EA29C; +extern void *D_801EA2A0; +extern s32 D_801EA2C8; +extern s32 D_801EA2CC; +extern s32 D_801EA2D0; +extern s32 D_801EC4EC[]; + +extern u8 D_8018C218[]; +extern u8 D_8018C2C0[]; +extern u8 D_8018C170[]; +extern u8 D_8018C26C[]; +extern u8 D_8018C2EC[]; +extern u8 D_8018C1C4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801EA2C8 = param_2; + D_801EA2CC = (param_2 >> 2) & 3; + D_801EA2D0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801EA298 = D_8018C218; + D_801EA29C = D_8018C2C0; + D_801EA2A0 = D_8018C170; + } else { + D_801EA298 = D_8018C26C; + D_801EA29C = D_8018C2EC; + D_801EA2A0 = D_8018C1C4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801EA2D0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801EA2C8 & 2) != 0) { + D_801EC4EC[0] = 0x140; + D_801EC4EC[3] = 0x80; + if (p[0x37] == 4) { + D_801EC4EC[0] = 0x140; + D_801EC4EC[3] = 0; + } + if (p[0x37] == 0) { + D_801EC4EC[0] = 0x140; + D_801EC4EC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801EA2A0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801EA2A0; +extern s16 *D_801EA2A4; +extern s32 D_801EA2B4; +extern s32 D_801EA2D4; +extern s32 D_801EA2D8; +extern s32 D_801EA2DC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801EA2A4 != 0) { + D_801EA2B4 = 0; + p = (int *)(param_1 * 12 + (int)D_801EA2A0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801EA2D4 != x) { + flag = 1; + if (D_801EA2D4 < x) { + if (x - D_801EA2D4 < 5) { + D_801EA2D4 = x; + } else { + D_801EA2D4 = D_801EA2D4 + 4; + } + } else { + if (D_801EA2D4 - x < 5) { + D_801EA2D4 = x; + } else { + D_801EA2D4 = D_801EA2D4 - 4; + } + } + } + if (D_801EA2D8 != y) { + flag = 1; + if (D_801EA2D8 < y) { + if (y - D_801EA2D8 < 5) { + D_801EA2D8 = y; + } else { + D_801EA2D8 = D_801EA2D8 + 4; + } + } else { + if (D_801EA2D8 - y < 5) { + D_801EA2D8 = y; + } else { + D_801EA2D8 = D_801EA2D8 - 4; + } + } + } + if (D_801EA2DC != z) { + flag = 1; + if (D_801EA2DC < z) { + if (z - D_801EA2DC < 5) { + D_801EA2DC = z; + } else { + D_801EA2DC = D_801EA2DC + 4; + } + } else { + if (D_801EA2DC - z < 5) { + D_801EA2DC = z; + } else { + D_801EA2DC = D_801EA2DC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801EA2B4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018C37C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801EA2A4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EA2D4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EA2D8); + uVar5 = (*(int*)&D_801EA2DC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018C37C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801EA2BC; + +s32 func_8013E054(void) { + return D_801EA2BC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018CD78; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018CD50; +extern s16 D_8018CD52; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018CD78; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018CD50 = 2; + D_8018CD52 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018CD52 = 0; + D_8018CD50 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801EA2F0; + extern void * D_801EA2F4; + extern unsigned char D_8018C9F0; + extern unsigned char D_8018CA08; + extern unsigned char D_8018CA7C; + extern unsigned char D_8018CA84; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801EA2F0 = &D_8018C9F0; + D_801EA2F4 = &D_8018CA7C; + } else { + D_801EA2F0 = &D_8018CA08; + D_801EA2F4 = &D_8018CA84; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018CD78/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018CD78 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018CD78)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018CD54; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018CD54)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018CD54)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018CD50; +extern s16 D_8018CD52; +extern unsigned char D_8018CD54; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018CD52` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018CD50` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018CD52; + if (*r < 3) { + *r = *r + 1; + } + D_8018CD50 = (u16)D_8018CD50 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CD54); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018CD54; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CD54); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_029/ov_SC03_029_jr_8012ACE0.c b/src/ov_SC03_029/ov_SC03_029_jr_8012ACE0.c index 1a13477e6..b3f02bf0f 100644 --- a/src/ov_SC03_029/ov_SC03_029_jr_8012ACE0.c +++ b/src/ov_SC03_029/ov_SC03_029_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80187E14[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80187E14[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80187E58; -extern u8 D_80187E9C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80187E58; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80187E9C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80187EE0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80187F1C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80187F1C; - if (((s16)a1) < 0xC00) { - tbl = D_80187EE0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80187F58, D_80187F5A, D_80187F5C, D_80187F5E, D_80187F60, D_80187F62; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80187F5A < ang)) goto outer_else; - if (!(ang < D_80187F60)) goto inner_else; - if (ang < D_80187F5C) { *(s16 *)L = D_80187F5C; goto done; } - if (D_80187F5E < ang) { *(s16 *)L = D_80187F5E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80187F58) { *(s16 *)L = D_80187F58; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80187F62 < ang) { *(s16 *)L = D_80187F62; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D8268; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D8268, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D8268; -extern s8 D_801D826C; -extern s8 D_801D826D; - -void func_8013C9C4(void * arg0) -{ - D_801D8268 = arg0; - D_801D826C = 0; - D_801D826D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D8268; -extern s8 D_801D826C; -extern s8 D_801D826D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D8268; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D826D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D826C)) * 2) + D_801D8268); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D826D = (unsigned char) p[1]; - D_801D826C = D_801D826C + 1; - if (D_801D826D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D826C = 0; - *base = 0; - } - } - else - { - D_801D826D = c - 1; - } - } - return; -} - - - -extern s32 D_801D828C; -extern s32 D_801D8280; -extern s32 D_801D8284; -extern s32 D_801D8290; - -void func_8013CABC(void) { - D_801D828C = 1; - D_801D8280 = 1; - D_801D8284 = 0; - D_801D8290 = 1; -} - - - -extern s32 D_801D8280; -extern s32 D_801D8284; -extern s32 D_801D8288; -extern s32 D_801D828C; -extern s32 D_801D8290; - -void func_8013CAE8(void) { - D_801D8280 = 1; - D_801D828C = 0; - D_801D8284 = 0; - D_801D8288 = -1; - D_801D8290 = 0; -} - - - -extern s32 D_801D828C; -extern s32 D_801D8290; -extern s32 D_801D82B8; -extern s32 D_801D82BC; - -void func_8013CB20(void) -{ - D_801D82B8 = D_801D8290; - D_801D82BC = D_801D828C; - D_801D8290 = 1; - D_801D828C = 0; -} - - - -extern s32 D_801D82B8; -extern s32 D_801D82BC; -extern s32 D_801D8290; -extern s32 D_801D828C; - -void func_8013CB5C(void) { - D_801D8290 = D_801D82B8; - D_801D828C = D_801D82BC; -} - - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D98F0; - extern u8 D_801D98F1; - extern u8 D_801D98F2; - extern u8 D_801D98F3; - extern u8 D_801D98F4; - extern u8 D_801D98F5; - extern u8 D_801D98F6; - extern u8 D_801D98F7; - extern u8 D_801D98F8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D98F0; t1 = D_801D98F1; t2 = D_801D98F2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D98F3; t1 = D_801D98F4; t2 = D_801D98F5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D98F6; t1 = D_801D98F7; t2 = D_801D98F8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D8298; -extern s32 D_801D8280; -extern s32 D_801D829C; -extern s32 D_801D828C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D8298 != 0) { - if (D_801D8298 != 2) { - if (((D_801D8298 < 3) && (D_801D8298 == 1)) && - (D_801D829C = D_801D829C + 1, 0x23a < D_801D829C)) { - D_801D8280 = D_801D8298; - D_801D8298 = 2; - } - } else { - D_801D8280 = D_801D8280 + -1; - if (D_801D8280 == 0) { - D_801D8280 = D_801D8298; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D828C == 0) { - D_801D8298 = D_801D8298 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D828C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D828C; -} - - - -extern s32 D_801D8298; - -void func_8013D164(void) { - D_801D8298 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D99D2; -extern u8 D_801D9A46; -extern u8 D_801D98FA; -extern u8 D_801D99B4; -extern u8 D_801D98D8; -extern u8 D_801D98F9; -extern s32 D_801D99B8; - -void func_8013D330(void) { - if ((D_801D99D2 & 0xff) != D_801D9A46) { - D_801D99D2 = ((D_801D99D2 & 0xff) < D_801D9A46) ? (D_801D99D2 + 1) : (D_801D99D2 - 1); - } - if ((D_801D98FA & 0xff) != D_801D99B4) { - D_801D98FA = ((D_801D98FA & 0xff) < D_801D99B4) ? (D_801D98FA + 1) : (D_801D98FA - 1); - } - if ((D_801D98D8 & 0xff) != D_801D98F9) { - D_801D98D8 = ((D_801D98D8 & 0xff) < D_801D98F9) ? (D_801D98D8 + 1) : (D_801D98D8 - 1); - } - D_801D99B8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D8270; -extern void *D_801D8274; -extern void *D_801D8278; -extern s32 D_801D82A0; -extern s32 D_801D82A4; -extern s32 D_801D82A8; -extern s32 D_801D992C[]; - -extern u8 D_80188050[]; -extern u8 D_801880F8[]; -extern u8 D_80187FA8[]; -extern u8 D_801880A4[]; -extern u8 D_80188124[]; -extern u8 D_80187FFC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D82A0 = param_2; - D_801D82A4 = (param_2 >> 2) & 3; - D_801D82A8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D8270 = D_80188050; - D_801D8274 = D_801880F8; - D_801D8278 = D_80187FA8; - } else { - D_801D8270 = D_801880A4; - D_801D8274 = D_80188124; - D_801D8278 = D_80187FFC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D82A8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D82A0 & 2) != 0) { - D_801D992C[0] = 0x140; - D_801D992C[3] = 0x80; - if (p[0x37] == 4) { - D_801D992C[0] = 0x140; - D_801D992C[3] = 0; - } - if (p[0x37] == 0) { - D_801D992C[0] = 0x140; - D_801D992C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D8278)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D8278; -extern s16 *D_801D827C; -extern s32 D_801D828C; -extern s32 D_801D82AC; -extern s32 D_801D82B0; -extern s32 D_801D82B4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D827C != 0) { - D_801D828C = 0; - p = (int *)(param_1 * 12 + (int)D_801D8278); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D82AC != x) { - flag = 1; - if (D_801D82AC < x) { - if (x - D_801D82AC < 5) { - D_801D82AC = x; - } else { - D_801D82AC = D_801D82AC + 4; - } - } else { - if (D_801D82AC - x < 5) { - D_801D82AC = x; - } else { - D_801D82AC = D_801D82AC - 4; - } - } - } - if (D_801D82B0 != y) { - flag = 1; - if (D_801D82B0 < y) { - if (y - D_801D82B0 < 5) { - D_801D82B0 = y; - } else { - D_801D82B0 = D_801D82B0 + 4; - } - } else { - if (D_801D82B0 - y < 5) { - D_801D82B0 = y; - } else { - D_801D82B0 = D_801D82B0 - 4; - } - } - } - if (D_801D82B4 != z) { - flag = 1; - if (D_801D82B4 < z) { - if (z - D_801D82B4 < 5) { - D_801D82B4 = z; - } else { - D_801D82B4 = D_801D82B4 + 4; - } - } else { - if (D_801D82B4 - z < 5) { - D_801D82B4 = z; - } else { - D_801D82B4 = D_801D82B4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D828C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801881B4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D827C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D82AC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D82B0); - uVar5 = (*(int*)&D_801D82B4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801881B4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D8294; - -s32 func_8013E054(void) { - return D_801D8294; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80188BB0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80188B88; -extern s16 D_80188B8A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80188BB0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80188B88 = 2; - D_80188B8A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80188B8A = 0; - D_80188B88 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D82C8; - extern void * D_801D82CC; - extern unsigned char D_80188828; - extern unsigned char D_80188840; - extern unsigned char D_801888B4; - extern unsigned char D_801888BC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D82C8 = &D_80188828; - D_801D82CC = &D_801888B4; - } else { - D_801D82C8 = &D_80188840; - D_801D82CC = &D_801888BC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80188BB0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188BB0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80188BB0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80188B8C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188B8C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188B8C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80188B88; -extern s16 D_80188B8A; -extern unsigned char D_80188B8C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188B8A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80188B88` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80188B8A; - if (*r < 3) { - *r = *r + 1; - } - D_80188B88 = (u16)D_80188B88 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188B8C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80188B8C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188B8C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_029/ov_SC03_029_jr_801380E0.c b/src/ov_SC03_029/ov_SC03_029_jr_801380E0.c new file mode 100644 index 000000000..3b2074b8e --- /dev/null +++ b/src/ov_SC03_029/ov_SC03_029_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D6EB8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80187AA8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D8184; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D99D8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D6EB8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801877E4)(); +extern s16 (*D_801877E8)(); +extern M2C_UNK (*D_801877F0)(); +extern s32 (*D_801877F4)(); +extern s32 D_801D8180; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D6EBC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80187B3C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018B020; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80187B54; +extern M2C_UNK D_80187B5C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80187B64; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80187B80[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80187B8C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80187BA0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80187BF0[]; +extern s16 D_80187C20[]; +extern s16 D_80187C80[]; +extern s16 D_80187C88[]; +extern s16 D_80187CA8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80187CE0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80187D38[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80187D80[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80187D88[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80187D90[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80187D98[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80187D40; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80187D60; +extern void func_801321B0(int param_1); +extern int D_80187D70; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D81F0; +extern s32 D_801D81F4[]; +extern int D_801D81F8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80187DA4; +extern u8 D_80187DA0; +extern s16 *D_80187DA8; +extern u8 D_80187DAC; +extern int D_801D81F0; +extern u16 D_801D8200; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80187DA8; /* holds a pointer value (*(u16**)&D_80187DA8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80187DBC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80187E10; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80187E14[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80187E14[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80187E58; +extern u8 D_80187E9C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80187E58; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80187E9C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80187EE0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80187F1C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80187F1C; + if (((s16)a1) < 0xC00) { + tbl = D_80187EE0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80187F58, D_80187F5A, D_80187F5C, D_80187F5E, D_80187F60, D_80187F62; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80187F5A < ang)) goto outer_else; + if (!(ang < D_80187F60)) goto inner_else; + if (ang < D_80187F5C) { *(s16 *)L = D_80187F5C; goto done; } + if (D_80187F5E < ang) { *(s16 *)L = D_80187F5E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187F58) { *(s16 *)L = D_80187F58; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187F62 < ang) { *(s16 *)L = D_80187F62; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D8268; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D8268, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D8268; +extern s8 D_801D826C; +extern s8 D_801D826D; + +void func_8013C9C4(void * arg0) +{ + D_801D8268 = arg0; + D_801D826C = 0; + D_801D826D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D8268; +extern s8 D_801D826C; +extern s8 D_801D826D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D8268; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D826D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D826C)) * 2) + D_801D8268); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D826D = (unsigned char) p[1]; + D_801D826C = D_801D826C + 1; + if (D_801D826D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D826C = 0; + *base = 0; + } + } + else + { + D_801D826D = c - 1; + } + } + return; +} + + + +extern s32 D_801D828C; +extern s32 D_801D8280; +extern s32 D_801D8284; +extern s32 D_801D8290; + +void func_8013CABC(void) { + D_801D828C = 1; + D_801D8280 = 1; + D_801D8284 = 0; + D_801D8290 = 1; +} + + + +extern s32 D_801D8280; +extern s32 D_801D8284; +extern s32 D_801D8288; +extern s32 D_801D828C; +extern s32 D_801D8290; + +void func_8013CAE8(void) { + D_801D8280 = 1; + D_801D828C = 0; + D_801D8284 = 0; + D_801D8288 = -1; + D_801D8290 = 0; +} + + + +extern s32 D_801D828C; +extern s32 D_801D8290; +extern s32 D_801D82B8; +extern s32 D_801D82BC; + +void func_8013CB20(void) +{ + D_801D82B8 = D_801D8290; + D_801D82BC = D_801D828C; + D_801D8290 = 1; + D_801D828C = 0; +} + + + +extern s32 D_801D82B8; +extern s32 D_801D82BC; +extern s32 D_801D8290; +extern s32 D_801D828C; + +void func_8013CB5C(void) { + D_801D8290 = D_801D82B8; + D_801D828C = D_801D82BC; +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D98F0; + extern u8 D_801D98F1; + extern u8 D_801D98F2; + extern u8 D_801D98F3; + extern u8 D_801D98F4; + extern u8 D_801D98F5; + extern u8 D_801D98F6; + extern u8 D_801D98F7; + extern u8 D_801D98F8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D98F0; t1 = D_801D98F1; t2 = D_801D98F2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D98F3; t1 = D_801D98F4; t2 = D_801D98F5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D98F6; t1 = D_801D98F7; t2 = D_801D98F8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D8298; +extern s32 D_801D8280; +extern s32 D_801D829C; +extern s32 D_801D828C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D8298 != 0) { + if (D_801D8298 != 2) { + if (((D_801D8298 < 3) && (D_801D8298 == 1)) && + (D_801D829C = D_801D829C + 1, 0x23a < D_801D829C)) { + D_801D8280 = D_801D8298; + D_801D8298 = 2; + } + } else { + D_801D8280 = D_801D8280 + -1; + if (D_801D8280 == 0) { + D_801D8280 = D_801D8298; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D828C == 0) { + D_801D8298 = D_801D8298 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D828C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D828C; +} + + + +extern s32 D_801D8298; + +void func_8013D164(void) { + D_801D8298 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D99D2; +extern u8 D_801D9A46; +extern u8 D_801D98FA; +extern u8 D_801D99B4; +extern u8 D_801D98D8; +extern u8 D_801D98F9; +extern s32 D_801D99B8; + +void func_8013D330(void) { + if ((D_801D99D2 & 0xff) != D_801D9A46) { + D_801D99D2 = ((D_801D99D2 & 0xff) < D_801D9A46) ? (D_801D99D2 + 1) : (D_801D99D2 - 1); + } + if ((D_801D98FA & 0xff) != D_801D99B4) { + D_801D98FA = ((D_801D98FA & 0xff) < D_801D99B4) ? (D_801D98FA + 1) : (D_801D98FA - 1); + } + if ((D_801D98D8 & 0xff) != D_801D98F9) { + D_801D98D8 = ((D_801D98D8 & 0xff) < D_801D98F9) ? (D_801D98D8 + 1) : (D_801D98D8 - 1); + } + D_801D99B8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D8270; +extern void *D_801D8274; +extern void *D_801D8278; +extern s32 D_801D82A0; +extern s32 D_801D82A4; +extern s32 D_801D82A8; +extern s32 D_801D992C[]; + +extern u8 D_80188050[]; +extern u8 D_801880F8[]; +extern u8 D_80187FA8[]; +extern u8 D_801880A4[]; +extern u8 D_80188124[]; +extern u8 D_80187FFC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D82A0 = param_2; + D_801D82A4 = (param_2 >> 2) & 3; + D_801D82A8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D8270 = D_80188050; + D_801D8274 = D_801880F8; + D_801D8278 = D_80187FA8; + } else { + D_801D8270 = D_801880A4; + D_801D8274 = D_80188124; + D_801D8278 = D_80187FFC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D82A8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D82A0 & 2) != 0) { + D_801D992C[0] = 0x140; + D_801D992C[3] = 0x80; + if (p[0x37] == 4) { + D_801D992C[0] = 0x140; + D_801D992C[3] = 0; + } + if (p[0x37] == 0) { + D_801D992C[0] = 0x140; + D_801D992C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D8278)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D8278; +extern s16 *D_801D827C; +extern s32 D_801D828C; +extern s32 D_801D82AC; +extern s32 D_801D82B0; +extern s32 D_801D82B4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D827C != 0) { + D_801D828C = 0; + p = (int *)(param_1 * 12 + (int)D_801D8278); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D82AC != x) { + flag = 1; + if (D_801D82AC < x) { + if (x - D_801D82AC < 5) { + D_801D82AC = x; + } else { + D_801D82AC = D_801D82AC + 4; + } + } else { + if (D_801D82AC - x < 5) { + D_801D82AC = x; + } else { + D_801D82AC = D_801D82AC - 4; + } + } + } + if (D_801D82B0 != y) { + flag = 1; + if (D_801D82B0 < y) { + if (y - D_801D82B0 < 5) { + D_801D82B0 = y; + } else { + D_801D82B0 = D_801D82B0 + 4; + } + } else { + if (D_801D82B0 - y < 5) { + D_801D82B0 = y; + } else { + D_801D82B0 = D_801D82B0 - 4; + } + } + } + if (D_801D82B4 != z) { + flag = 1; + if (D_801D82B4 < z) { + if (z - D_801D82B4 < 5) { + D_801D82B4 = z; + } else { + D_801D82B4 = D_801D82B4 + 4; + } + } else { + if (D_801D82B4 - z < 5) { + D_801D82B4 = z; + } else { + D_801D82B4 = D_801D82B4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D828C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801881B4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D827C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D82AC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D82B0); + uVar5 = (*(int*)&D_801D82B4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801881B4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D8294; + +s32 func_8013E054(void) { + return D_801D8294; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80188BB0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80188B88; +extern s16 D_80188B8A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80188BB0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80188B88 = 2; + D_80188B8A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80188B8A = 0; + D_80188B88 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D82C8; + extern void * D_801D82CC; + extern unsigned char D_80188828; + extern unsigned char D_80188840; + extern unsigned char D_801888B4; + extern unsigned char D_801888BC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D82C8 = &D_80188828; + D_801D82CC = &D_801888B4; + } else { + D_801D82C8 = &D_80188840; + D_801D82CC = &D_801888BC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80188BB0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188BB0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80188BB0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80188B8C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188B8C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188B8C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80188B88; +extern s16 D_80188B8A; +extern unsigned char D_80188B8C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188B8A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80188B88` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80188B8A; + if (*r < 3) { + *r = *r + 1; + } + D_80188B88 = (u16)D_80188B88 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188B8C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80188B8C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188B8C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_030/ov_SC03_030.c b/src/ov_SC03_030/ov_SC03_030.c index d214fefb1..45974a903 100644 --- a/src/ov_SC03_030/ov_SC03_030.c +++ b/src/ov_SC03_030/ov_SC03_030.c @@ -521,4843 +521,3 @@ void func_8012ACA0(void *arg0) { M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); func_8012AAAC(); } - - - - -// @class: iv-combine -// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). -typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ -typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ - -s32 func_8012ACE0(void *o) { - int i; - for (i = 0; ; i++) { - switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { - case -2: - case -1: - case 0: - return i; - case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ - default: - break; - } - } -} - -DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ - -DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ - - - -void func_8012AD64(s32 *a0, s16 a1) { - *(s16*)((s32)a0 + 0x34) = a1; -} - - -DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ - -DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ - -DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ - -DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ - -DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ - -DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ - -DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ - -DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ - -DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ - -DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ - -DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ - -DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ - -DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ - -DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ - -DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ - -DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ - -DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012B4B8); - -DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ - -DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ - -DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ - -DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012B77C); - -DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ - -DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ - -DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ - -DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ - -DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ - -DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ - -DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ - -DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ - -DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ - -DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ - -DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ - -DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ - -DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ - -DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ - - -void func_8012BF4C(s32 *a0, s32 a1) { - *(s32*)((s32)a0 + 0x1C) = a1; -} - - -DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ - -DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ - -DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ - -DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ - -DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012C098); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012C0EC); - -DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ - -DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ - -DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ - -DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ - -DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ - -DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ - -DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ - -DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ - -DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ - -DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ - -DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012C658); - -DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012C750); - -DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to -// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS -// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via -// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store -// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. -// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). - -extern s32 D_8018565C; -extern s16 D_801270C4; -extern u16 D_801274E4[]; -extern s32 D_8011DB08; -extern void func_80016714(void *a0, s32 a1); - -s32 func_8012C890(s32 a0, s32 a1, s32 a2) { - u8 *src = (u8 *)a0; - u8 *dst = (u8 *)a1; - u16 *d; - s16 count; - u16 v2, v4; - s32 v10; - void *obj; - - *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); - v2 = *(u16 *)(src + 0x0); - *(u16 *)(dst + 0x6) = v2; - *(u16 *)(dst + 0x88) = v2; - v2 = *(u16 *)(src + 0x2); - *(u16 *)(dst + 0xA) = v2; - *(u16 *)(dst + 0x8A) = v2; - v4 = *(u16 *)(src + 0x4); - *(u16 *)(dst + 0xC) = 0; - *(u16 *)(dst + 0x8) = 0; - *(u16 *)(dst + 0x4) = 0; - *(u16 *)(dst + 0xE) = v4; - *(u16 *)(dst + 0x8C) = v4; - *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); - *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; - *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); - v10 = *(s32 *)(src + 0x10); - *(s32 *)(dst + 0x78) = (s32)&D_8018565C; - *(s32 *)(dst + 0xDC) = v10; - - { - register u16 *pc __asm__("$3"); - pc = &(*(u16 *)&D_801270C4); - *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; - count = *(volatile u16 *)pc + 1; - *pc = count; - if (count == 0) { - *pc = 1; - } - } - - if (a2 != 0) { - *(s32 *)(dst + 0x64) = a2; - *(s32 *)(dst + 0x68) = 0; - } else { - *(s32 *)(dst + 0x64) = 0; - *(s32 *)(dst + 0x68) = (s32)src; - } - - *(u16 *)(src + 0xA) |= 0x8000; - *(u16 *)(dst + 0x2) = 0; - d = D_801274E4; - *d &= 0xFFFE; - (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); - - if (*d & 1) { - s32 a1v; - obj = *(void **)(dst + 0x20); - if (obj != 0) { - s32 t = *(u16 *)obj; - if (t != 1) { - if (t != 2) { - goto done; - } - a1v = 0x38; - } else { - a1v = 0x84; - } - func_80016714(obj, a1v); - done:; - } - func_80016714(dst, 0x10C); - *(u16 *)(src + 0xA) &= 0x7FFF; - return 0; - } - - if (*(s32 *)(dst + 0x64) == 0) { - void *o = *(void **)(dst + 0x20); - if (o == 0) { - return (s32)dst; - } - if (*(u16 *)o == 1) { - s16 c = *(s16 *)(src + 0xC); - if (c != 0x7FFF) { - *(s16 *)((u8 *)o + 0x12) = c; - } - } - } - if (*(s32 *)(dst + 0x20) != 0) { - *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); - } - return (s32)dst; -} - - -DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ - -DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ - -DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ - -DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ - -DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ - -DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ - -DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ - -DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012CC88); - -DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ - -DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ - -DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ - -DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ - -DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ - -DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ - -DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ - -DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ - -DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ - -DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ - -DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH - - -struct S8012D664_8012D664 { short a, b, c; }; - -int func_8012D664(int arg0, int arg1, int arg2) { - extern int func_8012F568(); - extern int D_80182188; - - struct S8012D664_8012D664 s; - int ret; - int t; - - s.a = (*(unsigned short*)&D_80126B5E); - s.b = (*(unsigned short*)&D_80126B62) - 0x40; - s.c = (*(unsigned short*)&D_80126B66); - ret = ((int(*)())func_800132BC)(arg0, &s); - t = arg1 + 0x20; - if (ret < t * t) { - func_8012F568(1, 1, 0, arg2, arg0, &D_80182188); - return 1; - } - return 0; -} - - - -DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ - - - -extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -extern void func_8014C978(void); -extern M2C_UNK D_80182190; -extern M2C_UNK D_80182198; - -s32 func_8012DB84(void) -{ - func_8014C978(); - func_8012F568(1, 0xC001, 0, 0x3E8, &D_80182190, &D_80182198); -} - - -DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH - - -typedef struct Entry_8012DDA4 { - u16 active; - unsigned char pad[0x10C - 2]; -} Entry_8012DDA4; - - -s32 func_8012DDA4() -{ - extern Entry_8012DDA4 * D_801E079C; - extern Entry_8012DDA4 * D_801E0798; - - Entry_8012DDA4 *p; - Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); - - while (D_801E079C != end) { - p = D_801E079C; - if (p->active != 0 && p != D_801E0798) { - D_801E079C = p + 1; - return p; - } - D_801E079C++; - } - D_801E079C = 0; - return 0; -} - - - -// @class: plumbing -// @stuck: none — MATCH (35/35 ins, relocation-masked) - - -s32 func_8012DE2C(s32 a0) { - extern u8 * D_801E079C; - extern u8 * D_801E0798; - - u8 *base; - u8 *end; - u8 *p; - - base = D_801202A0; - end = base + 0x6480; - D_801E079C = base; - D_801E0798 = ((u8 *)a0); - - while (D_801E079C != end) { - p = D_801E079C; - if (*(u16 *)p != 0 && p != ((u8 *)a0)) { - D_801E079C = p + 0x10C; - return p; - } - D_801E079C += 0x10C; - } - D_801E079C = 0; - return 0; -} - - - -DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ - -DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ - -DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ - -DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ - -DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012E014); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012E138); - - -s32 func_8012E27C(void) { - return 1; -} - - -DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ - -DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ - -DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012E364); - -DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ - -DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ - -DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ - -DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ - -DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH -extern u8 D_800AF648; -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) -{ - struct { short xy[2]; int sp14; int flag; } f; - register void *p __asm__("$4"); - p = &D_800AF648; - func_8004914C(p); - func_800491AC(&D_800AF648); - RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); - if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { - func_8002D4C8(param_2, param_3); - } -} - - -DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012E778); - -DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ - -DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ - -DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ - -DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ - - - -// @class: other -// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) - -extern void func_8016AA50(int, int); -extern void func_8016B428(int); -extern void func_80019064(void *); -extern int D_801821A0; - -void func_8012E9C0(int param_1) -{ - int iVar1; - - if (*(short *)(param_1 + 0x60) != 0) { - if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { - *(short *)(param_1 + 0x82) = 0; - *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); - *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); - *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); - } - if (*(int *)(param_1 + 0x78) != 0) { - iVar1 = *(short *)(param_1 + 0x60) * - *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; - if (iVar1 < 1) { - iVar1 = 1; - } - } else { - iVar1 = *(short *)(param_1 + 0x60); - } - func_8016AA50(param_1, iVar1); - if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { - func_8016B428(param_1); - func_80019064(&D_801821A0); - } - } - return; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012EA90); - -DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ - -DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ - -DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ - -DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012EFB8); - - -// @class: other -// @stuck: none — MATCH (33 ins, match_one verified) - -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); - -void func_8012F038(int param_1, short *param_2, short *param_3) { - int in[3]; - int out[3]; - - in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); - in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); - in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); - ApplyTransposeMatrixLV((void *)param_1, in, out); - param_3[0] = out[0]; - param_3[1] = out[1]; - param_3[2] = out[2]; -} - - -DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern void RotTransSV(s32 a0, s32 a1, void *a2); - -void func_8012F14C(s32 a0, s32 a1, s32 a2) -{ - s32 buf[2]; - func_8004914C((void *)a0); - func_800491AC((void *)a0); - RotTransSV(a1, a2, buf); -} - - -DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ - -DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012F274); - -DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ - -DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012F40C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8012F49C); - -DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ - -DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ - -DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ - -DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ - -DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) -extern void func_80131170(); -extern void func_80131CA8(); -extern unsigned char D_801821BC[]; - -void func_8012F828(int param_1) -{ - *(unsigned char *)(param_1 + 0xC1) = 4; - if (*(unsigned int *)(param_1 + 0xB4) & 8) { - func_80131170(param_1, D_801821BC, 0xB); - } - func_80131CA8(param_1, 9); -} - - -DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ - - -extern void func_80131170(s32 a0, s32 a1, s32 a2); -extern void func_80131CA8(int a0, int a1); -extern u8 D_801821C8[]; - -void func_8012F8C8(u8* arg0) { - *(u8*)(arg0 + 0xC1) = 7; - if (*(u32*)(arg0 + 0xB4) & 0x80) { - ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801821C8, 0xB); - } - ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); -} - - -DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ - -DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ - -DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ - -DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ - -DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. -// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for -// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be -// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an -// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). -// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: -// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. -// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which -// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because -// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. -// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out -// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, -// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what -// blocks reorg from sharing a downstream constant into a branch delay slot.) - - -s32 func_8012FCC4(s32 param_1) { - extern int D_801821D4; - - int v1 = *(int *)(((int)param_1) + 0xC4); - *(char *)(((int)param_1) + 0xC1) = 8; - if (v1 & 2) { - *(char *)(((int)param_1) + 0xC1) = 1; - func_80131CA8(((int)param_1), 3); - return; - } - if (v1 & 1) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 1); - return; - } - if (*(int *)(((int)param_1) + 0xB4) & 0x100) { - ((void (*)(int))func_80131B14)(((int)param_1)); - if (*(short *)(((int)param_1) + 0x76) <= 0) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); - return; - } - if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { - *(char *)(((int)param_1) + 0xC2) = 0; - } else { - *(short *)(((int)param_1) + 0x98) = 0; - *(char *)(((int)param_1) + 0xC2) = 1; - } - ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801821D4); - *(int *)(((int)param_1) + 0x1C) = 0; - func_80131CA8(((int)param_1), 0x1C); - return; - } - func_80131CA8(((int)param_1), 0x1C); -} - - - -DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ - -DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ - -DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ - -DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ - -DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ - -DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ - -DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ - -DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ - -DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ - -DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ - -DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ - -DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ - -DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ - -DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ - -DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ - -DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ - -DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80130650); - -DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ - -DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ - -DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ - -DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ - -DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ - -DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80130A18); - -DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ - -DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80130C08); - - -extern void (*D_801821DC[])(void); - -void func_80130D0C(void *a0) { - D_801821DC[*(u8 *)((s32)a0 + 0xC1)](); -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). -extern s32 rand(void); -extern u8 D_80078E78[]; -extern u16 D_80078EB2; -extern u16 D_80078EB4; -extern s16 D_8018222C[]; -extern s16 D_8018225C[]; -extern s16 D_801822BC[]; -extern s16 D_801822C4[]; -extern s16 D_801822E4[]; - -void func_80130D48(s32 arg0) -{ - register s16 *tbl __asm__("$16"); - register s32 pa __asm__("$18") = arg0; - register u8 *p __asm__("$19") = D_80078E78; - s32 s1v; - s32 call_a0; - s32 call_a1; - s32 cnt; - s32 r; - void *ret; - - s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); - if (s1v == 0) { - return; - } - - if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - } - - switch (s1v & 0xFFFF0000) { - case 0x10000: { - u32 x = D_80078EB4; - u32 y = D_80078EB2; - u32 b; - u32 a; - - s1v = 0; - if (x == y) { - s1v = 0xC; - } else if ((y >> 1) >= x) { - s1v = 3; - } - - b = *(u16 *)(p + 0x40); - a = *(u16 *)(p + 0x3E); - if (b == a) { - s1v += 0x18; - } else if ((a >> 1) >= b) { - s1v += 6; - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018225C; tbl = (s16 *)(bp + v1); } - - r = rand() % 100; - cnt = 0; - loop27: - if (r >= *tbl) { - cnt += 1; - tbl += 1; - if (cnt < 3) { - goto loop27; - } - } - - s1v = 0; - switch (cnt) { - case 0: - tbl = D_801822BC; - s1v = 0x31; - break; - case 1: { - s32 mx = *(u16 *)(p + 0x3A); - s32 cur = *(u16 *)(p + 0x3C); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822C4; tbl = (s16 *)(bp + v1); } - s1v = 0x32; - break; - } - case 2: { - s32 mx = *(u16 *)(p + 0x3E); - s32 cur = *(u16 *)(p + 0x40); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822E4; tbl = (s16 *)(bp + v1); } - s1v = 0x33; - break; - } - } - - r = rand() % 100; - call_a1 = 0; - loop50: - if (r >= *tbl) { - call_a1 += 1; - tbl += 1; - if (call_a1 < 4) { - goto loop50; - } - } - call_a0 = s1v; - goto do_call; - } - case 0x20000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x30000: - call_a0 = 0x31; - call_a1 = 0; - goto do_call; - case 0x40000: - call_a0 = 0x32; - call_a1 = 0; - goto do_call; - case 0x50000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x60000: { - s32 rr = rand() & 0xFF; - tbl = D_8018222C; - if (rr >= *tbl) { - do { - tbl += 3; - } while (rr >= *tbl); - } - call_a0 = tbl[1]; - if (*(u16 *)(p + 0x40) < 4U) { - call_a0 = 0x33; - } - call_a1 = tbl[2]; - goto do_call; - } - case 0x70000: - call_a0 = 0x27B; - call_a1 = 0; - goto do_call; - default: - return; - } - -do_call: - ret = func_8012C658(call_a0, call_a1, pa); - if (ret != 0) { - *(u16 *)((s8 *)ret + 0xA) -= 0x20; - } -} - - -// @class: loop-guard -// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps -// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` -// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); -// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's -// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC -// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). - - -void func_80131170(s32 p, s32 b, s32 c) { - extern u8 D_801821B0[]; - - func_80131B14(); - *(u8 *)(((u8 *)p) + 0xC2) = 0; - *(u8 *)(((u8 *)p) + 0xC3) = 0; - *(s16 *)(((u8 *)p) + 0x98) = 0; - if (((u8 *)b) == 0) { - ((u8 *)b) = D_801821B0; - } - func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); - *(s32 *)(((u8 *)p) + 0x1C) = 0; - if (c != 0) { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } else { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } -tail: - if (*(s16 *)(((u8 *)p) + 0x76) > 0) { - return; - } - if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); - } else { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); - } -} - - - -// @class: struct -// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) - -typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ - - -s32 func_801312D0(s32 param_1, void *param_2) -{ - extern int func_80131CF4(int, int); - extern M8_801312D0 D_80182304; - - int iVar5; - - iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); - if (iVar5 != 0) { - ((short *)param_2)[2] = 0; - ((short *)param_2)[0] = 0; - ((short *)param_2)[1] = (short)iVar5; - } else { - *(M8_801312D0 *)((short *)param_2) = D_80182304; - } -} - - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80131340); - -DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80131A34); - -DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` -// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be -// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a -// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). -// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; -// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the -// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); -// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. - -void func_80131B14() { - extern void func_8002A520(void *); - extern void func_8002A790(void *); - extern u8 D_8018230C; - - register u8 *a0v __asm__("$4"); - u8 *p = a0v; - - - s32 e = *(u8 *)(p + 0x5E); - - if (*(s16 *)(p + 0x60) != 0) { - if (e == 0x1D) { - *(s16 *)(p + 0x82) = 0; - *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); - *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); - *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); - } - { - s32 dec; - s32 q = *(s32 *)(p + 0x78); - if (q != 0) { - dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; - if (dec <= 0) dec = 1; - } - *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; - } - ((void (*)(void *))func_8016AA50)(p); - if (*(u16 *)(p + 0x82) & 1) { - ((void (*)(void *))func_8016B428)(p); - ((void(*)(void *))func_80019064)(&D_8018230C); - } - } - - *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; - - if (e != 0x1D) { - if (*(u8 *)(p + 0xC8)) func_8002A520(p); - if (*(u8 *)(p + 0xC9)) func_8002A790(p); - } - - if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; - - { - s32 r = *(s32 *)(p + 0x20); - *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; - { - s32 r2 = *(s32 *)(p + 0x20); - *(s16 *)(r2 + 0x14) = 0; - *(s16 *)(r2 + 0x10) = 0; - } - } - - ((void (*)(void *))func_8012B2CC)(p); - ((void (*)(void *))func_8012B23C)(p); -} - - - -DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80131CA8); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80131CF4); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80131D68); - - -extern void (*D_8018231C[])(struct S80131E00 *a0); - -void func_80131E00(struct S80131E00 *a0, s32 a1) { - a0->field_B0 = a1; - D_8018231C[a1](a0); -} - - -DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ - -DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ - -DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ - - -extern void (*D_80182374[])(void); - -void func_80131EEC(void *a0) { - D_80182374[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801823BC[])(void); - -void func_80131F28(void *a0) { - D_801823BC[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801823C4[])(void); - -void func_80131F64(void *a0) { - D_801823C4[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801823CC[])(void); - -void func_80131FA0(void *a0) { - D_801823CC[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801823D4[])(void); - -void func_80131FDC(void *a0) { - D_801823D4[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80132018); - -DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_8018237C; - -void func_801320D8(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_8018237C; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -s32 func_80132144(s32 param_1) -{ - extern int D_8018238C; - - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(((int)param_1) + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(((int)param_1)); - } else { - ((void(*)(int, int))func_8001C214)(v0, 0); - *(int *)(((int)param_1) + 0x58) = (int)&D_8018238C; - *(short *)(((int)param_1) + 0x5c) = 0x80; - *(unsigned short *)(((int)param_1) + 2) += 1; - } -} - - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_8018239C; - -void func_801321B0(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_8018239C; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_801823AC; - -void func_8013221C(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_801823AC; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - -DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ - -DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801325B8); - -DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ - -DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ - -DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ - -DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ - -DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ - -DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80132F40); - -DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801330E0); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80133298); - -DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ - -DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH - -extern s32 D_801E07E8; -extern s32 D_801E07EC[]; -extern int D_801E07F0; -extern void func_80136BC4(s32 a0); - -void func_801336E8(void *a0, int a1, int a2) { - if (a0 != 0) { - (*(void * *)&D_801E07E8) = a0; - ((void (*)(void))func_80136BC4)(); - } - (*(int *)&D_801E07EC) = a1; - D_801E07F0 = a2; -} - - - - -extern s32 D_801E07EC[]; -extern s32 D_801E07E8; -extern void func_80136BC4(s32); - -void func_8013373C(s16 arg0) { - s32 temp = D_801E07EC[arg0]; - if (temp != 0) { - D_801E07E8 = temp; - func_80136BC4(temp); - } -} - - -// @class: regalloc-order -#include "common.h" - -typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; - - -s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { - extern s32 func_80047D3C(s32); - extern s32 func_80133AB0(s16, s16, s16, s32); - extern Box_80133784 * D_801823DC; - extern Box_80133784 * D_801823E0; - extern s16 D_801E07F4; - extern u16 D_801E07F8; - - register s32 s1 __asm__("$17"); - s32 s2; - register s16 s3 __asm__("$19"); - register s32 s4 __asm__("$20"); - register s16 a0v __asm__("$4"); - register s16 arg0s __asm__("$21"); - s32 dx, dy, dz; - s32 r, ret; - - a0v = ((s16)arg0); - s1 = 0; - s3 = 0; - s4 = 0; - s2 = 0; - arg0s = a0v; - D_801823DC->f6 = -0x7FFF; - D_801823E0->f6 = 0x7FFF; - D_801823DC->f0 = ((Box_80133784 *)arg1)->f0; - D_801823DC->f4 = ((Box_80133784 *)arg1)->f4; - D_801823E0->f0 = ((Box_80133784 *)arg2)->f0; - D_801823E0->f4 = ((Box_80133784 *)arg2)->f4; - D_801E07F8 = 0; - D_801E07F4 = 0; - - if ((s16)a0v == 0) { - s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; - s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; - s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; - if (sx == 0 && sy == 0) { - s32 zt = (sz == 0); - __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); - } - D_801823DC->f2 = ((Box_80133784 *)arg1)->f2 - 4; - r = func_80047D3C(sx * sx + sz * sz); - if (r < 3) { - r = 4; - } else if (r < 5) { - r += 1; - } - D_801823E0->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; - } else { - D_801823DC->f2 = ((Box_80133784 *)arg1)->f2; - if ((s16)a0v == 2) { - D_801823E0->f0 = D_801823DC->f0; - D_801823E0->f2 = D_801823DC->f2 + 6; - s2 = 1; - D_801823E0->f4 = D_801823DC->f4; - } else { - D_801823E0->f2 = ((Box_80133784 *)arg2)->f2; - } - } - - while (1) { - s32 ret0; - register s32 retc __asm__("$3"); - __asm__ __volatile__(""); - ret0 = func_80133AB0(arg0s, (s16)D_801823DC->f0, (s16)D_801823DC->f4, (*(s32*)&D_801E07E8)); - __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); - ret = retc; - if (ret == 0) goto after; - s4 |= ret; - if (s2 != 0) goto after; - { - s16 oldc = s3; - s3 = s3 + 1; - if (oldc >= 5) break; - } - } - - D_801823E0->f0 = D_801823DC->f0; - D_801823E0->f2 = D_801823DC->f2; - s1 = 0x2000; - D_801823E0->f4 = D_801823DC->f4; - goto store_out; - -after: - if ((s16)s4 != 0 || D_801E07F4 != 0) { - s16 t; - __asm__ __volatile__("" :: "r"(s4)); - t = D_801823DC->f6; - if (t >= -0xBCB) { - if (t < -0x578) { - s1 |= 0x4000; - } else { - s1 |= 0x8000; - } - } - if ((s16)D_801823E0->f6 < -0xBCB) { - s1 |= 0x2000; - } - store_out: - ((Box_80133784 *)arg2)->f0 = D_801823E0->f0; - ((Box_80133784 *)arg2)->f2 = D_801823E0->f2; - ((Box_80133784 *)arg2)->f4 = D_801823E0->f4; - ((Box_80133784 *)arg2)->f6 = D_801E07F8; - return s1 & 0xFFFF; - } - ((Box_80133784 *)arg2)->f6 = D_801E07F8; - return 0; -} - - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80133AB0); - - -s32 func_80133CD4(arg0, cmd, base, arr) - s16 arg0; - s16 *cmd; - s16 *base; - s32 *arr; -{ - typedef struct { s16 e[4]; } ElemK; - - extern u16 *D_801823E0; - extern u16 *D_801823DC; - extern s16 *D_801823E8; - extern s16 *D_801823E4; - extern s32 *D_801823F0; - extern s32 *D_801823F4; - extern u16 D_801E07F8; - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern u16 D_801152AE; - extern u8 D_801152B0; - extern s32 func_80134310(); - extern s32 func_8013435C(); - - s16 *s3 = ((ElemK *)base)[cmd[1]].e; - s32 s6 = arr[cmd[2]]; - s32 s0var, s1var; - s32 s2a; - s16 y; - - if (func_80134310(s3, D_801823E0, s6) >= 0) - return 0; - - s1var = func_80134310(s3, D_801823DC, s6); - if (s1var < 0) - return 0; - - s0var = func_80134310(s3, D_801823E8, 0); - { - u16 *pac = D_801823DC; - s16 *pb8 = D_801823E8; - s16 *pb4 = D_801823E4; - s32 neg = -s1var; - pb4[0] = pac[0] + neg * pb8[0] / s0var; - pb4[1] = pac[1] + neg * pb8[1] / s0var; - pb4[2] = pac[2] + neg * pb8[2] / s0var; - if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) - return 0; - } - if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_801823E4, arr[cmd[6]], s3)) - return 0; - if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_801823E4, arr[cmd[8]], s3)) - return 0; - if (arg0 < 0) { - if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_801823E4, arr[cmd[10]], s3)) - return 0; - } - if (arg0 & 0x10) { - if (*(u16 *)cmd & 0x100) - return 0; - } - if (*(u16 *)cmd & 0x200) { - D_801E07F8 = *(u16 *)cmd; - return 0; - } - - { - s32 ret = func_80134310(s3, D_801823E0, s6); - s32 *pc0; - s32 *pc4; - u16 *pb0; - s32 t, o2; - s32 q3v; - - { - s32 *pw = D_801823F0; - ((struct { s32 w; } *)pw)->w = s3[0]; - pw[1] = s3[1]; - pw[2] = s3[2]; - } - s1var = -ret; - - __asm__ __volatile__( - "lwc2 $9, 0(%0)\n" - "lwc2 $10, 4(%0)\n" - "lwc2 $11, 8(%0)\n" - "nop\n" - "nop\n" - "sqr 0\n" - : : "r"(D_801823F0) : "$9", "$10", "$11", "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"(D_801823F4) : "memory"); - - pc0 = D_801823F0; - pc4 = D_801823F4; - s0var = pc4[0] + pc4[1] + pc4[2]; - pb0 = D_801823E0; - pb0[0] += s1var * pc0[0] / s0var; - pb0[1] += s1var * pc0[1] / s0var; - q3v = s1var * pc0[2] / s0var; - - { - s32 h; - h = ((s16 *)pb0)[0]; - s1var = h << 16; - __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); - s0var = h << 16; - } - pb0[2] += q3v; - s2a = (s16)pb0[2] << 16; - - t = pc0[0] << 4; - pc0[0] = t; - if (t < 0) s1var |= 0xFFFF; - t = pc0[1] << 4; - pc0[1] = t; - if (t < 0) s0var |= 0xFFFF; - o2 = pc0[2]; - t = o2 << 4; - pc0[2] = t; - if (t < 0) s2a |= 0xFFFF; - s2a += o2 << 5; - s1var += pc0[0] << 1; - s0var += pc0[1] << 1; - - do { - s32 *pl = D_801823F0; - u16 *pb; - s1var += pl[0]; - s0var += pl[1]; - s2a += pl[2]; - pb = D_801823E0; - pb[0] = s1var >> 16; - pb[1] = s0var >> 16; - pb[2] = s2a >> 16; - ret = func_80134310(s3, pb, s6); - } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); - } - - y = s3[1]; - if (y >= -0xBCB) { - D_801823DC[3] = y; - { - typedef struct { s8 c[8]; } Blk8; - *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; - } - if (*(u8 *)cmd != 0) - goto ret1; - return -1; - } - { - typedef struct { u16 h; } H16; - u16 *s3u = (u16 *)s3; - u16 *bp = D_801823E0; - u16 w; - ((H16 *)D_801152A8)->h = s3u[0]; - w = s3u[1]; - bp[3] = w; - ((H16 *)&D_801152AA)->h = w; - ((H16 *)&D_801152AC)->h = s3u[2]; - ((H16 *)&D_801152AE)->h = s3u[3]; - } -ret1: - return 1; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80134310); - -DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (83 ins, relocation-masked) - - - -s32 func_801343C4(s32 angle, s32 p1, s32 p2) -{ - extern int func_80133AB0(int, s16, s16, int); - extern s16 * D_801823DC; - extern s16 * D_801823E0; - extern u16 D_801E07F8; - extern u16 D_801E07F4; - - s16 *pac; - s16 *pb0; - s16 *pacs, *pb0s; - u16 *pb0u; - int a1v, a2v, d94, b0; - int sangle = ((s16)angle); - - pac = D_801823DC; - d94 = D_801E07E8; - pb0 = D_801823E0; - pac[0] = ((u16 *)p1)[0]; - pac[1] = ((u16 *)p1)[1]; - pac[2] = ((u16 *)p1)[2]; - pb0[0] = ((u16 *)p2)[0]; - pb0[1] = ((u16 *)p2)[1]; - pb0[2] = ((u16 *)p2)[2]; - - a1v = pac[0]; a2v = pac[2]; - __asm__ __volatile__("" ::: "memory"); - D_801E07F8 = 0; - D_801E07F4 = 0; - if (func_80133AB0(sangle, a1v, a2v, d94)) { - setdst: - pb0u = (u16 *)D_801823E0; - ((u16 *)p2)[0] = pb0u[0]; - ((u16 *)p2)[1] = pb0u[1]; - ((u16 *)p2)[2] = pb0u[2]; - ((u16 *)p2)[3] = D_801E07F8; - return 1; - } - - pacs = D_801823DC; - pb0s = D_801823E0; - b0 = pb0s[0]; - if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && - (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { - return 0; - } - if (func_80133AB0(sangle, b0, pb0s[2], D_801E07E8)) { - goto setdst; - } - return 0; -} - - - -// @class: schedule -typedef struct { - u16 f0; /* 0x0 */ - u16 f2; /* 0x2 */ - u16 f4; /* 0x4 */ - s16 f6; /* 0x6 */ -} Foo_80134510_80134510; - - -s32 func_80134510(s32 param) { - extern s32 func_801345F8(s32); - extern Foo_80134510_80134510 * D_801823DC; - extern Foo_80134510_80134510 * D_801823E0; - extern Foo_80134510_80134510 * D_801823E4; - extern u16 D_801E07F8; - - - s32 ret = 0; - Foo_80134510_80134510 *b0 = D_801823E0; - Foo_80134510_80134510 *ac = D_801823DC; - u16 t0 = ((Foo_80134510_80134510 *)param)->f0; - u16 t2, t4; - - ((Foo_80134510_80134510 *)param)->f6 = 0; - ac->f0 = t0; - b0->f0 = t0; - t2 = ((Foo_80134510_80134510 *)param)->f2; - ac->f2 = t2 - 4; - b0->f2 = t2 + 0x2FC; - t4 = ((Foo_80134510_80134510 *)param)->f4; - ac->f4 = t4; - b0->f4 = t4; - - if (func_801345F8((*(s32*)&D_801E07E8)) != 0) { - s16 x; - ((Foo_80134510_80134510 *)param)->f2 = D_801823E4->f2 - 2; - x = D_801823DC->f6; - if (x >= -3019) { - if (x < -1400) { - ret = 0x4000; - } else { - ret = 0x8000; - } - } else { - ret = 0x2000; - } - D_801823DC->f6 = D_801E07F8; - } - return ret; -} - - - -// @class: regalloc-order -// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. - - -s32 func_801345F8(s32 arg) -{ - extern int func_801347A0(short, u16 *, int, int); - extern u16 * D_801823DC; - extern u16 D_801E07F8; - - register u16 *param_1 __asm__("$5") = ((u16 *)arg); - register u16 *cc __asm__("$4") = D_801823DC; - int c8000 = 0x8000; - register int zr __asm__("$0"); - u32 c1, c2, uVar6, uVar2, cnt, v14; - u16 *ptmp, *puVar4, *puVar7, uVar1; - int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; - - c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; - uVar6 = c1 + zr; - if ((c1 & 0xffff) < (u32)param_1[2]) { - c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; - uVar2 = c2 + zr; - if ((c2 & 0xffff) < (u32)param_1[3]) - goto do_mult; - return 0; - found: - D_801E07F8 = *puVar7; - return 1; - do_mult: - tbl = *(int *)(param_1 + 4); - uVar10 = *(int *)(param_1 + 6); - uVar3 = *(int *)(param_1 + 8); - iVar9 = *(int *)(param_1 + 0xc); - iVar8 = *(int *)(param_1 + 0xe); - ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); - cnt = (u32)ptmp[1]; - v14 = *(int *)(param_1 + 10); - puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; - while (((cnt-- + zr) & 0xffff) != 0) { - uVar1 = *puVar4; - hi = uVar1 & 0x8000; - harg = hi + zr; - if (hi == 0) - puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); - else - puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); - if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) - goto found; - puVar4 = puVar4 - 1; - } - } - return 0; -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. -#include "common.h" - -typedef struct { - /* 0x00 */ u16 f0; - /* 0x02 */ s16 f2; - /* 0x04 */ s16 f4; - /* 0x06 */ s16 f6; - /* 0x08 */ s16 f8; - /* 0x0A */ s16 fa; - /* 0x0C */ s16 fc; - /* 0x0E */ s16 fe; - /* 0x10 */ s16 f10; - /* 0x12 */ s16 f12; - /* 0x14 */ s16 f14; -} S0_801347A0; - -typedef struct { - /* 0x0 */ s16 f0; - /* 0x2 */ s16 f2; - /* 0x4 */ s16 f4; - /* 0x6 */ s16 f6; -} Elem_801347A0; - -typedef struct { - /* 0x0 */ u16 f0; - /* 0x2 */ u16 f2; - /* 0x4 */ u16 f4; - /* 0x6 */ u16 f6; -} SVec_801347A0; - - - -s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); - extern s16 * D_801823E0; - extern SVec_801347A0 * D_801823DC; - extern SVec_801347A0 * D_801823E4; - - Elem_801347A0 *pElem; - s32 val; - register s32 iv __asm__("$4"); - s32 q; - s32 dvsr; - - pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; - val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; - if (func_80134A28((s32)pElem, (s32)D_801823E0, val) >= 0) { - return 0; - } - iv = func_80134A28((s32)pElem, (s32)D_801823DC, val); - if (iv < 0) { - return 0; - } - iv = -iv; - dvsr = pElem->f2 * 48; - q = (iv * 48) / dvsr; - D_801823E4->f0 = D_801823DC->f0; - D_801823E4->f2 = D_801823DC->f2 + q; - D_801823E4->f4 = D_801823DC->f4; - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { - return 0; - } - if ((s16)arg0) { - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { - return 0; - } - } - if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { - return 0; - } - D_801823E4->f0 = D_801823DC->f0; - D_801823E4->f4 = D_801823DC->f4; - (*(Elem_801347A0*)D_801152A8) = *pElem; - D_801823DC->f6 = pElem->f2; - return 1; -} - - - -DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80134A74); - -// @class: regalloc-order -// @try: variant B — direct pins m=$s5($21), c=$s6($22) - - -s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); - extern void * D_801823DC; - extern void * D_801823E0; - extern void * D_801823E4; - extern void * D_801823E8; - extern u16 D_801E07F8; - - s32 temp_a3; - s32 temp_s1; - s32 temp_v0; - s32 temp_v0_2; - s32 var_v0; - u16 temp_a1; - s32 temp_s4; - s32 c = arg0; - __asm__ __volatile__("" : "=r"(c) : "0"(c)); - __asm__ __volatile__("" : : "r"(arg0)); - - temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); - temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); - var_v0 = 0; - if (func_80134FB8(temp_s4, (s32) D_801823E0, temp_s1) >= 0) { - return var_v0; - } - temp_v0 = func_80134FB8(temp_s4, (s32) D_801823DC, temp_s1); - if (temp_v0 < 0) { - goto block_13; - } - temp_v0_2 = func_80134FB8(temp_s4, (s32) D_801823E8, 0); - temp_a3 = -temp_v0; - { - u16 *pB4 = (u16 *)D_801823E4; - u16 *pAC = (u16 *)D_801823DC; - s16 *pB8 = (s16 *)D_801823E8; - pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; - pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; - pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { - return var_v0; - } - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_801823E4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { - return var_v0; - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_801823E4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { - return var_v0; - } - if ((arg0 << 16) < 0) { - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_801823E4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { - return var_v0; - } - } - if (c & 1) { - if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { - goto block_14; - } - return 0; - } - temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); - if (!(temp_a1 & 0x200)) { - goto block_14; - } - D_801E07F8 = temp_a1; -block_13: - return 0; -block_14: - __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); - VectorNormalSS(D_801823E8, D_801823E8); - { - u16 *pB8 = (u16 *)D_801823E8; - u16 *pB4b = (u16 *)D_801823E4; - pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); - var_v0 = 1; - pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); - pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); - } - return var_v0; -} - - - -DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ - -// @class: plumbing -// @stuck: MATCH (89 ins). To BANK: retype D_801823E0 + D_801823DC (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). - - - - -s32 func_80135004(s32 arg0, s32 p1, s32 p2) -{ - extern int func_80134A74(int, s16, s16, int); - extern s16 * D_801823E0; - extern s16 * D_801823DC; - extern u8 D_801823E8; - extern s16 *D_801823E4; - extern u16 D_801E07F8; - - register s16 *pb0 __asm__("$9"); /* D_801823E0 -> $t1 */ - register s16 *pac __asm__("$6"); /* D_801823DC -> $a2 */ - register s16 *pb8 __asm__("$8"); /* D_801823E8 -> $t0 */ - u16 *pb4; - u16 a, b; - int id; - int a1v, a2v, d94; - - pb0 = D_801823E0; - __asm__ __volatile__("" : : "r"(pb0)); - - a = ((u16 *)p2)[0]; pac = D_801823DC; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_801823E8); pac[0] = b; pb8[0] = a - b; - a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; - a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; - - id = ((int)arg0) & 0xFFFF; - a1v = pac[0]; a2v = pac[2]; d94 = D_801E07E8; - __asm__ __volatile__("" ::: "memory"); - D_801E07F8 = 0; - - if (func_80134A74(id, a1v, a2v, d94)) { - found: - pb4 = (*(u16 * *)&D_801823E4); - ((u16 *)p2)[0] = pb4[0]; - ((u16 *)p2)[1] = pb4[1]; - ((u16 *)p2)[2] = pb4[2]; - ((u16 *)p2)[3] = D_801E07F8; - return 1; - } - { - register u16 *qb __asm__("$4"); /* D_801823DC -> $a0 (reloaded) */ - register int qa0 __asm__("$5"); /* D_801823E0[0], kept in $a1 for the 2nd-call arg */ - register u16 *qa __asm__("$6"); /* D_801823E0 -> $a2 (reloaded) */ - qb = (u16 *)D_801823DC; - qa = (u16 *)D_801823E0; - qa0 = qa[0]; - if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && - ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) - return 0; - if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801E07E8)) - goto found; - return 0; - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (62 ins, relocation-masked) - - -extern u8 D_801823E0; -extern u8 D_801823DC; -extern s16 *D_801823E4; -extern u8 D_801823E8; -extern int D_801E07E8; -extern u16 D_801E07F8; - -extern int func_80134A74(int, s16, s16, int); - -int func_80135168(u16 arg0, u16 *p1, u16 *p2) -{ - register s16 *pb0 __asm__("$8"); - register s16 *pac __asm__("$6"); - register s16 *pb8 __asm__("$7"); - u16 *pb4; - u16 a, b; - int a1v, a2v, d94; - - pb0 = (*(s16 * *)&D_801823E0); - __asm__ __volatile__("" : : "r"(pb0)); - - a = p2[0]; pac = (*(s16 * *)&D_801823DC); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_801823E8); pac[0] = b; pb8[0] = a - b; - a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; - a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; - - a1v = pac[0]; a2v = pac[2]; d94 = D_801E07E8; - __asm__ __volatile__("" ::: "memory"); - D_801E07F8 = 0; - if (func_80134A74(arg0, a1v, a2v, d94)) { - pb4 = (*(u16 * *)&D_801823E4); - p2[0] = pb4[0]; - p2[1] = pb4[1]; - p2[2] = pb4[2]; - p2[3] = D_801E07F8; - return 1; - } - return 0; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80135260); - - -/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). - * - * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 - * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does - * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in - * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). - * - * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): - * the two output buffers D_801823DC / D_801823E0 are written through a pointer in each of the two - * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a - * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also - * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each - * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks - * the lowest-free scratch over its OWN window: - * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) - * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) - * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail - * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. - * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades - * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the - * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. - * - * Zero file-scope footprint (block-scoped typedefs + externs; D_801823DC/B0 read via the ambient - * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for - * family_sweep --edit-remap with no cc1 crash. - * - * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. - */ -s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) -{ - typedef struct { s32 vx, vy, vz, pad; } Vec32; - typedef struct { s16 vx, vy, vz, pad; } Vec16; - typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; - extern void func_80048EAC(void *m0, void *m1); - extern void func_8004914C(void *m); - extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); - extern void ApplyRotMatrixLV(void *in, void *out); - extern void ApplyRotMatrix(void *in, void *out); - extern s32 D_801E07FC, D_801E0800, D_801E0804, D_801E0808; - extern s16 D_801E080C; - extern s32 D_801E081C; - extern s16 D_801E0820, D_801E0822, D_801E0824, D_801E0826, D_801E0828, D_801E082A; - - Vec32 in0, in1, rotout; - Mat32 mat2; - Vec16 vecin; - s32 result; - s32 mode; - s32 q1, q2; - s32 p; - s32 t18, t1A, t1C; - s32 *m; - - in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); - in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); - if ((param_2 & 0x10000000) == 0) { - if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { - return 0; - } - } - mode = param_2 & 0x60000000; - if (mode != 0) { - result = 1; - if (param_2 >= 0) { - mode &= 0x40000000; - } - in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); - in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); - switch (mode) { - case 0x60000000: - m = &D_801E07FC; - *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); - q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); - q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); - D_801E0800 = 0; - D_801E0808 = 0; - D_801E0804 = q1; - D_801E080C = q2; - func_80048EAC((void *)((s32)param_1 + 0x34), m); - ApplyTransposeMatrixLV(m, &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - /* fallthrough */ - case 0x20000000: - p = (param_2 & 0xFFFFFFF) | 0x80000000; - t18 = *(s16 *)((s32)param_1 + 0x18); - t1A = *(s16 *)((s32)param_1 + 0x1A); - t1C = *(u16 *)((s32)param_1 + 0x1C); - mat2.w4 = 0; - mat2.wC = 0; - mat2.w0 = t18; - mat2.w8 = t1A; - mat2.h10 = t1C; - func_8004914C(&mat2); - vecin.vx = *(u16 *)(p + 4); - vecin.vy = *(u16 *)(p + 8); - vecin.vz = *(u16 *)(p + 0xC); - ApplyRotMatrix(&vecin, &rotout); - D_801E0820 = rotout.vx; - D_801E0824 = rotout.vy; - D_801E0828 = rotout.vz; - vecin.vx = *(u16 *)(p + 6); - vecin.vy = *(u16 *)(p + 0xA); - vecin.vz = *(u16 *)(p + 0xE); - ApplyRotMatrix(&vecin, &rotout); - D_801E081C = 0; - D_801E0822 = rotout.vx; - D_801E0826 = rotout.vy; - D_801E082A = rotout.vz; - result += 2; - break; - case 0x40000000: - ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - break; - } - { - s16 *p = *(s16 **)&D_801823DC; - p[0] = in0.vx; - p[1] = in0.vy; - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_801823E0; - p[0] = in1.vx; - p[1] = in1.vy; - p[2] = in1.vz; - } - return result; - } - { - s16 *p = *(s16 **)&D_801823DC; - p[0] = in0.vx; - p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_801823E0; - p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); - p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); - } - return 1; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80135888); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80135A4C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80135D20); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80135EB0); - - -s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - register s32 a1v __asm__("$11"); - register s32 a2v __asm__("$12"); - register s32 n __asm__("$5"); - register s16 *b4 __asm__("$7"); - s32 d; - s32 dx; - s32 denom; - s32 result; - s32 frame_pad[2]; - (void)&frame_pad; - __asm__("" : "=r"(a1v) : "0"(arg1)); - a2v = arg2; - - if (!(arg1 & 1)) { - dx = (s16) arg2 - (*(s16 **)&D_801823DC)[2]; - d = dx; - denom = -(*(s16 **)&D_801823E8)[2]; - } else { - denom = (*(s16 **)&D_801823E8)[2]; - d = (*(s16 **)&D_801823DC)[2] - (s16) arg2; - dx = -d; - } - n = -d; - { - register s16 *b8 __asm__("$6") = *(s16 **)&D_801823E8; - u16 *ac = *(u16 **)&D_801823DC; - b4 = D_801823E4; - b4[0] = ac[0] + n * b8[0] / denom; - b4[1] = ac[1] + n * b8[1] / denom; - b4[2] = ac[2] + dx; - } - - if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; - if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; - if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; - if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; - if (a1v & 0x8000) { - u16 *b0 = *(u16 **)&D_801823E0; - b4[0] = b0[0]; - b4[1] = b0[1]; - } - D_801152AA = 0; - (*(s16 *)D_801152A8) = 0; - if (a1v & 1) { - D_801823E4[2] = a2v + 2; - __asm__ __volatile__(""); - D_801152AC = 0xFFF; - } else { - D_801152AC = -0xFFF; - D_801823E4[2] = a2v - 2; - } - __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); - (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; - D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; - result = 1; - D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; - return result; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801365B8); - - -// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) -// D_801823DC/B0/B8 are file-scope `extern u8`, D_801823E4 is `extern s32 []`; each HOLDS a -// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. -// D_801823E4 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the -// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar -// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the -// siblings read it once via *(u16**)&sym == direct lw either way). - -s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - - register u16 *ac __asm__("$4"); - register s16 *b8 __asm__("$6"); - register s16 *b4 __asm__("$9"); - register s32 r __asm__("$3"); - register s32 pos __asm__("$12"); - register s32 a1v __asm__("$5"); - s16 temp_v0; - s16 temp_v1; - s32 var_a3; - s16 var_v0_3; - s32 temp_a1; - s32 var_t0; - s32 var_v1; - s16 *b4b; - u16 *p; - - __asm__ ("" : "=r"(a1v) : "0"(arg1)); - pos = arg2; - if (!(a1v & 1)) { - var_t0 = (s16) arg2 - (*(s16 **)&D_801823DC)[1]; - var_v1 = var_t0; - var_a3 = -(*(s16 **)&D_801823E8)[1]; - } else { - var_a3 = (*(s16 **)&D_801823E8)[1]; - var_v1 = (*(s16 **)&D_801823DC)[1] - (s16) arg2; - var_t0 = -var_v1; - } - b8 = (*(s16 **)&D_801823E8); - ac = (*(u16 **)&D_801823DC); - b4 = D_801823E4; - temp_a1 = -var_v1; - r = (temp_a1 * b8[0]) / var_a3; - b4[0] = ac[0] + r; - b4[1] = ac[1] + var_t0; - r = (temp_a1 * b8[2]) / var_a3; - temp_v0 = ac[2] + r; - b4[2] = temp_v0; - temp_v1 = b4[0]; - if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { - return 0; - } - if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { - return 0; - } - if (arg1 & 0x8000) { - p = (*(u16 **)&D_801823E0); - b4[0] = (s16) p[0]; - b4[2] = (s16) p[2]; - } - D_801152AC = 0; - (*(s16 *)D_801152A8) = 0; - if (arg1 & 1) { - b4b = D_801823E4; - D_801152AA = 0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos + 2; - } else { - b4b = D_801823E4; - D_801152AA = -0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos - 2; - } - b4b[1] = var_v0_3; - __asm__ __volatile__("" :: "r"(pos)); - (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); - D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); - D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); - return 1; -} - - -// @class: schedule -// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a -// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE -// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses -// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] -// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the -// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; -// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits -// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the -// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). - - -extern s16 *D_801823E4; /* holds a pointer value (*(u16**)&D_801823E4) */ - -s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { - extern void ApplyMatrixSV(void *m, void *v0, void *v1); - extern void ApplyRotMatrix(void *v0, void *v1); - extern u16 D_80126722; - extern s16 D_80126724; - extern s16 D_801152AA; - extern s16 D_801152AC; - - s32 out[4]; - u16 *pb4; - - if (a0) { - ApplyMatrixSV((void *)a3, *(void **)&D_801823E4, *(void **)&D_801823E4); - ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); - ApplyRotMatrix((void *)D_801152A8, (void *)out); - *(s16 *)D_801152A8 = out[0]; - D_801152AA = out[1]; - D_801152AC = out[2]; - } - - pb4 = *(u16 **)&D_801823E4; - *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); - *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); - *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); - - *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); - D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); - D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); -} - - - -DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ - -DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ - -DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ - -DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ - -DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ - - -extern unsigned short D_800B99F0; -extern void (*D_801823F8[])(void); - -void func_80136C54(void) -{ - D_801823F8[D_800B99F0](); -} - - -// @class: struct -// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801DF7B0 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). - -typedef struct { char s[10]; } S10_80136C90; - -s32 func_80136C90() -{ - extern void func_8001534C(int, void *, int, int, int, int); - extern S10_80136C90 D_801DF7B0; - - S10_80136C90 buf = D_801DF7B0; - func_8001534C(0, &buf, 0x78, 0x10, 0, 0); -} - - - -DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ - -DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80136DFC); - -DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ - -DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80136F3C); - -DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80137178); - -DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ - -DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80137614); - -DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ - -DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801376E8); - -DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ - -DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801378F0); - -DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ - -DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801379FC); - - -// @class: remat -// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer -extern s32 D_80127548[]; -extern int D_8018244C; -extern int D_801269F0; -extern void func_80138BE0(int p); - -void func_80137B80(void) { - int *p = &D_801269F0; - (*(int *)&D_80127548) = 0x24; - if (*p != 0) { - ((void (*)(int *))func_80138BE0)(p); - } - D_8018244C += 1; -} - - -DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. - -extern unsigned char D_80126A0E; -extern short D_80126A0A; -extern s16 D_801269F4; -extern int D_800A5E60; -extern int D_8018244C; -extern int D_801269F0; - -extern void func_801392FC(); -extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); -extern void func_80139680(s32 a0, u8 *a1); - -int func_80137D08(int arg0, int arg1, short arg2) -{ - unsigned char buf[3]; - - D_800A5E60 = arg0; - D_80126A0A = arg2; - ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); - if ((*(short *)&D_801269F4) == 7) { - buf[0] = 0x39; - buf[1] = 0xFF; - buf[2] = 0x71; - ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); - } else if ((*(short *)&D_801269F4) == 3) { - if (D_8018244C & 4) { - ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); - } - } - return D_800A5E60; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80137DD4); - -DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182450[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182450[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182494; -extern u8 D_801824D8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182494; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801824D8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018251C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182558[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182558; - if (((s16)a1) < 0xC00) { - tbl = D_8018251C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182594, D_80182596, D_80182598, D_8018259A, D_8018259C, D_8018259E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182596 < ang)) goto outer_else; - if (!(ang < D_8018259C)) goto inner_else; - if (ang < D_80182598) { *(s16 *)L = D_80182598; goto done; } - if (D_8018259A < ang) { *(s16 *)L = D_8018259A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182594) { *(s16 *)L = D_80182594; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018259E < ang) { *(s16 *)L = D_8018259E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E0860; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E0860, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E0860; -extern s8 D_801E0864; -extern s8 D_801E0865; - -void func_8013C9C4(void * arg0) -{ - D_801E0860 = arg0; - D_801E0864 = 0; - D_801E0865 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E0860; -extern s8 D_801E0864; -extern s8 D_801E0865; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E0860; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E0865; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E0864)) * 2) + D_801E0860); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E0865 = (unsigned char) p[1]; - D_801E0864 = D_801E0864 + 1; - if (D_801E0865 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E0864 = 0; - *base = 0; - } - } - else - { - D_801E0865 = c - 1; - } - } - return; -} - - - -extern s32 D_801E0884; -extern s32 D_801E0878; -extern s32 D_801E087C; -extern s32 D_801E0888; - -void func_8013CABC(void) { - D_801E0884 = 1; - D_801E0878 = 1; - D_801E087C = 0; - D_801E0888 = 1; -} - - - -extern s32 D_801E0878; -extern s32 D_801E087C; -extern s32 D_801E0880; -extern s32 D_801E0884; -extern s32 D_801E0888; - -void func_8013CAE8(void) { - D_801E0878 = 1; - D_801E0884 = 0; - D_801E087C = 0; - D_801E0880 = -1; - D_801E0888 = 0; -} - - - -extern s32 D_801E0884; -extern s32 D_801E0888; -extern s32 D_801E08B0; -extern s32 D_801E08B4; - -void func_8013CB20(void) -{ - D_801E08B0 = D_801E0888; - D_801E08B4 = D_801E0884; - D_801E0888 = 1; - D_801E0884 = 0; -} - - - -extern s32 D_801E08B0; -extern s32 D_801E08B4; -extern s32 D_801E0888; -extern s32 D_801E0884; - -void func_8013CB5C(void) { - D_801E0888 = D_801E08B0; - D_801E0884 = D_801E08B4; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E1AE8; - extern u8 D_801E1AE9; - extern u8 D_801E1AEA; - extern u8 D_801E1AEB; - extern u8 D_801E1AEC; - extern u8 D_801E1AED; - extern u8 D_801E1AEE; - extern u8 D_801E1AEF; - extern u8 D_801E1AF0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E1AE8; t1 = D_801E1AE9; t2 = D_801E1AEA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E1AEB; t1 = D_801E1AEC; t2 = D_801E1AED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E1AEE; t1 = D_801E1AEF; t2 = D_801E1AF0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E0890; -extern s32 D_801E0878; -extern s32 D_801E0894; -extern s32 D_801E0884; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E0890 != 0) { - if (D_801E0890 != 2) { - if (((D_801E0890 < 3) && (D_801E0890 == 1)) && - (D_801E0894 = D_801E0894 + 1, 0x23a < D_801E0894)) { - D_801E0878 = D_801E0890; - D_801E0890 = 2; - } - } else { - D_801E0878 = D_801E0878 + -1; - if (D_801E0878 == 0) { - D_801E0878 = D_801E0890; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E0884 == 0) { - D_801E0890 = D_801E0890 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E0884; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E0884; -} - - - -extern s32 D_801E0890; - -void func_8013D164(void) { - D_801E0890 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E1BCA; -extern u8 D_801E1C3E; -extern u8 D_801E1AF2; -extern u8 D_801E1BAC; -extern u8 D_801E1AD0; -extern u8 D_801E1AF1; -extern s32 D_801E1BB0; - -void func_8013D330(void) { - if ((D_801E1BCA & 0xff) != D_801E1C3E) { - D_801E1BCA = ((D_801E1BCA & 0xff) < D_801E1C3E) ? (D_801E1BCA + 1) : (D_801E1BCA - 1); - } - if ((D_801E1AF2 & 0xff) != D_801E1BAC) { - D_801E1AF2 = ((D_801E1AF2 & 0xff) < D_801E1BAC) ? (D_801E1AF2 + 1) : (D_801E1AF2 - 1); - } - if ((D_801E1AD0 & 0xff) != D_801E1AF1) { - D_801E1AD0 = ((D_801E1AD0 & 0xff) < D_801E1AF1) ? (D_801E1AD0 + 1) : (D_801E1AD0 - 1); - } - D_801E1BB0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E0868; -extern void *D_801E086C; -extern void *D_801E0870; -extern s32 D_801E0898; -extern s32 D_801E089C; -extern s32 D_801E08A0; -extern s32 D_801E1B24[]; - -extern u8 D_8018268C[]; -extern u8 D_80182734[]; -extern u8 D_801825E4[]; -extern u8 D_801826E0[]; -extern u8 D_80182760[]; -extern u8 D_80182638[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E0898 = param_2; - D_801E089C = (param_2 >> 2) & 3; - D_801E08A0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E0868 = D_8018268C; - D_801E086C = D_80182734; - D_801E0870 = D_801825E4; - } else { - D_801E0868 = D_801826E0; - D_801E086C = D_80182760; - D_801E0870 = D_80182638; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E08A0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E0898 & 2) != 0) { - D_801E1B24[0] = 0x140; - D_801E1B24[3] = 0x80; - if (p[0x37] == 4) { - D_801E1B24[0] = 0x140; - D_801E1B24[3] = 0; - } - if (p[0x37] == 0) { - D_801E1B24[0] = 0x140; - D_801E1B24[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E0870)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E0870; -extern s16 *D_801E0874; -extern s32 D_801E0884; -extern s32 D_801E08A4; -extern s32 D_801E08A8; -extern s32 D_801E08AC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E0874 != 0) { - D_801E0884 = 0; - p = (int *)(param_1 * 12 + (int)D_801E0870); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E08A4 != x) { - flag = 1; - if (D_801E08A4 < x) { - if (x - D_801E08A4 < 5) { - D_801E08A4 = x; - } else { - D_801E08A4 = D_801E08A4 + 4; - } - } else { - if (D_801E08A4 - x < 5) { - D_801E08A4 = x; - } else { - D_801E08A4 = D_801E08A4 - 4; - } - } - } - if (D_801E08A8 != y) { - flag = 1; - if (D_801E08A8 < y) { - if (y - D_801E08A8 < 5) { - D_801E08A8 = y; - } else { - D_801E08A8 = D_801E08A8 + 4; - } - } else { - if (D_801E08A8 - y < 5) { - D_801E08A8 = y; - } else { - D_801E08A8 = D_801E08A8 - 4; - } - } - } - if (D_801E08AC != z) { - flag = 1; - if (D_801E08AC < z) { - if (z - D_801E08AC < 5) { - D_801E08AC = z; - } else { - D_801E08AC = D_801E08AC + 4; - } - } else { - if (D_801E08AC - z < 5) { - D_801E08AC = z; - } else { - D_801E08AC = D_801E08AC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E0884 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801827F0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E0874); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E08A4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E08A8); - uVar5 = (*(int*)&D_801E08AC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801827F0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E088C; - -s32 func_8013E054(void) { - return D_801E088C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801831EC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801831C4; -extern s16 D_801831C6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801831EC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801831C4 = 2; - D_801831C6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801831C6 = 0; - D_801831C4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E08C0; - extern void * D_801E08C4; - extern unsigned char D_80182E64; - extern unsigned char D_80182E7C; - extern unsigned char D_80182EF0; - extern unsigned char D_80182EF8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E08C0 = &D_80182E64; - D_801E08C4 = &D_80182EF0; - } else { - D_801E08C0 = &D_80182E7C; - D_801E08C4 = &D_80182EF8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801831EC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801831EC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801831EC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801831C8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801831C8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801831C8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801831C4; -extern s16 D_801831C6; -extern unsigned char D_801831C8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801831C6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801831C4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801831C6; - if (*r < 3) { - *r = *r + 1; - } - D_801831C4 = (u16)D_801831C4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831C8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801831C8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831C8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013FAF8); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8013FFD8); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8014032C); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80140608); - - -// @class: iv-combine -// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source -// pointer compile to fixed offsets when written base[0..n]; the target advances -// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead -// final increment, yielding the "increment N-2 then offset 0/2" tail). - -extern u8 *D_80182EA4; -extern u8 *D_80182EA8; -extern u8 *D_80182EAC; -extern u8 *D_80182EB0; -extern u8 *D_80182EB4; -extern u16 *D_80182EB8[]; -extern u16 *D_80182EC0[]; -extern u16 *D_80182EE0[]; - -extern s32 func_80028D58(void); -extern s32 func_80028DE0(void); -extern s32 func_80028FBC(void); -extern s32 func_80029000(void); -extern s32 func_80028D9C(void); - -void func_801407F4(void) -{ - u8 *puVar1; - s32 iVar2; - u16 *puVar3; - - puVar1 = D_80182EA4; - iVar2 = func_80028D58(); - puVar3 = D_80182EB8[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - puVar1 = D_80182EA8; - iVar2 = func_80028DE0(); - puVar3 = D_80182EB8[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - iVar2 = func_80028FBC(); - *(s16 *)(D_80182EAC + 0x18) = *D_80182EC0[iVar2]; - iVar2 = func_80029000(); - *(s16 *)(D_80182EB0 + 0x18) = *D_80182EC0[iVar2]; - - puVar1 = D_80182EB4; - iVar2 = func_80028D9C(); - puVar3 = D_80182EE0[iVar2]; - *(s16 *)(puVar1 + 0x12) = *puVar3++; - *(s16 *)(puVar1 + 0x14) = *puVar3++; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - *(s16 *)(puVar1 + 0x1c) = *puVar3++; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80140958); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80140D68); - - -// @class: struct -// @stuck: none — MATCH - -extern unsigned char D_80078E7F; -extern unsigned char D_80078E7E; -extern unsigned char D_80078E7D; -extern M2C_UNK D_80182DE0; - -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); - -void func_80140E6C(void) { - void *puVar1; - unsigned int uVar2; - unsigned int uVar3; - unsigned int uVar4; - - puVar1 = (*(void * *)&D_80182DE0); - uVar2 = func_800D2CA8(D_80078E7F, 0x18); - uVar3 = func_800D2CA8(D_80078E7E, 0xc); - uVar4 = func_800D2CA8(D_80078E7D, 0); - func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); -} - - - - -// @class: plumbing -// @stuck: none — MATCH (128/128 ins, match_one confirmed) - -extern short D_80115128; -extern u8 D_80182DF0; -extern char *D_80182E10; -extern char *D_80182E14; -extern char *D_80182E18; -extern char *D_80182E1C; -extern char *D_80182E20; - -extern int func_80029FE4(void); -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); -extern char *func_8002AAB4(void); -extern char *strcpy(char *, const char *); -extern int func_8002A26C(void); -extern int func_8002A2B0(void); -extern int func_8002A4B8(void); -extern s32 func_8002A4FC(s32 a0); -extern int func_8002A998(void); -extern int func_8002A9DC(void); -extern int func_8002A728(void); -extern int func_8002A76C(void); -extern int func_80029FD4(void); - -void func_80140F00(void) { - char *p; - int r; - - if (D_80115128 == 0) { - p = (*(char * *)&D_80182DF0); - r = func_800D2CA8(func_80029FE4() + 1, 0x18); - func_800D2D10(r, 2, p + 4, 1); - strcpy(p + 0xA, func_8002AAB4()); - - p = D_80182E10; - r = func_800D2CA8(func_8002A26C() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A2B0(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182E14; - r = func_800D2CA8(func_8002A4B8() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182E18; - r = func_800D2CA8(func_8002A998() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A9DC(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182E1C; - r = func_800D2CA8(func_8002A728() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A76C(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182E20; - r = func_800D2CA8(func_80029FD4(), 4); - func_800D2D10(r, 7, p + 0x18, -1); - } -} - - - -// @class: other -// @stuck: none — MATCH - -extern short D_80115128; -extern unsigned short D_80115172; -extern unsigned short D_80182CAA; -extern unsigned short D_80182CAE; -extern unsigned short D_80182CB2; -extern unsigned short D_80182CB6; - -extern s32 func_8002A1B4(void); -extern short func_8002A28C(void); -extern short func_8002A27C(void); -extern s32 func_8002A400(void); -extern short func_8002A4D8(void); -extern short func_8002A4C8(void); -extern s32 func_8002A8E0(void); -extern short func_8002A9B8(void); -extern short func_8002A9A8(void); -extern s32 func_8002A670(void); -extern short func_8002A748(void); -extern short func_8002A738(void); -extern int func_801412A8(int, int, int, int, int, int); - -int func_80141100(int param_1) -{ - short sVar1; - int iVar7; - - if (D_80115128 == 0) { - iVar7 = D_80115172 + 0x31; - sVar1 = D_80182CAA; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); - sVar1 = D_80182CAE; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); - sVar1 = D_80182CB2; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); - sVar1 = D_80182CB6; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); - } - return param_1; -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801412A8); - -DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ - -DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ - -DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ - - -extern unsigned short D_80115112; -extern void (*D_80183240[])(void); - -void func_80141788(void) -{ - D_80183240[D_80115112](); -} - - -DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ - -DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80141874); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801418F8); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80141A60); - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80141B90); - -DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) - -extern u16 D_80115110; -extern u8 D_801831A0; -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80141C0C(s32 param_1) -{ - func_8002D4C8(*(u16 *)(&D_801831A0 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); -} - - -DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ - -DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ - -DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ - -DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_801424E4); - - -extern void (*D_80183280[])(void); - -void func_801425CC(void *a0) { - D_80183280[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: schedule -// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail - -extern void func_8012C1B8(void); -extern s32 func_8012C1DC(s32 a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012CAE4(void *a0); -extern s32 func_8012AD50(void *a0); -extern s32 D_80183264; - -void func_80142608(s32 param_1) -{ - register s32 iVar1 __asm__("$16"); - - if (*(short *)(param_1 + 0x70) != 0) { - iVar1 = ((s32 (*)(void))func_8012C1B8)(); - } else { - iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); - } - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CA1C(iVar1, (s32)&D_80183264); - *(short *)(iVar1 + 0x1a) = 0x200; - *(short *)(iVar1 + 0x18) = 0x200; - *(short *)(param_1 + 0xfc) = 0x40; - if (*(short *)(param_1 + 0x70) != 0) { - goto ad50; - } - if (*(s32 *)(param_1 + 100) != 0) { - *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); - goto ad50; - } - } - ((void (*)(s32))func_8012CAE4)(param_1); - return; -ad50: - *(short *)(param_1 + 0x98) = 0; - *(s32 *)(param_1 + 0x90) = 0; - ((void (*)(s32))func_8012AD50)(param_1); -} - - -DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ - -DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ - -DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ - -DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ - -DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80183294[])(); - -void func_801427EC(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80183294[*(u16 *)(param_1 + 2)](); - } -} - - -DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ - -DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801832B0[])(); - -void func_8014292C(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801832B0[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80183480[])(); - -void func_80142978(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80183480[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80183538[])(); - -void func_801429C4(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80183538[*(u16 *)(param_1 + 2)](); - } -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80142A10); - - -// @class: struct -// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) - -extern u16 D_800B99D8; -extern struct packed_word D_801DFEEC; -extern u8 D_801E08C8; -extern u8 D_801E08C9; -extern u8 D_801E08CA; - -void func_80142A80(void) -{ - u16 flags; - union word_bytes local; - s32 mul; - - flags = D_800B99D8; - local.pw = D_801DFEEC; - - if (flags & 0x10) { - mul = (s8)((flags & 0xf) >> 1) + 9; - } else { - mul = 0x10 - (s8)((flags & 0xf) >> 1); - } - - D_801E08C8 = mul * (local.b[0] >> 4); - D_801E08C9 = mul * (local.b[1] >> 4); - D_801E08CA = mul * (local.b[2] >> 4); -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80142B2C); - -DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ - -DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ - -DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ - -DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ - -DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ - -DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern int D_80183288; - -void func_80142DC4(int param_1) -{ - int v0; - - *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_80183288); - *(short *)(v0 + 0x1a) = 0x1800; - *(short *)(v0 + 0x18) = 0x1800; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_801832A4[]; - -void func_80142E38(int param_1) -{ - short sVar1; - int iVar2; - - *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_801832A4); - sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; - *(short *)(iVar2 + 0x1a) = sVar1; - *(short *)(iVar2 + 0x18) = sVar1; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80142EC0); - -DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ - -DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result -// survives across func_8001CA1C while $v0 serves the pre-call store/test; -// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80183490[]; -extern unsigned char D_801834F0[]; - -void func_8014305C(int param_1) -{ - register int s0_param __asm__("$16") = param_1; - register int s1_copy __asm__("$17"); - int iVar2; - short sVar1; - - iVar2 = ((int (*)(void))func_8012C1B8)(); - *(int *)(s0_param + 0x20) = iVar2; - s1_copy = iVar2; - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(s0_param); - } else { - ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80183490); - sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; - *(short *)(s1_copy + 0x1a) = sVar1; - *(short *)(s1_copy + 0x18) = sVar1; - *(short *)(s0_param + 0xfc) = 0; - func_8012A828(s0_param, D_801834F0); - ((void (*)(int))func_80142B2C)(s0_param); - } -} - - -DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ - -DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) - - -extern void *memcpy(void *, const void *, u32); - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern int func_8001CA88(int, void *); -extern s32 func_8012E504(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80142B2C(void *arg0); - -extern u8 D_801DFEE8; -extern u8 D_801E08C8; -extern u8 D_801E08CC; - -void func_801431E8(s32 param_1) { - u8 buf[8]; - s32 iVar5; - u16 uVar2; - s16 sVar4; - - register s32 d __asm__("$16"); - memcpy(buf, &D_801DFEE8, 4); - iVar5 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = iVar5; - d = iVar5; - if (iVar5 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, void *))func_8001CA88)(d, &D_801E08C8); - uVar2 = *(u16 *)(param_1 + 0x70); - *(s16 *)(d + 0x76) = -0x10; - sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; - *(s16 *)(d + 0x1a) = sVar4; - *(s16 *)(d + 0x18) = sVar4; - *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; - if (func_8012E504(param_1, 0x33) == 0) { - *(s16 *)(param_1 + 0xfc) = 1; - func_800233CC(&D_801E08C8, 0x10); - memcpy(&D_801E08CC, buf, 4); - } else { - *(s16 *)(param_1 + 0xfc) = 0; - } - ((void (*)(s32))func_80142B2C)(param_1); - } -} - - -DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ - -DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ - -DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) - -extern u8 D_800D387C[]; -extern u32 D_80183648[]; - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80143458(s32 param_1) -{ - s32 p; - u16 v; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - p = *(s32 *)(param_1 + 0x20); - if (*(s32 *)(p + 4) == 0) { - *(s32 *)(p + 4) = 0x50000000; - } - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - v = *(u16 *)(param_1 + 0x34) & 0x7fff; - if (v != 0) { - p = *(s32 *)(param_1 + 0x20); - *(u16 *)(p + 0x1a) = v; - *(u16 *)(p + 0x18) = v; - } - - func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, - D_80183648[*(u16 *)(param_1 + 0x34) & 3]); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - -DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_8014358C); - -DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ - -DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ - -DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ - -DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ - -DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ - -DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ - - -extern void (*D_80183770[])(void); - -void func_80143B30(void *a0) { - D_80183770[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ - -DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ - - -extern void (*D_8018377C[])(void); - -void func_80143C38(void *a0) { - D_8018377C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ - - -extern void (*D_80183784[])(void); - -void func_80143C98(void *a0) { - D_80183784[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80143D28); - - -extern void (*D_801837CC[])(void); - -void func_80143E68(void *a0) { - D_801837CC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ - -DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ - -DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ - -DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ - - -extern void (*D_801837E0[])(void); - -void func_80144054(void *a0) { - D_801837E0[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80144090); - -extern void func_8012C218(void *a0); - -// @class: struct -// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) - -extern void (*D_801837E8[])(); - -void func_801442F8(int param_1) -{ - int iVar1; - - D_801837E8[*(u16 *)(param_1 + 2)](); - iVar1 = *(int *)(param_1 + 0x1c) + 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (0x1d < iVar1) { - func_8012C218(param_1); - } -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); -extern u8 D_80183764; - -void func_80144364(int param_1) { - int iVar3; - u16 uVar2; - s16 sVar1; - - iVar3 = ((s32 (*)(void))func_8012C194)(); - if (iVar3 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); - *(int *)(param_1 + 0xCC) = iVar3; - *(u16 *)(param_1 + 0xFC) = uVar2; - func_8001CB6C((u8 *)iVar3, (s32)&D_80183764, 0x250, 0x1A0); - *(s32 *)(iVar3 + 4) = 0x60000000; - *(u8 *)(iVar3 + 0x27) = 0x14; - *(u16 *)(iVar3 + 0x10) = 0x400; - *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); - *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); - *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); - sVar1 = *(s16 *)(param_1 + 0x70); - if (sVar1 != 0) { - *(s16 *)(iVar3 + 0x1A) = sVar1; - *(s16 *)(iVar3 + 0x18) = sVar1; - } else { - *(u16 *)(iVar3 + 0x1A) = 0x2000; - *(u16 *)(iVar3 + 0x18) = 0x2000; - } - *(u16 *)(param_1 + 2) = 1; - } -} - - - - -extern void func_80016714(void *a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_8012AD80(s32 a0); -extern void func_8012C218(void *a0); -extern s32 D_80183778; - -void func_80144458(void *arg0) { - s32 temp_s0; - void *temp_s2; - void *temp_v0; - - temp_s2 = M2C_FIELD(arg0, void **, 0xCC); - if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { - temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); - if (temp_v0 != NULL) { - temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; - M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80183778 * 0x10); - M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80183778 * 0x10); - func_8012AD80(arg0); - } - } - M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); - M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); - M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); - if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { - func_80016714(temp_s2, 0x38); - func_8012C218(arg0); - } -} - - -DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ - -DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ - -DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern u8 D_8018378C; -extern u8 D_80183798; - -void func_8014477C(void *param_1) { - s32 v0; - s32 v1; - register s32 uVar2 __asm__("$2"); - register s32 addr __asm__("$3"); - s32 gv; - s32 fv; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)((s32)param_1 + 0x20) = v0; - if (v0 == 0) { - func_8012CAE4(param_1); - return; - } - ((void (*)(s32, void *))func_8001CA1C)(v0, &D_8018378C); - if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { - *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); - uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); - if (uVar2 != 0) { - addr = uVar2 & 0xFFFFFFF; - gv = *(u16 *)((addr | 0x80000000) + 8); - fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; - *(u16 *)((s32)param_1 + 0xA) = gv + fv; - } else { - *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; - } - } - ((void (*)(void *, void *))func_8012A828)(param_1, &D_80183798); - v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; - *(s16 *)((s32)param_1 + 0x2) = 1; - *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; - *(s32 *)((s32)param_1 + 0x1C) = 0x78; -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); - -extern u8 D_80183764; -extern u8 D_801837D4; - -void func_80144880(s32 param_1) -{ - register s32 obj __asm__("$16"); /* $s0 */ - register s32 self __asm__("$17") = param_1; /* $s1 */ - register s32 b __asm__("$2"); /* $v0 */ - s32 e; - - obj = ((s32 (*)(void))func_8012C194)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(self); - } else { - *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); - *(s32 *)(self + 0xCC) = obj; - if (*(s16 *)(self + 0x70) == 1) { - func_8001CB6C((u8 *)obj, (s32)&D_80183764, 0x250, 0x1A0); - b = 0x14; - } else { - func_8001CB6C((u8 *)obj, (s32)&D_801837D4, 0x300, 0x1D0); - b = 0x6A; - } - *(u8 *)(obj + 0x27) = (u8)b; - *(s32 *)(obj + 4) = 0x60000000; - *(u16 *)(obj + 0x10) = 0x400; - *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); - *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); - e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); - *(u16 *)(obj + 0x1A) = 0x4000; - *(u16 *)(obj + 0x18) = 0x4000; - *(u16 *)(obj + 0xC) = (u16)e; - *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; - } -} - - -DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ - - -extern void (*D_801837F0[])(void); - -void func_801449C8(void *a0) { - D_801837F0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ - - -extern void (*D_801837F8[])(void); - -void func_80144A2C(void *a0) { - D_801837F8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ - -DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ - -DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ - -DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030", func_80144B14); diff --git a/src/ov_SC03_030/ov_SC03_030_jr_8012ACE0.c b/src/ov_SC03_030/ov_SC03_030_jr_8012ACE0.c new file mode 100644 index 000000000..1b6371510 --- /dev/null +++ b/src/ov_SC03_030/ov_SC03_030_jr_8012ACE0.c @@ -0,0 +1,2827 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801DF55C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801820E4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E077C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E1BD0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801DF55C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181E20)(); +extern s16 (*D_80181E24)(); +extern M2C_UNK (*D_80181E2C)(); +extern s32 (*D_80181E30)(); +extern s32 D_801E0778; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801DF560; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182178; +extern void func_8012ACA0(void *arg0); +/* ==== end §8b carried decl layer ==== */ + + + + +// @class: iv-combine +// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ + +s32 func_8012ACE0(void *o) { + int i; + for (i = 0; ; i++) { + switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { + case -2: + case -1: + case 0: + return i; + case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ + default: + break; + } + } +} + +DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ + +DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ + + + +void func_8012AD64(s32 *a0, s16 a1) { + *(s16*)((s32)a0 + 0x34) = a1; +} + + +DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ + +DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ + +DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ + +DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ + +DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ + +DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ + +DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ + +DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ + +DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ + +DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ + +DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ + +DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ + +DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ + +DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ + +DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ + +DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ + +DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012B4B8); + +DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ + +DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ + +DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ + +DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012B77C); + +DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ + +DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ + +DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ + +DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ + +DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ + +DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ + +DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ + +DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ + +DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ + +DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ + +DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ + +DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ + +DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ + +DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ + + +void func_8012BF4C(s32 *a0, s32 a1) { + *(s32*)((s32)a0 + 0x1C) = a1; +} + + +DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ + +DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ + +DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ + +DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ + +DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012C098); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012C0EC); + +DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ + +DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ + +DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ + +DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ + +DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ + +DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ + +DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ + +DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ + +DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ + +DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ + +DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012C658); + +DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012C750); + +DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to +// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS +// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via +// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store +// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. +// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). + +extern s32 D_8018565C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern void func_80016714(void *a0, s32 a1); + +s32 func_8012C890(s32 a0, s32 a1, s32 a2) { + u8 *src = (u8 *)a0; + u8 *dst = (u8 *)a1; + u16 *d; + s16 count; + u16 v2, v4; + s32 v10; + void *obj; + + *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); + v2 = *(u16 *)(src + 0x0); + *(u16 *)(dst + 0x6) = v2; + *(u16 *)(dst + 0x88) = v2; + v2 = *(u16 *)(src + 0x2); + *(u16 *)(dst + 0xA) = v2; + *(u16 *)(dst + 0x8A) = v2; + v4 = *(u16 *)(src + 0x4); + *(u16 *)(dst + 0xC) = 0; + *(u16 *)(dst + 0x8) = 0; + *(u16 *)(dst + 0x4) = 0; + *(u16 *)(dst + 0xE) = v4; + *(u16 *)(dst + 0x8C) = v4; + *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); + *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; + *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); + v10 = *(s32 *)(src + 0x10); + *(s32 *)(dst + 0x78) = (s32)&D_8018565C; + *(s32 *)(dst + 0xDC) = v10; + + { + register u16 *pc __asm__("$3"); + pc = &(*(u16 *)&D_801270C4); + *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; + count = *(volatile u16 *)pc + 1; + *pc = count; + if (count == 0) { + *pc = 1; + } + } + + if (a2 != 0) { + *(s32 *)(dst + 0x64) = a2; + *(s32 *)(dst + 0x68) = 0; + } else { + *(s32 *)(dst + 0x64) = 0; + *(s32 *)(dst + 0x68) = (s32)src; + } + + *(u16 *)(src + 0xA) |= 0x8000; + *(u16 *)(dst + 0x2) = 0; + d = D_801274E4; + *d &= 0xFFFE; + (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); + + if (*d & 1) { + s32 a1v; + obj = *(void **)(dst + 0x20); + if (obj != 0) { + s32 t = *(u16 *)obj; + if (t != 1) { + if (t != 2) { + goto done; + } + a1v = 0x38; + } else { + a1v = 0x84; + } + func_80016714(obj, a1v); + done:; + } + func_80016714(dst, 0x10C); + *(u16 *)(src + 0xA) &= 0x7FFF; + return 0; + } + + if (*(s32 *)(dst + 0x64) == 0) { + void *o = *(void **)(dst + 0x20); + if (o == 0) { + return (s32)dst; + } + if (*(u16 *)o == 1) { + s16 c = *(s16 *)(src + 0xC); + if (c != 0x7FFF) { + *(s16 *)((u8 *)o + 0x12) = c; + } + } + } + if (*(s32 *)(dst + 0x20) != 0) { + *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); + } + return (s32)dst; +} + + +DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ + +DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ + +DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ + +DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ + +DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ + +DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ + +DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ + +DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012CC88); + +DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ + +DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ + +DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ + +DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ + +DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ + +DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ + +DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ + +DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ + +DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ + +DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ + +DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH + + +struct S8012D664_8012D664 { short a, b, c; }; + +int func_8012D664(int arg0, int arg1, int arg2) { + extern int func_8012F568(); + extern int D_80182188; + + struct S8012D664_8012D664 s; + int ret; + int t; + + s.a = (*(unsigned short*)&D_80126B5E); + s.b = (*(unsigned short*)&D_80126B62) - 0x40; + s.c = (*(unsigned short*)&D_80126B66); + ret = ((int(*)())func_800132BC)(arg0, &s); + t = arg1 + 0x20; + if (ret < t * t) { + func_8012F568(1, 1, 0, arg2, arg0, &D_80182188); + return 1; + } + return 0; +} + + + +DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ + + + +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80182190; +extern M2C_UNK D_80182198; + +s32 func_8012DB84(void) +{ + func_8014C978(); + func_8012F568(1, 0xC001, 0, 0x3E8, &D_80182190, &D_80182198); +} + + +DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH + + +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; + + +s32 func_8012DDA4() +{ + extern Entry_8012DDA4 * D_801E079C; + extern Entry_8012DDA4 * D_801E0798; + + Entry_8012DDA4 *p; + Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); + + while (D_801E079C != end) { + p = D_801E079C; + if (p->active != 0 && p != D_801E0798) { + D_801E079C = p + 1; + return p; + } + D_801E079C++; + } + D_801E079C = 0; + return 0; +} + + + +// @class: plumbing +// @stuck: none — MATCH (35/35 ins, relocation-masked) + + +s32 func_8012DE2C(s32 a0) { + extern u8 * D_801E079C; + extern u8 * D_801E0798; + + u8 *base; + u8 *end; + u8 *p; + + base = D_801202A0; + end = base + 0x6480; + D_801E079C = base; + D_801E0798 = ((u8 *)a0); + + while (D_801E079C != end) { + p = D_801E079C; + if (*(u16 *)p != 0 && p != ((u8 *)a0)) { + D_801E079C = p + 0x10C; + return p; + } + D_801E079C += 0x10C; + } + D_801E079C = 0; + return 0; +} + + + +DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ + +DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ + +DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ + +DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ + +DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012E014); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012E138); + + +s32 func_8012E27C(void) { + return 1; +} + + +DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ + +DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ + +DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012E364); + +DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ + +DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ + +DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ + +DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ + +DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH +extern u8 D_800AF648; +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) +{ + struct { short xy[2]; int sp14; int flag; } f; + register void *p __asm__("$4"); + p = &D_800AF648; + func_8004914C(p); + func_800491AC(&D_800AF648); + RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); + if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { + func_8002D4C8(param_2, param_3); + } +} + + +DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012E778); + +DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ + +DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ + +DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ + +DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ + + + +// @class: other +// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) + +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801821A0; + +void func_8012E9C0(int param_1) +{ + int iVar1; + + if (*(short *)(param_1 + 0x60) != 0) { + if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { + *(short *)(param_1 + 0x82) = 0; + *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); + *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); + *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); + } + if (*(int *)(param_1 + 0x78) != 0) { + iVar1 = *(short *)(param_1 + 0x60) * + *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; + if (iVar1 < 1) { + iVar1 = 1; + } + } else { + iVar1 = *(short *)(param_1 + 0x60); + } + func_8016AA50(param_1, iVar1); + if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { + func_8016B428(param_1); + func_80019064(&D_801821A0); + } + } + return; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012EA90); + +DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ + +DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ + +DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ + +DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012EFB8); + + +// @class: other +// @stuck: none — MATCH (33 ins, match_one verified) + +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); + +void func_8012F038(int param_1, short *param_2, short *param_3) { + int in[3]; + int out[3]; + + in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); + in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); + in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); + ApplyTransposeMatrixLV((void *)param_1, in, out); + param_3[0] = out[0]; + param_3[1] = out[1]; + param_3[2] = out[2]; +} + + +DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(s32 a0, s32 a1, void *a2); + +void func_8012F14C(s32 a0, s32 a1, s32 a2) +{ + s32 buf[2]; + func_8004914C((void *)a0); + func_800491AC((void *)a0); + RotTransSV(a1, a2, buf); +} + + +DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ + +DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012F274); + +DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ + +DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012F40C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_8012F49C); + +DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ + +DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ + +DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ + +DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ + +DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801821BC[]; + +void func_8012F828(int param_1) +{ + *(unsigned char *)(param_1 + 0xC1) = 4; + if (*(unsigned int *)(param_1 + 0xB4) & 8) { + func_80131170(param_1, D_801821BC, 0xB); + } + func_80131CA8(param_1, 9); +} + + +DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ + + +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern void func_80131CA8(int a0, int a1); +extern u8 D_801821C8[]; + +void func_8012F8C8(u8* arg0) { + *(u8*)(arg0 + 0xC1) = 7; + if (*(u32*)(arg0 + 0xB4) & 0x80) { + ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801821C8, 0xB); + } + ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); +} + + +DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ + +DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ + +DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ + +DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ + +DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. +// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for +// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be +// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an +// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). +// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: +// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. +// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which +// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because +// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. +// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out +// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, +// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what +// blocks reorg from sharing a downstream constant into a branch delay slot.) + + +s32 func_8012FCC4(s32 param_1) { + extern int D_801821D4; + + int v1 = *(int *)(((int)param_1) + 0xC4); + *(char *)(((int)param_1) + 0xC1) = 8; + if (v1 & 2) { + *(char *)(((int)param_1) + 0xC1) = 1; + func_80131CA8(((int)param_1), 3); + return; + } + if (v1 & 1) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 1); + return; + } + if (*(int *)(((int)param_1) + 0xB4) & 0x100) { + ((void (*)(int))func_80131B14)(((int)param_1)); + if (*(short *)(((int)param_1) + 0x76) <= 0) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); + return; + } + if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { + *(char *)(((int)param_1) + 0xC2) = 0; + } else { + *(short *)(((int)param_1) + 0x98) = 0; + *(char *)(((int)param_1) + 0xC2) = 1; + } + ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801821D4); + *(int *)(((int)param_1) + 0x1C) = 0; + func_80131CA8(((int)param_1), 0x1C); + return; + } + func_80131CA8(((int)param_1), 0x1C); +} + + + +DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ + +DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ + +DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ + +DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ + +DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ + +DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ + +DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ + +DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ + +DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ + +DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ + +DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ + +DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ + +DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ + +DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ + +DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ + +DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ + +DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80130650); + +DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ + +DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ + +DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ + +DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ + +DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ + +DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80130A18); + +DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ + +DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80130C08); + + +extern void (*D_801821DC[])(void); + +void func_80130D0C(void *a0) { + D_801821DC[*(u8 *)((s32)a0 + 0xC1)](); +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018222C[]; +extern s16 D_8018225C[]; +extern s16 D_801822BC[]; +extern s16 D_801822C4[]; +extern s16 D_801822E4[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_8018225C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801822BC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822C4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801822E4; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_8018222C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + + +// @class: loop-guard +// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps +// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` +// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); +// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's +// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC +// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). + + +void func_80131170(s32 p, s32 b, s32 c) { + extern u8 D_801821B0[]; + + func_80131B14(); + *(u8 *)(((u8 *)p) + 0xC2) = 0; + *(u8 *)(((u8 *)p) + 0xC3) = 0; + *(s16 *)(((u8 *)p) + 0x98) = 0; + if (((u8 *)b) == 0) { + ((u8 *)b) = D_801821B0; + } + func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); + *(s32 *)(((u8 *)p) + 0x1C) = 0; + if (c != 0) { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } else { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } +tail: + if (*(s16 *)(((u8 *)p) + 0x76) > 0) { + return; + } + if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); + } else { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); + } +} + + + +// @class: struct +// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) + +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ + + +s32 func_801312D0(s32 param_1, void *param_2) +{ + extern int func_80131CF4(int, int); + extern M8_801312D0 D_80182304; + + int iVar5; + + iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); + if (iVar5 != 0) { + ((short *)param_2)[2] = 0; + ((short *)param_2)[0] = 0; + ((short *)param_2)[1] = (short)iVar5; + } else { + *(M8_801312D0 *)((short *)param_2) = D_80182304; + } +} + + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80131340); + +DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80131A34); + +DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` +// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be +// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a +// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). +// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; +// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the +// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); +// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. + +void func_80131B14() { + extern void func_8002A520(void *); + extern void func_8002A790(void *); + extern u8 D_8018230C; + + register u8 *a0v __asm__("$4"); + u8 *p = a0v; + + + s32 e = *(u8 *)(p + 0x5E); + + if (*(s16 *)(p + 0x60) != 0) { + if (e == 0x1D) { + *(s16 *)(p + 0x82) = 0; + *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); + *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); + *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); + } + { + s32 dec; + s32 q = *(s32 *)(p + 0x78); + if (q != 0) { + dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; + if (dec <= 0) dec = 1; + } + *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; + } + ((void (*)(void *))func_8016AA50)(p); + if (*(u16 *)(p + 0x82) & 1) { + ((void (*)(void *))func_8016B428)(p); + ((void(*)(void *))func_80019064)(&D_8018230C); + } + } + + *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; + + if (e != 0x1D) { + if (*(u8 *)(p + 0xC8)) func_8002A520(p); + if (*(u8 *)(p + 0xC9)) func_8002A790(p); + } + + if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; + + { + s32 r = *(s32 *)(p + 0x20); + *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; + { + s32 r2 = *(s32 *)(p + 0x20); + *(s16 *)(r2 + 0x14) = 0; + *(s16 *)(r2 + 0x10) = 0; + } + } + + ((void (*)(void *))func_8012B2CC)(p); + ((void (*)(void *))func_8012B23C)(p); +} + + + +DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80131CA8); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80131CF4); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80131D68); + + +extern void (*D_8018231C[])(struct S80131E00 *a0); + +void func_80131E00(struct S80131E00 *a0, s32 a1) { + a0->field_B0 = a1; + D_8018231C[a1](a0); +} + + +DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ + +DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ + +DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ + + +extern void (*D_80182374[])(void); + +void func_80131EEC(void *a0) { + D_80182374[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801823BC[])(void); + +void func_80131F28(void *a0) { + D_801823BC[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801823C4[])(void); + +void func_80131F64(void *a0) { + D_801823C4[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801823CC[])(void); + +void func_80131FA0(void *a0) { + D_801823CC[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801823D4[])(void); + +void func_80131FDC(void *a0) { + D_801823D4[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80132018); + +DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_8018237C; + +void func_801320D8(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_8018237C; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +s32 func_80132144(s32 param_1) +{ + extern int D_8018238C; + + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(((int)param_1) + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(((int)param_1)); + } else { + ((void(*)(int, int))func_8001C214)(v0, 0); + *(int *)(((int)param_1) + 0x58) = (int)&D_8018238C; + *(short *)(((int)param_1) + 0x5c) = 0x80; + *(unsigned short *)(((int)param_1) + 2) += 1; + } +} + + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_8018239C; + +void func_801321B0(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_8018239C; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_801823AC; + +void func_8013221C(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_801823AC; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + +DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ + +DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_801325B8); + +DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ + +DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ + +DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ + +DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ + +DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ + +DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80132F40); + +DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_801330E0); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80133298); + +DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ + +DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH + +extern s32 D_801E07E8; +extern s32 D_801E07EC[]; +extern int D_801E07F0; +extern void func_80136BC4(s32 a0); + +void func_801336E8(void *a0, int a1, int a2) { + if (a0 != 0) { + (*(void * *)&D_801E07E8) = a0; + ((void (*)(void))func_80136BC4)(); + } + (*(int *)&D_801E07EC) = a1; + D_801E07F0 = a2; +} + + + + +extern s32 D_801E07EC[]; +extern s32 D_801E07E8; +extern void func_80136BC4(s32); + +void func_8013373C(s16 arg0) { + s32 temp = D_801E07EC[arg0]; + if (temp != 0) { + D_801E07E8 = temp; + func_80136BC4(temp); + } +} + + +// @class: regalloc-order +#include "common.h" + +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; + + +s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { + extern s32 func_80047D3C(s32); + extern s32 func_80133AB0(s16, s16, s16, s32); + extern Box_80133784 * D_801823DC; + extern Box_80133784 * D_801823E0; + extern s16 D_801E07F4; + extern u16 D_801E07F8; + + register s32 s1 __asm__("$17"); + s32 s2; + register s16 s3 __asm__("$19"); + register s32 s4 __asm__("$20"); + register s16 a0v __asm__("$4"); + register s16 arg0s __asm__("$21"); + s32 dx, dy, dz; + s32 r, ret; + + a0v = ((s16)arg0); + s1 = 0; + s3 = 0; + s4 = 0; + s2 = 0; + arg0s = a0v; + D_801823DC->f6 = -0x7FFF; + D_801823E0->f6 = 0x7FFF; + D_801823DC->f0 = ((Box_80133784 *)arg1)->f0; + D_801823DC->f4 = ((Box_80133784 *)arg1)->f4; + D_801823E0->f0 = ((Box_80133784 *)arg2)->f0; + D_801823E0->f4 = ((Box_80133784 *)arg2)->f4; + D_801E07F8 = 0; + D_801E07F4 = 0; + + if ((s16)a0v == 0) { + s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; + s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; + s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; + if (sx == 0 && sy == 0) { + s32 zt = (sz == 0); + __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); + } + D_801823DC->f2 = ((Box_80133784 *)arg1)->f2 - 4; + r = func_80047D3C(sx * sx + sz * sz); + if (r < 3) { + r = 4; + } else if (r < 5) { + r += 1; + } + D_801823E0->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; + } else { + D_801823DC->f2 = ((Box_80133784 *)arg1)->f2; + if ((s16)a0v == 2) { + D_801823E0->f0 = D_801823DC->f0; + D_801823E0->f2 = D_801823DC->f2 + 6; + s2 = 1; + D_801823E0->f4 = D_801823DC->f4; + } else { + D_801823E0->f2 = ((Box_80133784 *)arg2)->f2; + } + } + + while (1) { + s32 ret0; + register s32 retc __asm__("$3"); + __asm__ __volatile__(""); + ret0 = func_80133AB0(arg0s, (s16)D_801823DC->f0, (s16)D_801823DC->f4, (*(s32*)&D_801E07E8)); + __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); + ret = retc; + if (ret == 0) goto after; + s4 |= ret; + if (s2 != 0) goto after; + { + s16 oldc = s3; + s3 = s3 + 1; + if (oldc >= 5) break; + } + } + + D_801823E0->f0 = D_801823DC->f0; + D_801823E0->f2 = D_801823DC->f2; + s1 = 0x2000; + D_801823E0->f4 = D_801823DC->f4; + goto store_out; + +after: + if ((s16)s4 != 0 || D_801E07F4 != 0) { + s16 t; + __asm__ __volatile__("" :: "r"(s4)); + t = D_801823DC->f6; + if (t >= -0xBCB) { + if (t < -0x578) { + s1 |= 0x4000; + } else { + s1 |= 0x8000; + } + } + if ((s16)D_801823E0->f6 < -0xBCB) { + s1 |= 0x2000; + } + store_out: + ((Box_80133784 *)arg2)->f0 = D_801823E0->f0; + ((Box_80133784 *)arg2)->f2 = D_801823E0->f2; + ((Box_80133784 *)arg2)->f4 = D_801823E0->f4; + ((Box_80133784 *)arg2)->f6 = D_801E07F8; + return s1 & 0xFFFF; + } + ((Box_80133784 *)arg2)->f6 = D_801E07F8; + return 0; +} + + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80133AB0); + + +s32 func_80133CD4(arg0, cmd, base, arr) + s16 arg0; + s16 *cmd; + s16 *base; + s32 *arr; +{ + typedef struct { s16 e[4]; } ElemK; + + extern u16 *D_801823E0; + extern u16 *D_801823DC; + extern s16 *D_801823E8; + extern s16 *D_801823E4; + extern s32 *D_801823F0; + extern s32 *D_801823F4; + extern u16 D_801E07F8; + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern u16 D_801152AE; + extern u8 D_801152B0; + extern s32 func_80134310(); + extern s32 func_8013435C(); + + s16 *s3 = ((ElemK *)base)[cmd[1]].e; + s32 s6 = arr[cmd[2]]; + s32 s0var, s1var; + s32 s2a; + s16 y; + + if (func_80134310(s3, D_801823E0, s6) >= 0) + return 0; + + s1var = func_80134310(s3, D_801823DC, s6); + if (s1var < 0) + return 0; + + s0var = func_80134310(s3, D_801823E8, 0); + { + u16 *pac = D_801823DC; + s16 *pb8 = D_801823E8; + s16 *pb4 = D_801823E4; + s32 neg = -s1var; + pb4[0] = pac[0] + neg * pb8[0] / s0var; + pb4[1] = pac[1] + neg * pb8[1] / s0var; + pb4[2] = pac[2] + neg * pb8[2] / s0var; + if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) + return 0; + } + if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_801823E4, arr[cmd[6]], s3)) + return 0; + if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_801823E4, arr[cmd[8]], s3)) + return 0; + if (arg0 < 0) { + if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_801823E4, arr[cmd[10]], s3)) + return 0; + } + if (arg0 & 0x10) { + if (*(u16 *)cmd & 0x100) + return 0; + } + if (*(u16 *)cmd & 0x200) { + D_801E07F8 = *(u16 *)cmd; + return 0; + } + + { + s32 ret = func_80134310(s3, D_801823E0, s6); + s32 *pc0; + s32 *pc4; + u16 *pb0; + s32 t, o2; + s32 q3v; + + { + s32 *pw = D_801823F0; + ((struct { s32 w; } *)pw)->w = s3[0]; + pw[1] = s3[1]; + pw[2] = s3[2]; + } + s1var = -ret; + + __asm__ __volatile__( + "lwc2 $9, 0(%0)\n" + "lwc2 $10, 4(%0)\n" + "lwc2 $11, 8(%0)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : "r"(D_801823F0) : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"(D_801823F4) : "memory"); + + pc0 = D_801823F0; + pc4 = D_801823F4; + s0var = pc4[0] + pc4[1] + pc4[2]; + pb0 = D_801823E0; + pb0[0] += s1var * pc0[0] / s0var; + pb0[1] += s1var * pc0[1] / s0var; + q3v = s1var * pc0[2] / s0var; + + { + s32 h; + h = ((s16 *)pb0)[0]; + s1var = h << 16; + __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); + s0var = h << 16; + } + pb0[2] += q3v; + s2a = (s16)pb0[2] << 16; + + t = pc0[0] << 4; + pc0[0] = t; + if (t < 0) s1var |= 0xFFFF; + t = pc0[1] << 4; + pc0[1] = t; + if (t < 0) s0var |= 0xFFFF; + o2 = pc0[2]; + t = o2 << 4; + pc0[2] = t; + if (t < 0) s2a |= 0xFFFF; + s2a += o2 << 5; + s1var += pc0[0] << 1; + s0var += pc0[1] << 1; + + do { + s32 *pl = D_801823F0; + u16 *pb; + s1var += pl[0]; + s0var += pl[1]; + s2a += pl[2]; + pb = D_801823E0; + pb[0] = s1var >> 16; + pb[1] = s0var >> 16; + pb[2] = s2a >> 16; + ret = func_80134310(s3, pb, s6); + } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); + } + + y = s3[1]; + if (y >= -0xBCB) { + D_801823DC[3] = y; + { + typedef struct { s8 c[8]; } Blk8; + *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; + } + if (*(u8 *)cmd != 0) + goto ret1; + return -1; + } + { + typedef struct { u16 h; } H16; + u16 *s3u = (u16 *)s3; + u16 *bp = D_801823E0; + u16 w; + ((H16 *)D_801152A8)->h = s3u[0]; + w = s3u[1]; + bp[3] = w; + ((H16 *)&D_801152AA)->h = w; + ((H16 *)&D_801152AC)->h = s3u[2]; + ((H16 *)&D_801152AE)->h = s3u[3]; + } +ret1: + return 1; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80134310); + +DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (83 ins, relocation-masked) + + + +s32 func_801343C4(s32 angle, s32 p1, s32 p2) +{ + extern int func_80133AB0(int, s16, s16, int); + extern s16 * D_801823DC; + extern s16 * D_801823E0; + extern u16 D_801E07F8; + extern u16 D_801E07F4; + + s16 *pac; + s16 *pb0; + s16 *pacs, *pb0s; + u16 *pb0u; + int a1v, a2v, d94, b0; + int sangle = ((s16)angle); + + pac = D_801823DC; + d94 = D_801E07E8; + pb0 = D_801823E0; + pac[0] = ((u16 *)p1)[0]; + pac[1] = ((u16 *)p1)[1]; + pac[2] = ((u16 *)p1)[2]; + pb0[0] = ((u16 *)p2)[0]; + pb0[1] = ((u16 *)p2)[1]; + pb0[2] = ((u16 *)p2)[2]; + + a1v = pac[0]; a2v = pac[2]; + __asm__ __volatile__("" ::: "memory"); + D_801E07F8 = 0; + D_801E07F4 = 0; + if (func_80133AB0(sangle, a1v, a2v, d94)) { + setdst: + pb0u = (u16 *)D_801823E0; + ((u16 *)p2)[0] = pb0u[0]; + ((u16 *)p2)[1] = pb0u[1]; + ((u16 *)p2)[2] = pb0u[2]; + ((u16 *)p2)[3] = D_801E07F8; + return 1; + } + + pacs = D_801823DC; + pb0s = D_801823E0; + b0 = pb0s[0]; + if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && + (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { + return 0; + } + if (func_80133AB0(sangle, b0, pb0s[2], D_801E07E8)) { + goto setdst; + } + return 0; +} + + + +// @class: schedule +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; + + +s32 func_80134510(s32 param) { + extern s32 func_801345F8(s32); + extern Foo_80134510_80134510 * D_801823DC; + extern Foo_80134510_80134510 * D_801823E0; + extern Foo_80134510_80134510 * D_801823E4; + extern u16 D_801E07F8; + + + s32 ret = 0; + Foo_80134510_80134510 *b0 = D_801823E0; + Foo_80134510_80134510 *ac = D_801823DC; + u16 t0 = ((Foo_80134510_80134510 *)param)->f0; + u16 t2, t4; + + ((Foo_80134510_80134510 *)param)->f6 = 0; + ac->f0 = t0; + b0->f0 = t0; + t2 = ((Foo_80134510_80134510 *)param)->f2; + ac->f2 = t2 - 4; + b0->f2 = t2 + 0x2FC; + t4 = ((Foo_80134510_80134510 *)param)->f4; + ac->f4 = t4; + b0->f4 = t4; + + if (func_801345F8((*(s32*)&D_801E07E8)) != 0) { + s16 x; + ((Foo_80134510_80134510 *)param)->f2 = D_801823E4->f2 - 2; + x = D_801823DC->f6; + if (x >= -3019) { + if (x < -1400) { + ret = 0x4000; + } else { + ret = 0x8000; + } + } else { + ret = 0x2000; + } + D_801823DC->f6 = D_801E07F8; + } + return ret; +} + + + +// @class: regalloc-order +// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. + + +s32 func_801345F8(s32 arg) +{ + extern int func_801347A0(short, u16 *, int, int); + extern u16 * D_801823DC; + extern u16 D_801E07F8; + + register u16 *param_1 __asm__("$5") = ((u16 *)arg); + register u16 *cc __asm__("$4") = D_801823DC; + int c8000 = 0x8000; + register int zr __asm__("$0"); + u32 c1, c2, uVar6, uVar2, cnt, v14; + u16 *ptmp, *puVar4, *puVar7, uVar1; + int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; + + c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; + uVar6 = c1 + zr; + if ((c1 & 0xffff) < (u32)param_1[2]) { + c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; + uVar2 = c2 + zr; + if ((c2 & 0xffff) < (u32)param_1[3]) + goto do_mult; + return 0; + found: + D_801E07F8 = *puVar7; + return 1; + do_mult: + tbl = *(int *)(param_1 + 4); + uVar10 = *(int *)(param_1 + 6); + uVar3 = *(int *)(param_1 + 8); + iVar9 = *(int *)(param_1 + 0xc); + iVar8 = *(int *)(param_1 + 0xe); + ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); + cnt = (u32)ptmp[1]; + v14 = *(int *)(param_1 + 10); + puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; + while (((cnt-- + zr) & 0xffff) != 0) { + uVar1 = *puVar4; + hi = uVar1 & 0x8000; + harg = hi + zr; + if (hi == 0) + puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); + else + puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); + if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) + goto found; + puVar4 = puVar4 - 1; + } + } + return 0; +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. +#include "common.h" + +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; + +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; + +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; + + + +s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); + extern s16 * D_801823E0; + extern SVec_801347A0 * D_801823DC; + extern SVec_801347A0 * D_801823E4; + + Elem_801347A0 *pElem; + s32 val; + register s32 iv __asm__("$4"); + s32 q; + s32 dvsr; + + pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; + val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; + if (func_80134A28((s32)pElem, (s32)D_801823E0, val) >= 0) { + return 0; + } + iv = func_80134A28((s32)pElem, (s32)D_801823DC, val); + if (iv < 0) { + return 0; + } + iv = -iv; + dvsr = pElem->f2 * 48; + q = (iv * 48) / dvsr; + D_801823E4->f0 = D_801823DC->f0; + D_801823E4->f2 = D_801823DC->f2 + q; + D_801823E4->f4 = D_801823DC->f4; + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { + return 0; + } + if ((s16)arg0) { + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_801823E4, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { + return 0; + } + } + if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { + return 0; + } + D_801823E4->f0 = D_801823DC->f0; + D_801823E4->f4 = D_801823DC->f4; + (*(Elem_801347A0*)D_801152A8) = *pElem; + D_801823DC->f6 = pElem->f2; + return 1; +} + + + +DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80134A74); + +// @class: regalloc-order +// @try: variant B — direct pins m=$s5($21), c=$s6($22) + + +s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); + extern void * D_801823DC; + extern void * D_801823E0; + extern void * D_801823E4; + extern void * D_801823E8; + extern u16 D_801E07F8; + + s32 temp_a3; + s32 temp_s1; + s32 temp_v0; + s32 temp_v0_2; + s32 var_v0; + u16 temp_a1; + s32 temp_s4; + s32 c = arg0; + __asm__ __volatile__("" : "=r"(c) : "0"(c)); + __asm__ __volatile__("" : : "r"(arg0)); + + temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); + temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); + var_v0 = 0; + if (func_80134FB8(temp_s4, (s32) D_801823E0, temp_s1) >= 0) { + return var_v0; + } + temp_v0 = func_80134FB8(temp_s4, (s32) D_801823DC, temp_s1); + if (temp_v0 < 0) { + goto block_13; + } + temp_v0_2 = func_80134FB8(temp_s4, (s32) D_801823E8, 0); + temp_a3 = -temp_v0; + { + u16 *pB4 = (u16 *)D_801823E4; + u16 *pAC = (u16 *)D_801823DC; + s16 *pB8 = (s16 *)D_801823E8; + pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; + pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; + pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { + return var_v0; + } + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_801823E4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { + return var_v0; + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_801823E4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { + return var_v0; + } + if ((arg0 << 16) < 0) { + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_801823E4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { + return var_v0; + } + } + if (c & 1) { + if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { + goto block_14; + } + return 0; + } + temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); + if (!(temp_a1 & 0x200)) { + goto block_14; + } + D_801E07F8 = temp_a1; +block_13: + return 0; +block_14: + __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); + VectorNormalSS(D_801823E8, D_801823E8); + { + u16 *pB8 = (u16 *)D_801823E8; + u16 *pB4b = (u16 *)D_801823E4; + pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); + var_v0 = 1; + pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); + pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); + } + return var_v0; +} + + + +DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype D_801823E0 + D_801823DC (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + extern int func_80134A74(int, s16, s16, int); + extern s16 * D_801823E0; + extern s16 * D_801823DC; + extern u8 D_801823E8; + extern s16 *D_801823E4; + extern u16 D_801E07F8; + + register s16 *pb0 __asm__("$9"); /* D_801823E0 -> $t1 */ + register s16 *pac __asm__("$6"); /* D_801823DC -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_801823E8 -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = D_801823E0; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = D_801823DC; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_801823E8); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_801E07E8; + __asm__ __volatile__("" ::: "memory"); + D_801E07F8 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_801823E4); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_801E07F8; + return 1; + } + { + register u16 *qb __asm__("$4"); /* D_801823DC -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* D_801823E0[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* D_801823E0 -> $a2 (reloaded) */ + qb = (u16 *)D_801823DC; + qa = (u16 *)D_801823E0; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801E07E8)) + goto found; + return 0; + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (62 ins, relocation-masked) + + +extern u8 D_801823E0; +extern u8 D_801823DC; +extern s16 *D_801823E4; +extern u8 D_801823E8; +extern int D_801E07E8; +extern u16 D_801E07F8; + +extern int func_80134A74(int, s16, s16, int); + +int func_80135168(u16 arg0, u16 *p1, u16 *p2) +{ + register s16 *pb0 __asm__("$8"); + register s16 *pac __asm__("$6"); + register s16 *pb8 __asm__("$7"); + u16 *pb4; + u16 a, b; + int a1v, a2v, d94; + + pb0 = (*(s16 * *)&D_801823E0); + __asm__ __volatile__("" : : "r"(pb0)); + + a = p2[0]; pac = (*(s16 * *)&D_801823DC); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_801823E8); pac[0] = b; pb8[0] = a - b; + a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; + a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; + + a1v = pac[0]; a2v = pac[2]; d94 = D_801E07E8; + __asm__ __volatile__("" ::: "memory"); + D_801E07F8 = 0; + if (func_80134A74(arg0, a1v, a2v, d94)) { + pb4 = (*(u16 * *)&D_801823E4); + p2[0] = pb4[0]; + p2[1] = pb4[1]; + p2[2] = pb4[2]; + p2[3] = D_801E07F8; + return 1; + } + return 0; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80135260); + + +/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). + * + * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 + * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does + * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in + * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). + * + * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): + * the two output buffers D_801823DC / D_801823E0 are written through a pointer in each of the two + * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a + * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also + * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each + * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks + * the lowest-free scratch over its OWN window: + * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) + * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) + * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail + * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. + * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades + * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the + * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. + * + * Zero file-scope footprint (block-scoped typedefs + externs; D_801823DC/B0 read via the ambient + * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for + * family_sweep --edit-remap with no cc1 crash. + * + * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. + */ +s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) +{ + typedef struct { s32 vx, vy, vz, pad; } Vec32; + typedef struct { s16 vx, vy, vz, pad; } Vec16; + typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; + extern void func_80048EAC(void *m0, void *m1); + extern void func_8004914C(void *m); + extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); + extern void ApplyRotMatrixLV(void *in, void *out); + extern void ApplyRotMatrix(void *in, void *out); + extern s32 D_801E07FC, D_801E0800, D_801E0804, D_801E0808; + extern s16 D_801E080C; + extern s32 D_801E081C; + extern s16 D_801E0820, D_801E0822, D_801E0824, D_801E0826, D_801E0828, D_801E082A; + + Vec32 in0, in1, rotout; + Mat32 mat2; + Vec16 vecin; + s32 result; + s32 mode; + s32 q1, q2; + s32 p; + s32 t18, t1A, t1C; + s32 *m; + + in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); + in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); + if ((param_2 & 0x10000000) == 0) { + if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { + return 0; + } + } + mode = param_2 & 0x60000000; + if (mode != 0) { + result = 1; + if (param_2 >= 0) { + mode &= 0x40000000; + } + in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); + in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); + switch (mode) { + case 0x60000000: + m = &D_801E07FC; + *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); + q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); + q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); + D_801E0800 = 0; + D_801E0808 = 0; + D_801E0804 = q1; + D_801E080C = q2; + func_80048EAC((void *)((s32)param_1 + 0x34), m); + ApplyTransposeMatrixLV(m, &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + /* fallthrough */ + case 0x20000000: + p = (param_2 & 0xFFFFFFF) | 0x80000000; + t18 = *(s16 *)((s32)param_1 + 0x18); + t1A = *(s16 *)((s32)param_1 + 0x1A); + t1C = *(u16 *)((s32)param_1 + 0x1C); + mat2.w4 = 0; + mat2.wC = 0; + mat2.w0 = t18; + mat2.w8 = t1A; + mat2.h10 = t1C; + func_8004914C(&mat2); + vecin.vx = *(u16 *)(p + 4); + vecin.vy = *(u16 *)(p + 8); + vecin.vz = *(u16 *)(p + 0xC); + ApplyRotMatrix(&vecin, &rotout); + D_801E0820 = rotout.vx; + D_801E0824 = rotout.vy; + D_801E0828 = rotout.vz; + vecin.vx = *(u16 *)(p + 6); + vecin.vy = *(u16 *)(p + 0xA); + vecin.vz = *(u16 *)(p + 0xE); + ApplyRotMatrix(&vecin, &rotout); + D_801E081C = 0; + D_801E0822 = rotout.vx; + D_801E0826 = rotout.vy; + D_801E082A = rotout.vz; + result += 2; + break; + case 0x40000000: + ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + break; + } + { + s16 *p = *(s16 **)&D_801823DC; + p[0] = in0.vx; + p[1] = in0.vy; + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_801823E0; + p[0] = in1.vx; + p[1] = in1.vy; + p[2] = in1.vz; + } + return result; + } + { + s16 *p = *(s16 **)&D_801823DC; + p[0] = in0.vx; + p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_801823E0; + p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); + p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); + } + return 1; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80135888); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80135A4C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80135D20); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80135EB0); + + +s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + register s32 a1v __asm__("$11"); + register s32 a2v __asm__("$12"); + register s32 n __asm__("$5"); + register s16 *b4 __asm__("$7"); + s32 d; + s32 dx; + s32 denom; + s32 result; + s32 frame_pad[2]; + (void)&frame_pad; + __asm__("" : "=r"(a1v) : "0"(arg1)); + a2v = arg2; + + if (!(arg1 & 1)) { + dx = (s16) arg2 - (*(s16 **)&D_801823DC)[2]; + d = dx; + denom = -(*(s16 **)&D_801823E8)[2]; + } else { + denom = (*(s16 **)&D_801823E8)[2]; + d = (*(s16 **)&D_801823DC)[2] - (s16) arg2; + dx = -d; + } + n = -d; + { + register s16 *b8 __asm__("$6") = *(s16 **)&D_801823E8; + u16 *ac = *(u16 **)&D_801823DC; + b4 = D_801823E4; + b4[0] = ac[0] + n * b8[0] / denom; + b4[1] = ac[1] + n * b8[1] / denom; + b4[2] = ac[2] + dx; + } + + if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; + if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; + if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; + if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; + if (a1v & 0x8000) { + u16 *b0 = *(u16 **)&D_801823E0; + b4[0] = b0[0]; + b4[1] = b0[1]; + } + D_801152AA = 0; + (*(s16 *)D_801152A8) = 0; + if (a1v & 1) { + D_801823E4[2] = a2v + 2; + __asm__ __volatile__(""); + D_801152AC = 0xFFF; + } else { + D_801152AC = -0xFFF; + D_801823E4[2] = a2v - 2; + } + __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); + (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; + D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; + result = 1; + D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; + return result; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_801365B8); + + +// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) +// D_801823DC/B0/B8 are file-scope `extern u8`, D_801823E4 is `extern s32 []`; each HOLDS a +// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. +// D_801823E4 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the +// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar +// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the +// siblings read it once via *(u16**)&sym == direct lw either way). + +s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + + register u16 *ac __asm__("$4"); + register s16 *b8 __asm__("$6"); + register s16 *b4 __asm__("$9"); + register s32 r __asm__("$3"); + register s32 pos __asm__("$12"); + register s32 a1v __asm__("$5"); + s16 temp_v0; + s16 temp_v1; + s32 var_a3; + s16 var_v0_3; + s32 temp_a1; + s32 var_t0; + s32 var_v1; + s16 *b4b; + u16 *p; + + __asm__ ("" : "=r"(a1v) : "0"(arg1)); + pos = arg2; + if (!(a1v & 1)) { + var_t0 = (s16) arg2 - (*(s16 **)&D_801823DC)[1]; + var_v1 = var_t0; + var_a3 = -(*(s16 **)&D_801823E8)[1]; + } else { + var_a3 = (*(s16 **)&D_801823E8)[1]; + var_v1 = (*(s16 **)&D_801823DC)[1] - (s16) arg2; + var_t0 = -var_v1; + } + b8 = (*(s16 **)&D_801823E8); + ac = (*(u16 **)&D_801823DC); + b4 = D_801823E4; + temp_a1 = -var_v1; + r = (temp_a1 * b8[0]) / var_a3; + b4[0] = ac[0] + r; + b4[1] = ac[1] + var_t0; + r = (temp_a1 * b8[2]) / var_a3; + temp_v0 = ac[2] + r; + b4[2] = temp_v0; + temp_v1 = b4[0]; + if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { + return 0; + } + if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { + return 0; + } + if (arg1 & 0x8000) { + p = (*(u16 **)&D_801823E0); + b4[0] = (s16) p[0]; + b4[2] = (s16) p[2]; + } + D_801152AC = 0; + (*(s16 *)D_801152A8) = 0; + if (arg1 & 1) { + b4b = D_801823E4; + D_801152AA = 0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos + 2; + } else { + b4b = D_801823E4; + D_801152AA = -0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos - 2; + } + b4b[1] = var_v0_3; + __asm__ __volatile__("" :: "r"(pos)); + (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); + D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); + D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); + return 1; +} + + +// @class: schedule +// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a +// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE +// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses +// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] +// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the +// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; +// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits +// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the +// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). + + +extern s16 *D_801823E4; /* holds a pointer value (*(u16**)&D_801823E4) */ + +s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { + extern void ApplyMatrixSV(void *m, void *v0, void *v1); + extern void ApplyRotMatrix(void *v0, void *v1); + extern u16 D_80126722; + extern s16 D_80126724; + extern s16 D_801152AA; + extern s16 D_801152AC; + + s32 out[4]; + u16 *pb4; + + if (a0) { + ApplyMatrixSV((void *)a3, *(void **)&D_801823E4, *(void **)&D_801823E4); + ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); + ApplyRotMatrix((void *)D_801152A8, (void *)out); + *(s16 *)D_801152A8 = out[0]; + D_801152AA = out[1]; + D_801152AC = out[2]; + } + + pb4 = *(u16 **)&D_801823E4; + *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); + *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); + *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); + + *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); + D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); + D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); +} + + + +DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ + +DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ + +DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ + +DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ + +DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ + + +extern unsigned short D_800B99F0; +extern void (*D_801823F8[])(void); + +void func_80136C54(void) +{ + D_801823F8[D_800B99F0](); +} + + +// @class: struct +// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801DF7B0 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). + +typedef struct { char s[10]; } S10_80136C90; + +s32 func_80136C90() +{ + extern void func_8001534C(int, void *, int, int, int, int); + extern S10_80136C90 D_801DF7B0; + + S10_80136C90 buf = D_801DF7B0; + func_8001534C(0, &buf, 0x78, 0x10, 0, 0); +} + + + +DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ + +DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80136DFC); + +DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ + +DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80136F3C); + +DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80137178); + +DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ + +DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80137614); + +DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ + +DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_801376E8); + +DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ + +DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_801378F0); + +DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ + +DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_801379FC); + + +// @class: remat +// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer +extern s32 D_80127548[]; +extern int D_8018244C; +extern int D_801269F0; +extern void func_80138BE0(int p); + +void func_80137B80(void) { + int *p = &D_801269F0; + (*(int *)&D_80127548) = 0x24; + if (*p != 0) { + ((void (*)(int *))func_80138BE0)(p); + } + D_8018244C += 1; +} + + +DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. + +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int D_8018244C; +extern int D_801269F0; + +extern void func_801392FC(); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); + +int func_80137D08(int arg0, int arg1, short arg2) +{ + unsigned char buf[3]; + + D_800A5E60 = arg0; + D_80126A0A = arg2; + ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); + if ((*(short *)&D_801269F4) == 7) { + buf[0] = 0x39; + buf[1] = 0xFF; + buf[2] = 0x71; + ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); + } else if ((*(short *)&D_801269F4) == 3) { + if (D_8018244C & 4) { + ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); + } + } + return D_800A5E60; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8012ACE0", func_80137DD4); + +DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ diff --git a/src/ov_SC03_030/ov_SC03_030_jr_801380E0.c b/src/ov_SC03_030/ov_SC03_030_jr_801380E0.c new file mode 100644 index 000000000..cbcc7a629 --- /dev/null +++ b/src/ov_SC03_030/ov_SC03_030_jr_801380E0.c @@ -0,0 +1,3320 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801DF55C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801820E4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E077C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E1BD0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801DF55C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181E20)(); +extern s16 (*D_80181E24)(); +extern M2C_UNK (*D_80181E2C)(); +extern s32 (*D_80181E30)(); +extern s32 D_801E0778; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801DF560; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182178; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018565C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80182190; +extern M2C_UNK D_80182198; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801821A0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801821BC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801821C8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801821DC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018222C[]; +extern s16 D_8018225C[]; +extern s16 D_801822BC[]; +extern s16 D_801822C4[]; +extern s16 D_801822E4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018231C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182374[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801823BC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801823C4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801823CC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801823D4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018237C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018239C; +extern void func_801321B0(int param_1); +extern int D_801823AC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E07E8; +extern s32 D_801E07EC[]; +extern int D_801E07F0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801823E0; +extern u8 D_801823DC; +extern s16 *D_801823E4; +extern u8 D_801823E8; +extern int D_801E07E8; +extern u16 D_801E07F8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801823E4; /* holds a pointer value (*(u16**)&D_801823E4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801823F8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018244C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182450[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182450[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182494; +extern u8 D_801824D8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182494; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801824D8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018251C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182558[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182558; + if (((s16)a1) < 0xC00) { + tbl = D_8018251C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182594, D_80182596, D_80182598, D_8018259A, D_8018259C, D_8018259E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182596 < ang)) goto outer_else; + if (!(ang < D_8018259C)) goto inner_else; + if (ang < D_80182598) { *(s16 *)L = D_80182598; goto done; } + if (D_8018259A < ang) { *(s16 *)L = D_8018259A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182594) { *(s16 *)L = D_80182594; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018259E < ang) { *(s16 *)L = D_8018259E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E0860; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E0860, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E0860; +extern s8 D_801E0864; +extern s8 D_801E0865; + +void func_8013C9C4(void * arg0) +{ + D_801E0860 = arg0; + D_801E0864 = 0; + D_801E0865 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E0860; +extern s8 D_801E0864; +extern s8 D_801E0865; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E0860; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E0865; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E0864)) * 2) + D_801E0860); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E0865 = (unsigned char) p[1]; + D_801E0864 = D_801E0864 + 1; + if (D_801E0865 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E0864 = 0; + *base = 0; + } + } + else + { + D_801E0865 = c - 1; + } + } + return; +} + + + +extern s32 D_801E0884; +extern s32 D_801E0878; +extern s32 D_801E087C; +extern s32 D_801E0888; + +void func_8013CABC(void) { + D_801E0884 = 1; + D_801E0878 = 1; + D_801E087C = 0; + D_801E0888 = 1; +} + + + +extern s32 D_801E0878; +extern s32 D_801E087C; +extern s32 D_801E0880; +extern s32 D_801E0884; +extern s32 D_801E0888; + +void func_8013CAE8(void) { + D_801E0878 = 1; + D_801E0884 = 0; + D_801E087C = 0; + D_801E0880 = -1; + D_801E0888 = 0; +} + + + +extern s32 D_801E0884; +extern s32 D_801E0888; +extern s32 D_801E08B0; +extern s32 D_801E08B4; + +void func_8013CB20(void) +{ + D_801E08B0 = D_801E0888; + D_801E08B4 = D_801E0884; + D_801E0888 = 1; + D_801E0884 = 0; +} + + + +extern s32 D_801E08B0; +extern s32 D_801E08B4; +extern s32 D_801E0888; +extern s32 D_801E0884; + +void func_8013CB5C(void) { + D_801E0888 = D_801E08B0; + D_801E0884 = D_801E08B4; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E1AE8; + extern u8 D_801E1AE9; + extern u8 D_801E1AEA; + extern u8 D_801E1AEB; + extern u8 D_801E1AEC; + extern u8 D_801E1AED; + extern u8 D_801E1AEE; + extern u8 D_801E1AEF; + extern u8 D_801E1AF0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E1AE8; t1 = D_801E1AE9; t2 = D_801E1AEA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E1AEB; t1 = D_801E1AEC; t2 = D_801E1AED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E1AEE; t1 = D_801E1AEF; t2 = D_801E1AF0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E0890; +extern s32 D_801E0878; +extern s32 D_801E0894; +extern s32 D_801E0884; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E0890 != 0) { + if (D_801E0890 != 2) { + if (((D_801E0890 < 3) && (D_801E0890 == 1)) && + (D_801E0894 = D_801E0894 + 1, 0x23a < D_801E0894)) { + D_801E0878 = D_801E0890; + D_801E0890 = 2; + } + } else { + D_801E0878 = D_801E0878 + -1; + if (D_801E0878 == 0) { + D_801E0878 = D_801E0890; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E0884 == 0) { + D_801E0890 = D_801E0890 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E0884; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E0884; +} + + + +extern s32 D_801E0890; + +void func_8013D164(void) { + D_801E0890 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E1BCA; +extern u8 D_801E1C3E; +extern u8 D_801E1AF2; +extern u8 D_801E1BAC; +extern u8 D_801E1AD0; +extern u8 D_801E1AF1; +extern s32 D_801E1BB0; + +void func_8013D330(void) { + if ((D_801E1BCA & 0xff) != D_801E1C3E) { + D_801E1BCA = ((D_801E1BCA & 0xff) < D_801E1C3E) ? (D_801E1BCA + 1) : (D_801E1BCA - 1); + } + if ((D_801E1AF2 & 0xff) != D_801E1BAC) { + D_801E1AF2 = ((D_801E1AF2 & 0xff) < D_801E1BAC) ? (D_801E1AF2 + 1) : (D_801E1AF2 - 1); + } + if ((D_801E1AD0 & 0xff) != D_801E1AF1) { + D_801E1AD0 = ((D_801E1AD0 & 0xff) < D_801E1AF1) ? (D_801E1AD0 + 1) : (D_801E1AD0 - 1); + } + D_801E1BB0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E0868; +extern void *D_801E086C; +extern void *D_801E0870; +extern s32 D_801E0898; +extern s32 D_801E089C; +extern s32 D_801E08A0; +extern s32 D_801E1B24[]; + +extern u8 D_8018268C[]; +extern u8 D_80182734[]; +extern u8 D_801825E4[]; +extern u8 D_801826E0[]; +extern u8 D_80182760[]; +extern u8 D_80182638[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E0898 = param_2; + D_801E089C = (param_2 >> 2) & 3; + D_801E08A0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E0868 = D_8018268C; + D_801E086C = D_80182734; + D_801E0870 = D_801825E4; + } else { + D_801E0868 = D_801826E0; + D_801E086C = D_80182760; + D_801E0870 = D_80182638; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E08A0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E0898 & 2) != 0) { + D_801E1B24[0] = 0x140; + D_801E1B24[3] = 0x80; + if (p[0x37] == 4) { + D_801E1B24[0] = 0x140; + D_801E1B24[3] = 0; + } + if (p[0x37] == 0) { + D_801E1B24[0] = 0x140; + D_801E1B24[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E0870)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E0870; +extern s16 *D_801E0874; +extern s32 D_801E0884; +extern s32 D_801E08A4; +extern s32 D_801E08A8; +extern s32 D_801E08AC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E0874 != 0) { + D_801E0884 = 0; + p = (int *)(param_1 * 12 + (int)D_801E0870); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E08A4 != x) { + flag = 1; + if (D_801E08A4 < x) { + if (x - D_801E08A4 < 5) { + D_801E08A4 = x; + } else { + D_801E08A4 = D_801E08A4 + 4; + } + } else { + if (D_801E08A4 - x < 5) { + D_801E08A4 = x; + } else { + D_801E08A4 = D_801E08A4 - 4; + } + } + } + if (D_801E08A8 != y) { + flag = 1; + if (D_801E08A8 < y) { + if (y - D_801E08A8 < 5) { + D_801E08A8 = y; + } else { + D_801E08A8 = D_801E08A8 + 4; + } + } else { + if (D_801E08A8 - y < 5) { + D_801E08A8 = y; + } else { + D_801E08A8 = D_801E08A8 - 4; + } + } + } + if (D_801E08AC != z) { + flag = 1; + if (D_801E08AC < z) { + if (z - D_801E08AC < 5) { + D_801E08AC = z; + } else { + D_801E08AC = D_801E08AC + 4; + } + } else { + if (D_801E08AC - z < 5) { + D_801E08AC = z; + } else { + D_801E08AC = D_801E08AC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E0884 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801827F0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E0874); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E08A4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E08A8); + uVar5 = (*(int*)&D_801E08AC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801827F0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E088C; + +s32 func_8013E054(void) { + return D_801E088C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801831EC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801831C4; +extern s16 D_801831C6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801831EC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801831C4 = 2; + D_801831C6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801831C6 = 0; + D_801831C4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E08C0; + extern void * D_801E08C4; + extern unsigned char D_80182E64; + extern unsigned char D_80182E7C; + extern unsigned char D_80182EF0; + extern unsigned char D_80182EF8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E08C0 = &D_80182E64; + D_801E08C4 = &D_80182EF0; + } else { + D_801E08C0 = &D_80182E7C; + D_801E08C4 = &D_80182EF8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801831EC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801831EC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801831EC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801831C8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801831C8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801831C8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801831C4; +extern s16 D_801831C6; +extern unsigned char D_801831C8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801831C6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801831C4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801831C6; + if (*r < 3) { + *r = *r + 1; + } + D_801831C4 = (u16)D_801831C4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831C8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801831C8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831C8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013FAF8); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8013FFD8); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8014032C); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80140608); + + +// @class: iv-combine +// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source +// pointer compile to fixed offsets when written base[0..n]; the target advances +// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead +// final increment, yielding the "increment N-2 then offset 0/2" tail). + +extern u8 *D_80182EA4; +extern u8 *D_80182EA8; +extern u8 *D_80182EAC; +extern u8 *D_80182EB0; +extern u8 *D_80182EB4; +extern u16 *D_80182EB8[]; +extern u16 *D_80182EC0[]; +extern u16 *D_80182EE0[]; + +extern s32 func_80028D58(void); +extern s32 func_80028DE0(void); +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); + +void func_801407F4(void) +{ + u8 *puVar1; + s32 iVar2; + u16 *puVar3; + + puVar1 = D_80182EA4; + iVar2 = func_80028D58(); + puVar3 = D_80182EB8[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + puVar1 = D_80182EA8; + iVar2 = func_80028DE0(); + puVar3 = D_80182EB8[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + iVar2 = func_80028FBC(); + *(s16 *)(D_80182EAC + 0x18) = *D_80182EC0[iVar2]; + iVar2 = func_80029000(); + *(s16 *)(D_80182EB0 + 0x18) = *D_80182EC0[iVar2]; + + puVar1 = D_80182EB4; + iVar2 = func_80028D9C(); + puVar3 = D_80182EE0[iVar2]; + *(s16 *)(puVar1 + 0x12) = *puVar3++; + *(s16 *)(puVar1 + 0x14) = *puVar3++; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + *(s16 *)(puVar1 + 0x1c) = *puVar3++; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80140958); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80140D68); + + +// @class: struct +// @stuck: none — MATCH + +extern unsigned char D_80078E7F; +extern unsigned char D_80078E7E; +extern unsigned char D_80078E7D; +extern M2C_UNK D_80182DE0; + +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); + +void func_80140E6C(void) { + void *puVar1; + unsigned int uVar2; + unsigned int uVar3; + unsigned int uVar4; + + puVar1 = (*(void * *)&D_80182DE0); + uVar2 = func_800D2CA8(D_80078E7F, 0x18); + uVar3 = func_800D2CA8(D_80078E7E, 0xc); + uVar4 = func_800D2CA8(D_80078E7D, 0); + func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); +} + + + + +// @class: plumbing +// @stuck: none — MATCH (128/128 ins, match_one confirmed) + +extern short D_80115128; +extern u8 D_80182DF0; +extern char *D_80182E10; +extern char *D_80182E14; +extern char *D_80182E18; +extern char *D_80182E1C; +extern char *D_80182E20; + +extern int func_80029FE4(void); +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); +extern char *func_8002AAB4(void); +extern char *strcpy(char *, const char *); +extern int func_8002A26C(void); +extern int func_8002A2B0(void); +extern int func_8002A4B8(void); +extern s32 func_8002A4FC(s32 a0); +extern int func_8002A998(void); +extern int func_8002A9DC(void); +extern int func_8002A728(void); +extern int func_8002A76C(void); +extern int func_80029FD4(void); + +void func_80140F00(void) { + char *p; + int r; + + if (D_80115128 == 0) { + p = (*(char * *)&D_80182DF0); + r = func_800D2CA8(func_80029FE4() + 1, 0x18); + func_800D2D10(r, 2, p + 4, 1); + strcpy(p + 0xA, func_8002AAB4()); + + p = D_80182E10; + r = func_800D2CA8(func_8002A26C() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A2B0(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182E14; + r = func_800D2CA8(func_8002A4B8() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182E18; + r = func_800D2CA8(func_8002A998() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A9DC(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182E1C; + r = func_800D2CA8(func_8002A728() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A76C(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182E20; + r = func_800D2CA8(func_80029FD4(), 4); + func_800D2D10(r, 7, p + 0x18, -1); + } +} + + + +// @class: other +// @stuck: none — MATCH + +extern short D_80115128; +extern unsigned short D_80115172; +extern unsigned short D_80182CAA; +extern unsigned short D_80182CAE; +extern unsigned short D_80182CB2; +extern unsigned short D_80182CB6; + +extern s32 func_8002A1B4(void); +extern short func_8002A28C(void); +extern short func_8002A27C(void); +extern s32 func_8002A400(void); +extern short func_8002A4D8(void); +extern short func_8002A4C8(void); +extern s32 func_8002A8E0(void); +extern short func_8002A9B8(void); +extern short func_8002A9A8(void); +extern s32 func_8002A670(void); +extern short func_8002A748(void); +extern short func_8002A738(void); +extern int func_801412A8(int, int, int, int, int, int); + +int func_80141100(int param_1) +{ + short sVar1; + int iVar7; + + if (D_80115128 == 0) { + iVar7 = D_80115172 + 0x31; + sVar1 = D_80182CAA; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); + sVar1 = D_80182CAE; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); + sVar1 = D_80182CB2; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); + sVar1 = D_80182CB6; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); + } + return param_1; +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_801412A8); + +DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ + +DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ + +DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ + + +extern unsigned short D_80115112; +extern void (*D_80183240[])(void); + +void func_80141788(void) +{ + D_80183240[D_80115112](); +} + + +DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ + +DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80141874); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_801418F8); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80141A60); + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80141B90); + +DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) + +extern u16 D_80115110; +extern u8 D_801831A0; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80141C0C(s32 param_1) +{ + func_8002D4C8(*(u16 *)(&D_801831A0 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); +} + + +DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ + +DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ + +DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ + +DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_801424E4); + + +extern void (*D_80183280[])(void); + +void func_801425CC(void *a0) { + D_80183280[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: schedule +// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail + +extern void func_8012C1B8(void); +extern s32 func_8012C1DC(s32 a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern s32 func_8012AD50(void *a0); +extern s32 D_80183264; + +void func_80142608(s32 param_1) +{ + register s32 iVar1 __asm__("$16"); + + if (*(short *)(param_1 + 0x70) != 0) { + iVar1 = ((s32 (*)(void))func_8012C1B8)(); + } else { + iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); + } + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CA1C(iVar1, (s32)&D_80183264); + *(short *)(iVar1 + 0x1a) = 0x200; + *(short *)(iVar1 + 0x18) = 0x200; + *(short *)(param_1 + 0xfc) = 0x40; + if (*(short *)(param_1 + 0x70) != 0) { + goto ad50; + } + if (*(s32 *)(param_1 + 100) != 0) { + *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); + goto ad50; + } + } + ((void (*)(s32))func_8012CAE4)(param_1); + return; +ad50: + *(short *)(param_1 + 0x98) = 0; + *(s32 *)(param_1 + 0x90) = 0; + ((void (*)(s32))func_8012AD50)(param_1); +} + + +DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ + +DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ + +DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ + +DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ + +DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80183294[])(); + +void func_801427EC(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80183294[*(u16 *)(param_1 + 2)](); + } +} + + +DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ + +DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801832B0[])(); + +void func_8014292C(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801832B0[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80183480[])(); + +void func_80142978(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80183480[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80183538[])(); + +void func_801429C4(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80183538[*(u16 *)(param_1 + 2)](); + } +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80142A10); + + +// @class: struct +// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) + +extern u16 D_800B99D8; +extern struct packed_word D_801DFEEC; +extern u8 D_801E08C8; +extern u8 D_801E08C9; +extern u8 D_801E08CA; + +void func_80142A80(void) +{ + u16 flags; + union word_bytes local; + s32 mul; + + flags = D_800B99D8; + local.pw = D_801DFEEC; + + if (flags & 0x10) { + mul = (s8)((flags & 0xf) >> 1) + 9; + } else { + mul = 0x10 - (s8)((flags & 0xf) >> 1); + } + + D_801E08C8 = mul * (local.b[0] >> 4); + D_801E08C9 = mul * (local.b[1] >> 4); + D_801E08CA = mul * (local.b[2] >> 4); +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80142B2C); + +DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ + +DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ + +DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ + +DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ + +DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ + +DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern int D_80183288; + +void func_80142DC4(int param_1) +{ + int v0; + + *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_80183288); + *(short *)(v0 + 0x1a) = 0x1800; + *(short *)(v0 + 0x18) = 0x1800; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_801832A4[]; + +void func_80142E38(int param_1) +{ + short sVar1; + int iVar2; + + *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_801832A4); + sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; + *(short *)(iVar2 + 0x1a) = sVar1; + *(short *)(iVar2 + 0x18) = sVar1; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80142EC0); + +DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ + +DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result +// survives across func_8001CA1C while $v0 serves the pre-call store/test; +// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80183490[]; +extern unsigned char D_801834F0[]; + +void func_8014305C(int param_1) +{ + register int s0_param __asm__("$16") = param_1; + register int s1_copy __asm__("$17"); + int iVar2; + short sVar1; + + iVar2 = ((int (*)(void))func_8012C1B8)(); + *(int *)(s0_param + 0x20) = iVar2; + s1_copy = iVar2; + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(s0_param); + } else { + ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80183490); + sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; + *(short *)(s1_copy + 0x1a) = sVar1; + *(short *)(s1_copy + 0x18) = sVar1; + *(short *)(s0_param + 0xfc) = 0; + func_8012A828(s0_param, D_801834F0); + ((void (*)(int))func_80142B2C)(s0_param); + } +} + + +DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ + +DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) + + +extern void *memcpy(void *, const void *, u32); + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern int func_8001CA88(int, void *); +extern s32 func_8012E504(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80142B2C(void *arg0); + +extern u8 D_801DFEE8; +extern u8 D_801E08C8; +extern u8 D_801E08CC; + +void func_801431E8(s32 param_1) { + u8 buf[8]; + s32 iVar5; + u16 uVar2; + s16 sVar4; + + register s32 d __asm__("$16"); + memcpy(buf, &D_801DFEE8, 4); + iVar5 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = iVar5; + d = iVar5; + if (iVar5 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, void *))func_8001CA88)(d, &D_801E08C8); + uVar2 = *(u16 *)(param_1 + 0x70); + *(s16 *)(d + 0x76) = -0x10; + sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; + *(s16 *)(d + 0x1a) = sVar4; + *(s16 *)(d + 0x18) = sVar4; + *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; + if (func_8012E504(param_1, 0x33) == 0) { + *(s16 *)(param_1 + 0xfc) = 1; + func_800233CC(&D_801E08C8, 0x10); + memcpy(&D_801E08CC, buf, 4); + } else { + *(s16 *)(param_1 + 0xfc) = 0; + } + ((void (*)(s32))func_80142B2C)(param_1); + } +} + + +DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ + +DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ + +DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) + +extern u8 D_800D387C[]; +extern u32 D_80183648[]; + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80143458(s32 param_1) +{ + s32 p; + u16 v; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + p = *(s32 *)(param_1 + 0x20); + if (*(s32 *)(p + 4) == 0) { + *(s32 *)(p + 4) = 0x50000000; + } + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + v = *(u16 *)(param_1 + 0x34) & 0x7fff; + if (v != 0) { + p = *(s32 *)(param_1 + 0x20); + *(u16 *)(p + 0x1a) = v; + *(u16 *)(p + 0x18) = v; + } + + func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, + D_80183648[*(u16 *)(param_1 + 0x34) & 3]); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + +DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_8014358C); + +DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ + +DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ + +DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ + +DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ + +DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ + +DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ + + +extern void (*D_80183770[])(void); + +void func_80143B30(void *a0) { + D_80183770[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ + +DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ + + +extern void (*D_8018377C[])(void); + +void func_80143C38(void *a0) { + D_8018377C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ + + +extern void (*D_80183784[])(void); + +void func_80143C98(void *a0) { + D_80183784[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80143D28); + + +extern void (*D_801837CC[])(void); + +void func_80143E68(void *a0) { + D_801837CC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ + +DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ + +DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ + +DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ + + +extern void (*D_801837E0[])(void); + +void func_80144054(void *a0) { + D_801837E0[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80144090); + +extern void func_8012C218(void *a0); + +// @class: struct +// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) + +extern void (*D_801837E8[])(); + +void func_801442F8(int param_1) +{ + int iVar1; + + D_801837E8[*(u16 *)(param_1 + 2)](); + iVar1 = *(int *)(param_1 + 0x1c) + 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (0x1d < iVar1) { + func_8012C218(param_1); + } +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern u8 D_80183764; + +void func_80144364(int param_1) { + int iVar3; + u16 uVar2; + s16 sVar1; + + iVar3 = ((s32 (*)(void))func_8012C194)(); + if (iVar3 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); + *(int *)(param_1 + 0xCC) = iVar3; + *(u16 *)(param_1 + 0xFC) = uVar2; + func_8001CB6C((u8 *)iVar3, (s32)&D_80183764, 0x250, 0x1A0); + *(s32 *)(iVar3 + 4) = 0x60000000; + *(u8 *)(iVar3 + 0x27) = 0x14; + *(u16 *)(iVar3 + 0x10) = 0x400; + *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); + *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); + *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); + sVar1 = *(s16 *)(param_1 + 0x70); + if (sVar1 != 0) { + *(s16 *)(iVar3 + 0x1A) = sVar1; + *(s16 *)(iVar3 + 0x18) = sVar1; + } else { + *(u16 *)(iVar3 + 0x1A) = 0x2000; + *(u16 *)(iVar3 + 0x18) = 0x2000; + } + *(u16 *)(param_1 + 2) = 1; + } +} + + + + +extern void func_80016714(void *a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *a0); +extern s32 D_80183778; + +void func_80144458(void *arg0) { + s32 temp_s0; + void *temp_s2; + void *temp_v0; + + temp_s2 = M2C_FIELD(arg0, void **, 0xCC); + if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { + temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); + if (temp_v0 != NULL) { + temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; + M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80183778 * 0x10); + M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80183778 * 0x10); + func_8012AD80(arg0); + } + } + M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); + M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); + M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); + if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { + func_80016714(temp_s2, 0x38); + func_8012C218(arg0); + } +} + + +DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ + +DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ + +DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_8018378C; +extern u8 D_80183798; + +void func_8014477C(void *param_1) { + s32 v0; + s32 v1; + register s32 uVar2 __asm__("$2"); + register s32 addr __asm__("$3"); + s32 gv; + s32 fv; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)param_1 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(param_1); + return; + } + ((void (*)(s32, void *))func_8001CA1C)(v0, &D_8018378C); + if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { + *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); + uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); + if (uVar2 != 0) { + addr = uVar2 & 0xFFFFFFF; + gv = *(u16 *)((addr | 0x80000000) + 8); + fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; + *(u16 *)((s32)param_1 + 0xA) = gv + fv; + } else { + *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; + } + } + ((void (*)(void *, void *))func_8012A828)(param_1, &D_80183798); + v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; + *(s16 *)((s32)param_1 + 0x2) = 1; + *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; + *(s32 *)((s32)param_1 + 0x1C) = 0x78; +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); + +extern u8 D_80183764; +extern u8 D_801837D4; + +void func_80144880(s32 param_1) +{ + register s32 obj __asm__("$16"); /* $s0 */ + register s32 self __asm__("$17") = param_1; /* $s1 */ + register s32 b __asm__("$2"); /* $v0 */ + s32 e; + + obj = ((s32 (*)(void))func_8012C194)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(self); + } else { + *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); + *(s32 *)(self + 0xCC) = obj; + if (*(s16 *)(self + 0x70) == 1) { + func_8001CB6C((u8 *)obj, (s32)&D_80183764, 0x250, 0x1A0); + b = 0x14; + } else { + func_8001CB6C((u8 *)obj, (s32)&D_801837D4, 0x300, 0x1D0); + b = 0x6A; + } + *(u8 *)(obj + 0x27) = (u8)b; + *(s32 *)(obj + 4) = 0x60000000; + *(u16 *)(obj + 0x10) = 0x400; + *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); + *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); + e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); + *(u16 *)(obj + 0x1A) = 0x4000; + *(u16 *)(obj + 0x18) = 0x4000; + *(u16 *)(obj + 0xC) = (u16)e; + *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; + } +} + + +DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ + + +extern void (*D_801837F0[])(void); + +void func_801449C8(void *a0) { + D_801837F0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ + + +extern void (*D_801837F8[])(void); + +void func_80144A2C(void *a0) { + D_801837F8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ + +DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ + +DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ + +DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_801380E0", func_80144B14); + diff --git a/src/ov_SC03_031/ov_SC03_031_jr_8012ACE0.c b/src/ov_SC03_031/ov_SC03_031_jr_8012ACE0.c index 2b36b4484..821d02f0d 100644 --- a/src/ov_SC03_031/ov_SC03_031_jr_8012ACE0.c +++ b/src/ov_SC03_031/ov_SC03_031_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018296C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018296C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801829B0; -extern u8 D_801829F4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801829B0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801829F4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182A38[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182A74[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182A74; - if (((s16)a1) < 0xC00) { - tbl = D_80182A38; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182AB0, D_80182AB2, D_80182AB4, D_80182AB6, D_80182AB8, D_80182ABA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182AB2 < ang)) goto outer_else; - if (!(ang < D_80182AB8)) goto inner_else; - if (ang < D_80182AB4) { *(s16 *)L = D_80182AB4; goto done; } - if (D_80182AB6 < ang) { *(s16 *)L = D_80182AB6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182AB0) { *(s16 *)L = D_80182AB0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80182ABA < ang) { *(s16 *)L = D_80182ABA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C4C60; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C4C60, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C4C60; -extern s8 D_801C4C64; -extern s8 D_801C4C65; - -void func_8013C9C4(void * arg0) -{ - D_801C4C60 = arg0; - D_801C4C64 = 0; - D_801C4C65 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C4C60; -extern s8 D_801C4C64; -extern s8 D_801C4C65; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C4C60; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C4C65; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C4C64)) * 2) + D_801C4C60); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C4C65 = (unsigned char) p[1]; - D_801C4C64 = D_801C4C64 + 1; - if (D_801C4C65 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C4C64 = 0; - *base = 0; - } - } - else - { - D_801C4C65 = c - 1; - } - } - return; -} - - - -extern s32 D_801C4C84; -extern s32 D_801C4C78; -extern s32 D_801C4C7C; -extern s32 D_801C4C88; - -void func_8013CABC(void) { - D_801C4C84 = 1; - D_801C4C78 = 1; - D_801C4C7C = 0; - D_801C4C88 = 1; -} - - - -extern s32 D_801C4C78; -extern s32 D_801C4C7C; -extern s32 D_801C4C80; -extern s32 D_801C4C84; -extern s32 D_801C4C88; - -void func_8013CAE8(void) { - D_801C4C78 = 1; - D_801C4C84 = 0; - D_801C4C7C = 0; - D_801C4C80 = -1; - D_801C4C88 = 0; -} - - - -extern s32 D_801C4C84; -extern s32 D_801C4C88; -extern s32 D_801C4CB0; -extern s32 D_801C4CB4; - -void func_8013CB20(void) -{ - D_801C4CB0 = D_801C4C88; - D_801C4CB4 = D_801C4C84; - D_801C4C88 = 1; - D_801C4C84 = 0; -} - - - -extern s32 D_801C4CB0; -extern s32 D_801C4CB4; -extern s32 D_801C4C88; -extern s32 D_801C4C84; - -void func_8013CB5C(void) { - D_801C4C88 = D_801C4CB0; - D_801C4C84 = D_801C4CB4; -} - - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C6150; - extern u8 D_801C6151; - extern u8 D_801C6152; - extern u8 D_801C6153; - extern u8 D_801C6154; - extern u8 D_801C6155; - extern u8 D_801C6156; - extern u8 D_801C6157; - extern u8 D_801C6158; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C6150; t1 = D_801C6151; t2 = D_801C6152; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C6153; t1 = D_801C6154; t2 = D_801C6155; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C6156; t1 = D_801C6157; t2 = D_801C6158; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C4C90; -extern s32 D_801C4C78; -extern s32 D_801C4C94; -extern s32 D_801C4C84; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C4C90 != 0) { - if (D_801C4C90 != 2) { - if (((D_801C4C90 < 3) && (D_801C4C90 == 1)) && - (D_801C4C94 = D_801C4C94 + 1, 0x23a < D_801C4C94)) { - D_801C4C78 = D_801C4C90; - D_801C4C90 = 2; - } - } else { - D_801C4C78 = D_801C4C78 + -1; - if (D_801C4C78 == 0) { - D_801C4C78 = D_801C4C90; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C4C84 == 0) { - D_801C4C90 = D_801C4C90 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C4C84; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C4C84; -} - - - -extern s32 D_801C4C90; - -void func_8013D164(void) { - D_801C4C90 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C6232; -extern u8 D_801C62A6; -extern u8 D_801C615A; -extern u8 D_801C6214; -extern u8 D_801C6138; -extern u8 D_801C6159; -extern s32 D_801C6218; - -void func_8013D330(void) { - if ((D_801C6232 & 0xff) != D_801C62A6) { - D_801C6232 = ((D_801C6232 & 0xff) < D_801C62A6) ? (D_801C6232 + 1) : (D_801C6232 - 1); - } - if ((D_801C615A & 0xff) != D_801C6214) { - D_801C615A = ((D_801C615A & 0xff) < D_801C6214) ? (D_801C615A + 1) : (D_801C615A - 1); - } - if ((D_801C6138 & 0xff) != D_801C6159) { - D_801C6138 = ((D_801C6138 & 0xff) < D_801C6159) ? (D_801C6138 + 1) : (D_801C6138 - 1); - } - D_801C6218 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C4C68; -extern void *D_801C4C6C; -extern void *D_801C4C70; -extern s32 D_801C4C98; -extern s32 D_801C4C9C; -extern s32 D_801C4CA0; -extern s32 D_801C618C[]; - -extern u8 D_80182BA8[]; -extern u8 D_80182C50[]; -extern u8 D_80182B00[]; -extern u8 D_80182BFC[]; -extern u8 D_80182C7C[]; -extern u8 D_80182B54[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C4C98 = param_2; - D_801C4C9C = (param_2 >> 2) & 3; - D_801C4CA0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C4C68 = D_80182BA8; - D_801C4C6C = D_80182C50; - D_801C4C70 = D_80182B00; - } else { - D_801C4C68 = D_80182BFC; - D_801C4C6C = D_80182C7C; - D_801C4C70 = D_80182B54; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C4CA0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C4C98 & 2) != 0) { - D_801C618C[0] = 0x140; - D_801C618C[3] = 0x80; - if (p[0x37] == 4) { - D_801C618C[0] = 0x140; - D_801C618C[3] = 0; - } - if (p[0x37] == 0) { - D_801C618C[0] = 0x140; - D_801C618C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C4C70)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C4C70; -extern s16 *D_801C4C74; -extern s32 D_801C4C84; -extern s32 D_801C4CA4; -extern s32 D_801C4CA8; -extern s32 D_801C4CAC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C4C74 != 0) { - D_801C4C84 = 0; - p = (int *)(param_1 * 12 + (int)D_801C4C70); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C4CA4 != x) { - flag = 1; - if (D_801C4CA4 < x) { - if (x - D_801C4CA4 < 5) { - D_801C4CA4 = x; - } else { - D_801C4CA4 = D_801C4CA4 + 4; - } - } else { - if (D_801C4CA4 - x < 5) { - D_801C4CA4 = x; - } else { - D_801C4CA4 = D_801C4CA4 - 4; - } - } - } - if (D_801C4CA8 != y) { - flag = 1; - if (D_801C4CA8 < y) { - if (y - D_801C4CA8 < 5) { - D_801C4CA8 = y; - } else { - D_801C4CA8 = D_801C4CA8 + 4; - } - } else { - if (D_801C4CA8 - y < 5) { - D_801C4CA8 = y; - } else { - D_801C4CA8 = D_801C4CA8 - 4; - } - } - } - if (D_801C4CAC != z) { - flag = 1; - if (D_801C4CAC < z) { - if (z - D_801C4CAC < 5) { - D_801C4CAC = z; - } else { - D_801C4CAC = D_801C4CAC + 4; - } - } else { - if (D_801C4CAC - z < 5) { - D_801C4CAC = z; - } else { - D_801C4CAC = D_801C4CAC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C4C84 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182D0C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C4C74); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C4CA4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C4CA8); - uVar5 = (*(int*)&D_801C4CAC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182D0C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C4C8C; - -s32 func_8013E054(void) { - return D_801C4C8C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183708; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801836E0; -extern s16 D_801836E2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183708; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801836E0 = 2; - D_801836E2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801836E2 = 0; - D_801836E0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C4CC0; - extern void * D_801C4CC4; - extern unsigned char D_80183380; - extern unsigned char D_80183398; - extern unsigned char D_8018340C; - extern unsigned char D_80183414; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C4CC0 = &D_80183380; - D_801C4CC4 = &D_8018340C; - } else { - D_801C4CC0 = &D_80183398; - D_801C4CC4 = &D_80183414; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183708/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183708 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183708)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801836E4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801836E4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801836E4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801836E0; -extern s16 D_801836E2; -extern unsigned char D_801836E4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801836E2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801836E0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801836E2; - if (*r < 3) { - *r = *r + 1; - } - D_801836E0 = (u16)D_801836E0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801836E4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801836E4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801836E4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_031/ov_SC03_031_jr_801380E0.c b/src/ov_SC03_031/ov_SC03_031_jr_801380E0.c new file mode 100644 index 000000000..5cb4c477f --- /dev/null +++ b/src/ov_SC03_031/ov_SC03_031_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C3A00; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182600[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C4B7C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C6238; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C3A00; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018233C)(); +extern s16 (*D_80182340)(); +extern M2C_UNK (*D_80182348)(); +extern s32 (*D_8018234C)(); +extern s32 D_801C4B78; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C3A04; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182694; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185B78; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801826AC; +extern M2C_UNK D_801826B4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801826BC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801826D8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801826E4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801826F8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182748[]; +extern s16 D_80182778[]; +extern s16 D_801827D8[]; +extern s16 D_801827E0[]; +extern s16 D_80182800[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182838[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182890[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801828D8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801828E0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801828E8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801828F0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182898; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801828B8; +extern void func_801321B0(int param_1); +extern int D_801828C8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C4BE8; +extern s32 D_801C4BEC[]; +extern int D_801C4BF0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801828FC; +extern u8 D_801828F8; +extern s16 *D_80182900; +extern u8 D_80182904; +extern int D_801C4BE8; +extern u16 D_801C4BF8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182900; /* holds a pointer value (*(u16**)&D_80182900) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182914[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182968; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018296C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018296C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801829B0; +extern u8 D_801829F4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801829B0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801829F4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182A38[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182A74[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182A74; + if (((s16)a1) < 0xC00) { + tbl = D_80182A38; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182AB0, D_80182AB2, D_80182AB4, D_80182AB6, D_80182AB8, D_80182ABA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182AB2 < ang)) goto outer_else; + if (!(ang < D_80182AB8)) goto inner_else; + if (ang < D_80182AB4) { *(s16 *)L = D_80182AB4; goto done; } + if (D_80182AB6 < ang) { *(s16 *)L = D_80182AB6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182AB0) { *(s16 *)L = D_80182AB0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182ABA < ang) { *(s16 *)L = D_80182ABA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C4C60; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C4C60, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C4C60; +extern s8 D_801C4C64; +extern s8 D_801C4C65; + +void func_8013C9C4(void * arg0) +{ + D_801C4C60 = arg0; + D_801C4C64 = 0; + D_801C4C65 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C4C60; +extern s8 D_801C4C64; +extern s8 D_801C4C65; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C4C60; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C4C65; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C4C64)) * 2) + D_801C4C60); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C4C65 = (unsigned char) p[1]; + D_801C4C64 = D_801C4C64 + 1; + if (D_801C4C65 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C4C64 = 0; + *base = 0; + } + } + else + { + D_801C4C65 = c - 1; + } + } + return; +} + + + +extern s32 D_801C4C84; +extern s32 D_801C4C78; +extern s32 D_801C4C7C; +extern s32 D_801C4C88; + +void func_8013CABC(void) { + D_801C4C84 = 1; + D_801C4C78 = 1; + D_801C4C7C = 0; + D_801C4C88 = 1; +} + + + +extern s32 D_801C4C78; +extern s32 D_801C4C7C; +extern s32 D_801C4C80; +extern s32 D_801C4C84; +extern s32 D_801C4C88; + +void func_8013CAE8(void) { + D_801C4C78 = 1; + D_801C4C84 = 0; + D_801C4C7C = 0; + D_801C4C80 = -1; + D_801C4C88 = 0; +} + + + +extern s32 D_801C4C84; +extern s32 D_801C4C88; +extern s32 D_801C4CB0; +extern s32 D_801C4CB4; + +void func_8013CB20(void) +{ + D_801C4CB0 = D_801C4C88; + D_801C4CB4 = D_801C4C84; + D_801C4C88 = 1; + D_801C4C84 = 0; +} + + + +extern s32 D_801C4CB0; +extern s32 D_801C4CB4; +extern s32 D_801C4C88; +extern s32 D_801C4C84; + +void func_8013CB5C(void) { + D_801C4C88 = D_801C4CB0; + D_801C4C84 = D_801C4CB4; +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C6150; + extern u8 D_801C6151; + extern u8 D_801C6152; + extern u8 D_801C6153; + extern u8 D_801C6154; + extern u8 D_801C6155; + extern u8 D_801C6156; + extern u8 D_801C6157; + extern u8 D_801C6158; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C6150; t1 = D_801C6151; t2 = D_801C6152; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C6153; t1 = D_801C6154; t2 = D_801C6155; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C6156; t1 = D_801C6157; t2 = D_801C6158; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C4C90; +extern s32 D_801C4C78; +extern s32 D_801C4C94; +extern s32 D_801C4C84; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C4C90 != 0) { + if (D_801C4C90 != 2) { + if (((D_801C4C90 < 3) && (D_801C4C90 == 1)) && + (D_801C4C94 = D_801C4C94 + 1, 0x23a < D_801C4C94)) { + D_801C4C78 = D_801C4C90; + D_801C4C90 = 2; + } + } else { + D_801C4C78 = D_801C4C78 + -1; + if (D_801C4C78 == 0) { + D_801C4C78 = D_801C4C90; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C4C84 == 0) { + D_801C4C90 = D_801C4C90 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C4C84; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C4C84; +} + + + +extern s32 D_801C4C90; + +void func_8013D164(void) { + D_801C4C90 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C6232; +extern u8 D_801C62A6; +extern u8 D_801C615A; +extern u8 D_801C6214; +extern u8 D_801C6138; +extern u8 D_801C6159; +extern s32 D_801C6218; + +void func_8013D330(void) { + if ((D_801C6232 & 0xff) != D_801C62A6) { + D_801C6232 = ((D_801C6232 & 0xff) < D_801C62A6) ? (D_801C6232 + 1) : (D_801C6232 - 1); + } + if ((D_801C615A & 0xff) != D_801C6214) { + D_801C615A = ((D_801C615A & 0xff) < D_801C6214) ? (D_801C615A + 1) : (D_801C615A - 1); + } + if ((D_801C6138 & 0xff) != D_801C6159) { + D_801C6138 = ((D_801C6138 & 0xff) < D_801C6159) ? (D_801C6138 + 1) : (D_801C6138 - 1); + } + D_801C6218 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C4C68; +extern void *D_801C4C6C; +extern void *D_801C4C70; +extern s32 D_801C4C98; +extern s32 D_801C4C9C; +extern s32 D_801C4CA0; +extern s32 D_801C618C[]; + +extern u8 D_80182BA8[]; +extern u8 D_80182C50[]; +extern u8 D_80182B00[]; +extern u8 D_80182BFC[]; +extern u8 D_80182C7C[]; +extern u8 D_80182B54[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C4C98 = param_2; + D_801C4C9C = (param_2 >> 2) & 3; + D_801C4CA0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C4C68 = D_80182BA8; + D_801C4C6C = D_80182C50; + D_801C4C70 = D_80182B00; + } else { + D_801C4C68 = D_80182BFC; + D_801C4C6C = D_80182C7C; + D_801C4C70 = D_80182B54; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C4CA0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C4C98 & 2) != 0) { + D_801C618C[0] = 0x140; + D_801C618C[3] = 0x80; + if (p[0x37] == 4) { + D_801C618C[0] = 0x140; + D_801C618C[3] = 0; + } + if (p[0x37] == 0) { + D_801C618C[0] = 0x140; + D_801C618C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C4C70)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C4C70; +extern s16 *D_801C4C74; +extern s32 D_801C4C84; +extern s32 D_801C4CA4; +extern s32 D_801C4CA8; +extern s32 D_801C4CAC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C4C74 != 0) { + D_801C4C84 = 0; + p = (int *)(param_1 * 12 + (int)D_801C4C70); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C4CA4 != x) { + flag = 1; + if (D_801C4CA4 < x) { + if (x - D_801C4CA4 < 5) { + D_801C4CA4 = x; + } else { + D_801C4CA4 = D_801C4CA4 + 4; + } + } else { + if (D_801C4CA4 - x < 5) { + D_801C4CA4 = x; + } else { + D_801C4CA4 = D_801C4CA4 - 4; + } + } + } + if (D_801C4CA8 != y) { + flag = 1; + if (D_801C4CA8 < y) { + if (y - D_801C4CA8 < 5) { + D_801C4CA8 = y; + } else { + D_801C4CA8 = D_801C4CA8 + 4; + } + } else { + if (D_801C4CA8 - y < 5) { + D_801C4CA8 = y; + } else { + D_801C4CA8 = D_801C4CA8 - 4; + } + } + } + if (D_801C4CAC != z) { + flag = 1; + if (D_801C4CAC < z) { + if (z - D_801C4CAC < 5) { + D_801C4CAC = z; + } else { + D_801C4CAC = D_801C4CAC + 4; + } + } else { + if (D_801C4CAC - z < 5) { + D_801C4CAC = z; + } else { + D_801C4CAC = D_801C4CAC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C4C84 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182D0C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C4C74); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C4CA4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C4CA8); + uVar5 = (*(int*)&D_801C4CAC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182D0C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C4C8C; + +s32 func_8013E054(void) { + return D_801C4C8C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183708; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801836E0; +extern s16 D_801836E2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183708; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801836E0 = 2; + D_801836E2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801836E2 = 0; + D_801836E0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C4CC0; + extern void * D_801C4CC4; + extern unsigned char D_80183380; + extern unsigned char D_80183398; + extern unsigned char D_8018340C; + extern unsigned char D_80183414; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C4CC0 = &D_80183380; + D_801C4CC4 = &D_8018340C; + } else { + D_801C4CC0 = &D_80183398; + D_801C4CC4 = &D_80183414; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183708/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183708 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183708)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801836E4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801836E4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801836E4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801836E0; +extern s16 D_801836E2; +extern unsigned char D_801836E4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801836E2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801836E0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801836E2; + if (*r < 3) { + *r = *r + 1; + } + D_801836E0 = (u16)D_801836E0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801836E4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801836E4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801836E4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_089/ov_SC03_089_jr_8012ACE0.c b/src/ov_SC03_089/ov_SC03_089_jr_8012ACE0.c index 732655a17..09246f8f0 100644 --- a/src/ov_SC03_089/ov_SC03_089_jr_8012ACE0.c +++ b/src/ov_SC03_089/ov_SC03_089_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80189C68[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80189C68[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80189CAC; -extern u8 D_80189CF0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80189CAC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80189CF0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80189D34[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80189D70[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80189D70; - if (((s16)a1) < 0xC00) { - tbl = D_80189D34; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80189DAC, D_80189DAE, D_80189DB0, D_80189DB2, D_80189DB4, D_80189DB6; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80189DAE < ang)) goto outer_else; - if (!(ang < D_80189DB4)) goto inner_else; - if (ang < D_80189DB0) { *(s16 *)L = D_80189DB0; goto done; } - if (D_80189DB2 < ang) { *(s16 *)L = D_80189DB2; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80189DAC) { *(s16 *)L = D_80189DAC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80189DB6 < ang) { *(s16 *)L = D_80189DB6; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C5518; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C5518, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C5518; -extern s8 D_801C551C; -extern s8 D_801C551D; - -void func_8013C9C4(void * arg0) -{ - D_801C5518 = arg0; - D_801C551C = 0; - D_801C551D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C5518; -extern s8 D_801C551C; -extern s8 D_801C551D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C5518; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C551D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C551C)) * 2) + D_801C5518); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C551D = (unsigned char) p[1]; - D_801C551C = D_801C551C + 1; - if (D_801C551D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C551C = 0; - *base = 0; - } - } - else - { - D_801C551D = c - 1; - } - } - return; -} - - - -extern s32 D_801C553C; -extern s32 D_801C5530; -extern s32 D_801C5534; -extern s32 D_801C5540; - -void func_8013CABC(void) { - D_801C553C = 1; - D_801C5530 = 1; - D_801C5534 = 0; - D_801C5540 = 1; -} - - - -extern s32 D_801C5530; -extern s32 D_801C5534; -extern s32 D_801C5538; -extern s32 D_801C553C; -extern s32 D_801C5540; - -void func_8013CAE8(void) { - D_801C5530 = 1; - D_801C553C = 0; - D_801C5534 = 0; - D_801C5538 = -1; - D_801C5540 = 0; -} - - - -extern s32 D_801C553C; -extern s32 D_801C5540; -extern s32 D_801C5568; -extern s32 D_801C556C; - -void func_8013CB20(void) -{ - D_801C5568 = D_801C5540; - D_801C556C = D_801C553C; - D_801C5540 = 1; - D_801C553C = 0; -} - - - -extern s32 D_801C5568; -extern s32 D_801C556C; -extern s32 D_801C5540; -extern s32 D_801C553C; - -void func_8013CB5C(void) { - D_801C5540 = D_801C5568; - D_801C553C = D_801C556C; -} - - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C67C8; - extern u8 D_801C67C9; - extern u8 D_801C67CA; - extern u8 D_801C67CB; - extern u8 D_801C67CC; - extern u8 D_801C67CD; - extern u8 D_801C67CE; - extern u8 D_801C67CF; - extern u8 D_801C67D0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C67C8; t1 = D_801C67C9; t2 = D_801C67CA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C67CB; t1 = D_801C67CC; t2 = D_801C67CD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C67CE; t1 = D_801C67CF; t2 = D_801C67D0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C5548; -extern s32 D_801C5530; -extern s32 D_801C554C; -extern s32 D_801C553C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C5548 != 0) { - if (D_801C5548 != 2) { - if (((D_801C5548 < 3) && (D_801C5548 == 1)) && - (D_801C554C = D_801C554C + 1, 0x23a < D_801C554C)) { - D_801C5530 = D_801C5548; - D_801C5548 = 2; - } - } else { - D_801C5530 = D_801C5530 + -1; - if (D_801C5530 == 0) { - D_801C5530 = D_801C5548; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C553C == 0) { - D_801C5548 = D_801C5548 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C553C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C553C; -} - - - -extern s32 D_801C5548; - -void func_8013D164(void) { - D_801C5548 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C68AA; -extern u8 D_801C691E; -extern u8 D_801C67D2; -extern u8 D_801C688C; -extern u8 D_801C67B0; -extern u8 D_801C67D1; -extern s32 D_801C6890; - -void func_8013D330(void) { - if ((D_801C68AA & 0xff) != D_801C691E) { - D_801C68AA = ((D_801C68AA & 0xff) < D_801C691E) ? (D_801C68AA + 1) : (D_801C68AA - 1); - } - if ((D_801C67D2 & 0xff) != D_801C688C) { - D_801C67D2 = ((D_801C67D2 & 0xff) < D_801C688C) ? (D_801C67D2 + 1) : (D_801C67D2 - 1); - } - if ((D_801C67B0 & 0xff) != D_801C67D1) { - D_801C67B0 = ((D_801C67B0 & 0xff) < D_801C67D1) ? (D_801C67B0 + 1) : (D_801C67B0 - 1); - } - D_801C6890 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C5520; -extern void *D_801C5524; -extern void *D_801C5528; -extern s32 D_801C5550; -extern s32 D_801C5554; -extern s32 D_801C5558; -extern s32 D_801C6804[]; - -extern u8 D_80189EA4[]; -extern u8 D_80189F4C[]; -extern u8 D_80189DFC[]; -extern u8 D_80189EF8[]; -extern u8 D_80189F78[]; -extern u8 D_80189E50[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C5550 = param_2; - D_801C5554 = (param_2 >> 2) & 3; - D_801C5558 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C5520 = D_80189EA4; - D_801C5524 = D_80189F4C; - D_801C5528 = D_80189DFC; - } else { - D_801C5520 = D_80189EF8; - D_801C5524 = D_80189F78; - D_801C5528 = D_80189E50; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C5558 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C5550 & 2) != 0) { - D_801C6804[0] = 0x140; - D_801C6804[3] = 0x80; - if (p[0x37] == 4) { - D_801C6804[0] = 0x140; - D_801C6804[3] = 0; - } - if (p[0x37] == 0) { - D_801C6804[0] = 0x140; - D_801C6804[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C5528)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C5528; -extern s16 *D_801C552C; -extern s32 D_801C553C; -extern s32 D_801C555C; -extern s32 D_801C5560; -extern s32 D_801C5564; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C552C != 0) { - D_801C553C = 0; - p = (int *)(param_1 * 12 + (int)D_801C5528); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C555C != x) { - flag = 1; - if (D_801C555C < x) { - if (x - D_801C555C < 5) { - D_801C555C = x; - } else { - D_801C555C = D_801C555C + 4; - } - } else { - if (D_801C555C - x < 5) { - D_801C555C = x; - } else { - D_801C555C = D_801C555C - 4; - } - } - } - if (D_801C5560 != y) { - flag = 1; - if (D_801C5560 < y) { - if (y - D_801C5560 < 5) { - D_801C5560 = y; - } else { - D_801C5560 = D_801C5560 + 4; - } - } else { - if (D_801C5560 - y < 5) { - D_801C5560 = y; - } else { - D_801C5560 = D_801C5560 - 4; - } - } - } - if (D_801C5564 != z) { - flag = 1; - if (D_801C5564 < z) { - if (z - D_801C5564 < 5) { - D_801C5564 = z; - } else { - D_801C5564 = D_801C5564 + 4; - } - } else { - if (D_801C5564 - z < 5) { - D_801C5564 = z; - } else { - D_801C5564 = D_801C5564 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C553C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018A008[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C552C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C555C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C5560); - uVar5 = (*(int*)&D_801C5564); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018A008); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C5544; - -s32 func_8013E054(void) { - return D_801C5544; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018AA04; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018A9DC; -extern s16 D_8018A9DE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018AA04; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018A9DC = 2; - D_8018A9DE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018A9DE = 0; - D_8018A9DC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C5578; - extern void * D_801C557C; - extern unsigned char D_8018A67C; - extern unsigned char D_8018A694; - extern unsigned char D_8018A708; - extern unsigned char D_8018A710; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C5578 = &D_8018A67C; - D_801C557C = &D_8018A708; - } else { - D_801C5578 = &D_8018A694; - D_801C557C = &D_8018A710; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018AA04/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018AA04 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018AA04)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018A9E0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018A9E0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018A9E0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018A9DC; -extern s16 D_8018A9DE; -extern unsigned char D_8018A9E0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018A9DE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018A9DC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018A9DE; - if (*r < 3) { - *r = *r + 1; - } - D_8018A9DC = (u16)D_8018A9DC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018A9E0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018A9E0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018A9E0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_089/ov_SC03_089_jr_801380E0.c b/src/ov_SC03_089/ov_SC03_089_jr_801380E0.c new file mode 100644 index 000000000..59ffb2644 --- /dev/null +++ b/src/ov_SC03_089/ov_SC03_089_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C426C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801898FC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C5434; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C68B0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C426C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80189638)(); +extern s16 (*D_8018963C)(); +extern M2C_UNK (*D_80189644)(); +extern s32 (*D_80189648)(); +extern s32 D_801C5430; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C4270; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80189990; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018CE74; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801899A8; +extern M2C_UNK D_801899B0; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801899B8; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801899D4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801899E0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801899F4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80189A44[]; +extern s16 D_80189A74[]; +extern s16 D_80189AD4[]; +extern s16 D_80189ADC[]; +extern s16 D_80189AFC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80189B34[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80189B8C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80189BD4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80189BDC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80189BE4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80189BEC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80189B94; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80189BB4; +extern void func_801321B0(int param_1); +extern int D_80189BC4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C54A0; +extern s32 D_801C54A4[]; +extern int D_801C54A8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80189BF8; +extern u8 D_80189BF4; +extern s16 *D_80189BFC; +extern u8 D_80189C00; +extern int D_801C54A0; +extern u16 D_801C54B0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80189BFC; /* holds a pointer value (*(u16**)&D_80189BFC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80189C10[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80189C64; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80189C68[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80189C68[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80189CAC; +extern u8 D_80189CF0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80189CAC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80189CF0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80189D34[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80189D70[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80189D70; + if (((s16)a1) < 0xC00) { + tbl = D_80189D34; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80189DAC, D_80189DAE, D_80189DB0, D_80189DB2, D_80189DB4, D_80189DB6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80189DAE < ang)) goto outer_else; + if (!(ang < D_80189DB4)) goto inner_else; + if (ang < D_80189DB0) { *(s16 *)L = D_80189DB0; goto done; } + if (D_80189DB2 < ang) { *(s16 *)L = D_80189DB2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80189DAC) { *(s16 *)L = D_80189DAC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80189DB6 < ang) { *(s16 *)L = D_80189DB6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C5518; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C5518, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C5518; +extern s8 D_801C551C; +extern s8 D_801C551D; + +void func_8013C9C4(void * arg0) +{ + D_801C5518 = arg0; + D_801C551C = 0; + D_801C551D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C5518; +extern s8 D_801C551C; +extern s8 D_801C551D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C5518; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C551D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C551C)) * 2) + D_801C5518); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C551D = (unsigned char) p[1]; + D_801C551C = D_801C551C + 1; + if (D_801C551D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C551C = 0; + *base = 0; + } + } + else + { + D_801C551D = c - 1; + } + } + return; +} + + + +extern s32 D_801C553C; +extern s32 D_801C5530; +extern s32 D_801C5534; +extern s32 D_801C5540; + +void func_8013CABC(void) { + D_801C553C = 1; + D_801C5530 = 1; + D_801C5534 = 0; + D_801C5540 = 1; +} + + + +extern s32 D_801C5530; +extern s32 D_801C5534; +extern s32 D_801C5538; +extern s32 D_801C553C; +extern s32 D_801C5540; + +void func_8013CAE8(void) { + D_801C5530 = 1; + D_801C553C = 0; + D_801C5534 = 0; + D_801C5538 = -1; + D_801C5540 = 0; +} + + + +extern s32 D_801C553C; +extern s32 D_801C5540; +extern s32 D_801C5568; +extern s32 D_801C556C; + +void func_8013CB20(void) +{ + D_801C5568 = D_801C5540; + D_801C556C = D_801C553C; + D_801C5540 = 1; + D_801C553C = 0; +} + + + +extern s32 D_801C5568; +extern s32 D_801C556C; +extern s32 D_801C5540; +extern s32 D_801C553C; + +void func_8013CB5C(void) { + D_801C5540 = D_801C5568; + D_801C553C = D_801C556C; +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C67C8; + extern u8 D_801C67C9; + extern u8 D_801C67CA; + extern u8 D_801C67CB; + extern u8 D_801C67CC; + extern u8 D_801C67CD; + extern u8 D_801C67CE; + extern u8 D_801C67CF; + extern u8 D_801C67D0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C67C8; t1 = D_801C67C9; t2 = D_801C67CA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C67CB; t1 = D_801C67CC; t2 = D_801C67CD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C67CE; t1 = D_801C67CF; t2 = D_801C67D0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C5548; +extern s32 D_801C5530; +extern s32 D_801C554C; +extern s32 D_801C553C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C5548 != 0) { + if (D_801C5548 != 2) { + if (((D_801C5548 < 3) && (D_801C5548 == 1)) && + (D_801C554C = D_801C554C + 1, 0x23a < D_801C554C)) { + D_801C5530 = D_801C5548; + D_801C5548 = 2; + } + } else { + D_801C5530 = D_801C5530 + -1; + if (D_801C5530 == 0) { + D_801C5530 = D_801C5548; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C553C == 0) { + D_801C5548 = D_801C5548 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C553C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C553C; +} + + + +extern s32 D_801C5548; + +void func_8013D164(void) { + D_801C5548 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C68AA; +extern u8 D_801C691E; +extern u8 D_801C67D2; +extern u8 D_801C688C; +extern u8 D_801C67B0; +extern u8 D_801C67D1; +extern s32 D_801C6890; + +void func_8013D330(void) { + if ((D_801C68AA & 0xff) != D_801C691E) { + D_801C68AA = ((D_801C68AA & 0xff) < D_801C691E) ? (D_801C68AA + 1) : (D_801C68AA - 1); + } + if ((D_801C67D2 & 0xff) != D_801C688C) { + D_801C67D2 = ((D_801C67D2 & 0xff) < D_801C688C) ? (D_801C67D2 + 1) : (D_801C67D2 - 1); + } + if ((D_801C67B0 & 0xff) != D_801C67D1) { + D_801C67B0 = ((D_801C67B0 & 0xff) < D_801C67D1) ? (D_801C67B0 + 1) : (D_801C67B0 - 1); + } + D_801C6890 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C5520; +extern void *D_801C5524; +extern void *D_801C5528; +extern s32 D_801C5550; +extern s32 D_801C5554; +extern s32 D_801C5558; +extern s32 D_801C6804[]; + +extern u8 D_80189EA4[]; +extern u8 D_80189F4C[]; +extern u8 D_80189DFC[]; +extern u8 D_80189EF8[]; +extern u8 D_80189F78[]; +extern u8 D_80189E50[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C5550 = param_2; + D_801C5554 = (param_2 >> 2) & 3; + D_801C5558 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C5520 = D_80189EA4; + D_801C5524 = D_80189F4C; + D_801C5528 = D_80189DFC; + } else { + D_801C5520 = D_80189EF8; + D_801C5524 = D_80189F78; + D_801C5528 = D_80189E50; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C5558 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C5550 & 2) != 0) { + D_801C6804[0] = 0x140; + D_801C6804[3] = 0x80; + if (p[0x37] == 4) { + D_801C6804[0] = 0x140; + D_801C6804[3] = 0; + } + if (p[0x37] == 0) { + D_801C6804[0] = 0x140; + D_801C6804[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C5528)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C5528; +extern s16 *D_801C552C; +extern s32 D_801C553C; +extern s32 D_801C555C; +extern s32 D_801C5560; +extern s32 D_801C5564; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C552C != 0) { + D_801C553C = 0; + p = (int *)(param_1 * 12 + (int)D_801C5528); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C555C != x) { + flag = 1; + if (D_801C555C < x) { + if (x - D_801C555C < 5) { + D_801C555C = x; + } else { + D_801C555C = D_801C555C + 4; + } + } else { + if (D_801C555C - x < 5) { + D_801C555C = x; + } else { + D_801C555C = D_801C555C - 4; + } + } + } + if (D_801C5560 != y) { + flag = 1; + if (D_801C5560 < y) { + if (y - D_801C5560 < 5) { + D_801C5560 = y; + } else { + D_801C5560 = D_801C5560 + 4; + } + } else { + if (D_801C5560 - y < 5) { + D_801C5560 = y; + } else { + D_801C5560 = D_801C5560 - 4; + } + } + } + if (D_801C5564 != z) { + flag = 1; + if (D_801C5564 < z) { + if (z - D_801C5564 < 5) { + D_801C5564 = z; + } else { + D_801C5564 = D_801C5564 + 4; + } + } else { + if (D_801C5564 - z < 5) { + D_801C5564 = z; + } else { + D_801C5564 = D_801C5564 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C553C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018A008[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C552C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C555C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C5560); + uVar5 = (*(int*)&D_801C5564); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018A008); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C5544; + +s32 func_8013E054(void) { + return D_801C5544; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018AA04; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018A9DC; +extern s16 D_8018A9DE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018AA04; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018A9DC = 2; + D_8018A9DE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018A9DE = 0; + D_8018A9DC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C5578; + extern void * D_801C557C; + extern unsigned char D_8018A67C; + extern unsigned char D_8018A694; + extern unsigned char D_8018A708; + extern unsigned char D_8018A710; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C5578 = &D_8018A67C; + D_801C557C = &D_8018A708; + } else { + D_801C5578 = &D_8018A694; + D_801C557C = &D_8018A710; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018AA04/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018AA04 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018AA04)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018A9E0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018A9E0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018A9E0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018A9DC; +extern s16 D_8018A9DE; +extern unsigned char D_8018A9E0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018A9DE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018A9DC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018A9DE; + if (*r < 3) { + *r = *r + 1; + } + D_8018A9DC = (u16)D_8018A9DC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018A9E0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018A9E0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018A9E0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_090/ov_SC03_090_jr_8012ACE0.c b/src/ov_SC03_090/ov_SC03_090_jr_8012ACE0.c index fc345566d..2720bbed7 100644 --- a/src/ov_SC03_090/ov_SC03_090_jr_8012ACE0.c +++ b/src/ov_SC03_090/ov_SC03_090_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018C08C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018C08C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018C0D0; -extern u8 D_8018C114; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018C0D0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018C114 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018C158[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018C194[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018C194; - if (((s16)a1) < 0xC00) { - tbl = D_8018C158; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018C1D0, D_8018C1D2, D_8018C1D4, D_8018C1D6, D_8018C1D8, D_8018C1DA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018C1D2 < ang)) goto outer_else; - if (!(ang < D_8018C1D8)) goto inner_else; - if (ang < D_8018C1D4) { *(s16 *)L = D_8018C1D4; goto done; } - if (D_8018C1D6 < ang) { *(s16 *)L = D_8018C1D6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018C1D0) { *(s16 *)L = D_8018C1D0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018C1DA < ang) { *(s16 *)L = D_8018C1DA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CA980; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CA980, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CA980; -extern s8 D_801CA984; -extern s8 D_801CA985; - -void func_8013C9C4(void * arg0) -{ - D_801CA980 = arg0; - D_801CA984 = 0; - D_801CA985 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CA980; -extern s8 D_801CA984; -extern s8 D_801CA985; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CA980; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CA985; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CA984)) * 2) + D_801CA980); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CA985 = (unsigned char) p[1]; - D_801CA984 = D_801CA984 + 1; - if (D_801CA985 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CA984 = 0; - *base = 0; - } - } - else - { - D_801CA985 = c - 1; - } - } - return; -} - - - -extern s32 D_801CA9A4; -extern s32 D_801CA998; -extern s32 D_801CA99C; -extern s32 D_801CA9A8; - -void func_8013CABC(void) { - D_801CA9A4 = 1; - D_801CA998 = 1; - D_801CA99C = 0; - D_801CA9A8 = 1; -} - - - -extern s32 D_801CA998; -extern s32 D_801CA99C; -extern s32 D_801CA9A0; -extern s32 D_801CA9A4; -extern s32 D_801CA9A8; - -void func_8013CAE8(void) { - D_801CA998 = 1; - D_801CA9A4 = 0; - D_801CA99C = 0; - D_801CA9A0 = -1; - D_801CA9A8 = 0; -} - - - -extern s32 D_801CA9A4; -extern s32 D_801CA9A8; -extern s32 D_801CA9D0; -extern s32 D_801CA9D4; - -void func_8013CB20(void) -{ - D_801CA9D0 = D_801CA9A8; - D_801CA9D4 = D_801CA9A4; - D_801CA9A8 = 1; - D_801CA9A4 = 0; -} - - - -extern s32 D_801CA9D0; -extern s32 D_801CA9D4; -extern s32 D_801CA9A8; -extern s32 D_801CA9A4; - -void func_8013CB5C(void) { - D_801CA9A8 = D_801CA9D0; - D_801CA9A4 = D_801CA9D4; -} - - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801CBC38; - extern u8 D_801CBC39; - extern u8 D_801CBC3A; - extern u8 D_801CBC3B; - extern u8 D_801CBC3C; - extern u8 D_801CBC3D; - extern u8 D_801CBC3E; - extern u8 D_801CBC3F; - extern u8 D_801CBC40; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801CBC38; t1 = D_801CBC39; t2 = D_801CBC3A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801CBC3B; t1 = D_801CBC3C; t2 = D_801CBC3D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801CBC3E; t1 = D_801CBC3F; t2 = D_801CBC40; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CA9B0; -extern s32 D_801CA998; -extern s32 D_801CA9B4; -extern s32 D_801CA9A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CA9B0 != 0) { - if (D_801CA9B0 != 2) { - if (((D_801CA9B0 < 3) && (D_801CA9B0 == 1)) && - (D_801CA9B4 = D_801CA9B4 + 1, 0x23a < D_801CA9B4)) { - D_801CA998 = D_801CA9B0; - D_801CA9B0 = 2; - } - } else { - D_801CA998 = D_801CA998 + -1; - if (D_801CA998 == 0) { - D_801CA998 = D_801CA9B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CA9A4 == 0) { - D_801CA9B0 = D_801CA9B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CA9A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CA9A4; -} - - - -extern s32 D_801CA9B0; - -void func_8013D164(void) { - D_801CA9B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801CBD1A; -extern u8 D_801CBD8E; -extern u8 D_801CBC42; -extern u8 D_801CBCFC; -extern u8 D_801CBC20; -extern u8 D_801CBC41; -extern s32 D_801CBD00; - -void func_8013D330(void) { - if ((D_801CBD1A & 0xff) != D_801CBD8E) { - D_801CBD1A = ((D_801CBD1A & 0xff) < D_801CBD8E) ? (D_801CBD1A + 1) : (D_801CBD1A - 1); - } - if ((D_801CBC42 & 0xff) != D_801CBCFC) { - D_801CBC42 = ((D_801CBC42 & 0xff) < D_801CBCFC) ? (D_801CBC42 + 1) : (D_801CBC42 - 1); - } - if ((D_801CBC20 & 0xff) != D_801CBC41) { - D_801CBC20 = ((D_801CBC20 & 0xff) < D_801CBC41) ? (D_801CBC20 + 1) : (D_801CBC20 - 1); - } - D_801CBD00 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CA988; -extern void *D_801CA98C; -extern void *D_801CA990; -extern s32 D_801CA9B8; -extern s32 D_801CA9BC; -extern s32 D_801CA9C0; -extern s32 D_801CBC74[]; - -extern u8 D_8018C2C8[]; -extern u8 D_8018C370[]; -extern u8 D_8018C220[]; -extern u8 D_8018C31C[]; -extern u8 D_8018C39C[]; -extern u8 D_8018C274[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CA9B8 = param_2; - D_801CA9BC = (param_2 >> 2) & 3; - D_801CA9C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CA988 = D_8018C2C8; - D_801CA98C = D_8018C370; - D_801CA990 = D_8018C220; - } else { - D_801CA988 = D_8018C31C; - D_801CA98C = D_8018C39C; - D_801CA990 = D_8018C274; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CA9C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CA9B8 & 2) != 0) { - D_801CBC74[0] = 0x140; - D_801CBC74[3] = 0x80; - if (p[0x37] == 4) { - D_801CBC74[0] = 0x140; - D_801CBC74[3] = 0; - } - if (p[0x37] == 0) { - D_801CBC74[0] = 0x140; - D_801CBC74[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CA990)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CA990; -extern s16 *D_801CA994; -extern s32 D_801CA9A4; -extern s32 D_801CA9C4; -extern s32 D_801CA9C8; -extern s32 D_801CA9CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CA994 != 0) { - D_801CA9A4 = 0; - p = (int *)(param_1 * 12 + (int)D_801CA990); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CA9C4 != x) { - flag = 1; - if (D_801CA9C4 < x) { - if (x - D_801CA9C4 < 5) { - D_801CA9C4 = x; - } else { - D_801CA9C4 = D_801CA9C4 + 4; - } - } else { - if (D_801CA9C4 - x < 5) { - D_801CA9C4 = x; - } else { - D_801CA9C4 = D_801CA9C4 - 4; - } - } - } - if (D_801CA9C8 != y) { - flag = 1; - if (D_801CA9C8 < y) { - if (y - D_801CA9C8 < 5) { - D_801CA9C8 = y; - } else { - D_801CA9C8 = D_801CA9C8 + 4; - } - } else { - if (D_801CA9C8 - y < 5) { - D_801CA9C8 = y; - } else { - D_801CA9C8 = D_801CA9C8 - 4; - } - } - } - if (D_801CA9CC != z) { - flag = 1; - if (D_801CA9CC < z) { - if (z - D_801CA9CC < 5) { - D_801CA9CC = z; - } else { - D_801CA9CC = D_801CA9CC + 4; - } - } else { - if (D_801CA9CC - z < 5) { - D_801CA9CC = z; - } else { - D_801CA9CC = D_801CA9CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CA9A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018C42C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CA994); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CA9C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CA9C8); - uVar5 = (*(int*)&D_801CA9CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018C42C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CA9AC; - -s32 func_8013E054(void) { - return D_801CA9AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018CE28; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018CE00; -extern s16 D_8018CE02; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018CE28; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018CE00 = 2; - D_8018CE02 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018CE02 = 0; - D_8018CE00 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CA9E0; - extern void * D_801CA9E4; - extern unsigned char D_8018CAA0; - extern unsigned char D_8018CAB8; - extern unsigned char D_8018CB2C; - extern unsigned char D_8018CB34; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CA9E0 = &D_8018CAA0; - D_801CA9E4 = &D_8018CB2C; - } else { - D_801CA9E0 = &D_8018CAB8; - D_801CA9E4 = &D_8018CB34; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018CE28/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018CE28 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018CE28)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018CE04; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018CE04)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018CE04)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018CE00; -extern s16 D_8018CE02; -extern unsigned char D_8018CE04; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018CE02` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018CE00` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018CE02; - if (*r < 3) { - *r = *r + 1; - } - D_8018CE00 = (u16)D_8018CE00 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CE04); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018CE04; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CE04); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_090/ov_SC03_090_jr_801380E0.c b/src/ov_SC03_090/ov_SC03_090_jr_801380E0.c new file mode 100644 index 000000000..6e6b39700 --- /dev/null +++ b/src/ov_SC03_090/ov_SC03_090_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C96D8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018BD20[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CA89C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801CBD20; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C96D8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018BA5C)(); +extern s16 (*D_8018BA60)(); +extern M2C_UNK (*D_8018BA68)(); +extern s32 (*D_8018BA6C)(); +extern s32 D_801CA898; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C96DC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018BDB4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018F298; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018BDCC; +extern M2C_UNK D_8018BDD4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018BDDC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018BDF8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018BE04[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018BE18[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018BE68[]; +extern s16 D_8018BE98[]; +extern s16 D_8018BEF8[]; +extern s16 D_8018BF00[]; +extern s16 D_8018BF20[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018BF58[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018BFB0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018BFF8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018C000[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018C008[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018C010[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018BFB8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018BFD8; +extern void func_801321B0(int param_1); +extern int D_8018BFE8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CA908; +extern s32 D_801CA90C[]; +extern int D_801CA910; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018C01C; +extern u8 D_8018C018; +extern s16 *D_8018C020; +extern u8 D_8018C024; +extern int D_801CA908; +extern u16 D_801CA918; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018C020; /* holds a pointer value (*(u16**)&D_8018C020) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018C034[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018C088; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018C08C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018C08C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018C0D0; +extern u8 D_8018C114; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018C0D0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018C114 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018C158[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018C194[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018C194; + if (((s16)a1) < 0xC00) { + tbl = D_8018C158; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018C1D0, D_8018C1D2, D_8018C1D4, D_8018C1D6, D_8018C1D8, D_8018C1DA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018C1D2 < ang)) goto outer_else; + if (!(ang < D_8018C1D8)) goto inner_else; + if (ang < D_8018C1D4) { *(s16 *)L = D_8018C1D4; goto done; } + if (D_8018C1D6 < ang) { *(s16 *)L = D_8018C1D6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018C1D0) { *(s16 *)L = D_8018C1D0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018C1DA < ang) { *(s16 *)L = D_8018C1DA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CA980; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CA980, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CA980; +extern s8 D_801CA984; +extern s8 D_801CA985; + +void func_8013C9C4(void * arg0) +{ + D_801CA980 = arg0; + D_801CA984 = 0; + D_801CA985 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CA980; +extern s8 D_801CA984; +extern s8 D_801CA985; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CA980; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CA985; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CA984)) * 2) + D_801CA980); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CA985 = (unsigned char) p[1]; + D_801CA984 = D_801CA984 + 1; + if (D_801CA985 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CA984 = 0; + *base = 0; + } + } + else + { + D_801CA985 = c - 1; + } + } + return; +} + + + +extern s32 D_801CA9A4; +extern s32 D_801CA998; +extern s32 D_801CA99C; +extern s32 D_801CA9A8; + +void func_8013CABC(void) { + D_801CA9A4 = 1; + D_801CA998 = 1; + D_801CA99C = 0; + D_801CA9A8 = 1; +} + + + +extern s32 D_801CA998; +extern s32 D_801CA99C; +extern s32 D_801CA9A0; +extern s32 D_801CA9A4; +extern s32 D_801CA9A8; + +void func_8013CAE8(void) { + D_801CA998 = 1; + D_801CA9A4 = 0; + D_801CA99C = 0; + D_801CA9A0 = -1; + D_801CA9A8 = 0; +} + + + +extern s32 D_801CA9A4; +extern s32 D_801CA9A8; +extern s32 D_801CA9D0; +extern s32 D_801CA9D4; + +void func_8013CB20(void) +{ + D_801CA9D0 = D_801CA9A8; + D_801CA9D4 = D_801CA9A4; + D_801CA9A8 = 1; + D_801CA9A4 = 0; +} + + + +extern s32 D_801CA9D0; +extern s32 D_801CA9D4; +extern s32 D_801CA9A8; +extern s32 D_801CA9A4; + +void func_8013CB5C(void) { + D_801CA9A8 = D_801CA9D0; + D_801CA9A4 = D_801CA9D4; +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801CBC38; + extern u8 D_801CBC39; + extern u8 D_801CBC3A; + extern u8 D_801CBC3B; + extern u8 D_801CBC3C; + extern u8 D_801CBC3D; + extern u8 D_801CBC3E; + extern u8 D_801CBC3F; + extern u8 D_801CBC40; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801CBC38; t1 = D_801CBC39; t2 = D_801CBC3A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801CBC3B; t1 = D_801CBC3C; t2 = D_801CBC3D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801CBC3E; t1 = D_801CBC3F; t2 = D_801CBC40; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CA9B0; +extern s32 D_801CA998; +extern s32 D_801CA9B4; +extern s32 D_801CA9A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CA9B0 != 0) { + if (D_801CA9B0 != 2) { + if (((D_801CA9B0 < 3) && (D_801CA9B0 == 1)) && + (D_801CA9B4 = D_801CA9B4 + 1, 0x23a < D_801CA9B4)) { + D_801CA998 = D_801CA9B0; + D_801CA9B0 = 2; + } + } else { + D_801CA998 = D_801CA998 + -1; + if (D_801CA998 == 0) { + D_801CA998 = D_801CA9B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CA9A4 == 0) { + D_801CA9B0 = D_801CA9B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CA9A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CA9A4; +} + + + +extern s32 D_801CA9B0; + +void func_8013D164(void) { + D_801CA9B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801CBD1A; +extern u8 D_801CBD8E; +extern u8 D_801CBC42; +extern u8 D_801CBCFC; +extern u8 D_801CBC20; +extern u8 D_801CBC41; +extern s32 D_801CBD00; + +void func_8013D330(void) { + if ((D_801CBD1A & 0xff) != D_801CBD8E) { + D_801CBD1A = ((D_801CBD1A & 0xff) < D_801CBD8E) ? (D_801CBD1A + 1) : (D_801CBD1A - 1); + } + if ((D_801CBC42 & 0xff) != D_801CBCFC) { + D_801CBC42 = ((D_801CBC42 & 0xff) < D_801CBCFC) ? (D_801CBC42 + 1) : (D_801CBC42 - 1); + } + if ((D_801CBC20 & 0xff) != D_801CBC41) { + D_801CBC20 = ((D_801CBC20 & 0xff) < D_801CBC41) ? (D_801CBC20 + 1) : (D_801CBC20 - 1); + } + D_801CBD00 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CA988; +extern void *D_801CA98C; +extern void *D_801CA990; +extern s32 D_801CA9B8; +extern s32 D_801CA9BC; +extern s32 D_801CA9C0; +extern s32 D_801CBC74[]; + +extern u8 D_8018C2C8[]; +extern u8 D_8018C370[]; +extern u8 D_8018C220[]; +extern u8 D_8018C31C[]; +extern u8 D_8018C39C[]; +extern u8 D_8018C274[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CA9B8 = param_2; + D_801CA9BC = (param_2 >> 2) & 3; + D_801CA9C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CA988 = D_8018C2C8; + D_801CA98C = D_8018C370; + D_801CA990 = D_8018C220; + } else { + D_801CA988 = D_8018C31C; + D_801CA98C = D_8018C39C; + D_801CA990 = D_8018C274; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CA9C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CA9B8 & 2) != 0) { + D_801CBC74[0] = 0x140; + D_801CBC74[3] = 0x80; + if (p[0x37] == 4) { + D_801CBC74[0] = 0x140; + D_801CBC74[3] = 0; + } + if (p[0x37] == 0) { + D_801CBC74[0] = 0x140; + D_801CBC74[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CA990)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CA990; +extern s16 *D_801CA994; +extern s32 D_801CA9A4; +extern s32 D_801CA9C4; +extern s32 D_801CA9C8; +extern s32 D_801CA9CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CA994 != 0) { + D_801CA9A4 = 0; + p = (int *)(param_1 * 12 + (int)D_801CA990); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CA9C4 != x) { + flag = 1; + if (D_801CA9C4 < x) { + if (x - D_801CA9C4 < 5) { + D_801CA9C4 = x; + } else { + D_801CA9C4 = D_801CA9C4 + 4; + } + } else { + if (D_801CA9C4 - x < 5) { + D_801CA9C4 = x; + } else { + D_801CA9C4 = D_801CA9C4 - 4; + } + } + } + if (D_801CA9C8 != y) { + flag = 1; + if (D_801CA9C8 < y) { + if (y - D_801CA9C8 < 5) { + D_801CA9C8 = y; + } else { + D_801CA9C8 = D_801CA9C8 + 4; + } + } else { + if (D_801CA9C8 - y < 5) { + D_801CA9C8 = y; + } else { + D_801CA9C8 = D_801CA9C8 - 4; + } + } + } + if (D_801CA9CC != z) { + flag = 1; + if (D_801CA9CC < z) { + if (z - D_801CA9CC < 5) { + D_801CA9CC = z; + } else { + D_801CA9CC = D_801CA9CC + 4; + } + } else { + if (D_801CA9CC - z < 5) { + D_801CA9CC = z; + } else { + D_801CA9CC = D_801CA9CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CA9A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018C42C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CA994); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CA9C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CA9C8); + uVar5 = (*(int*)&D_801CA9CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018C42C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CA9AC; + +s32 func_8013E054(void) { + return D_801CA9AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018CE28; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018CE00; +extern s16 D_8018CE02; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018CE28; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018CE00 = 2; + D_8018CE02 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018CE02 = 0; + D_8018CE00 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CA9E0; + extern void * D_801CA9E4; + extern unsigned char D_8018CAA0; + extern unsigned char D_8018CAB8; + extern unsigned char D_8018CB2C; + extern unsigned char D_8018CB34; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CA9E0 = &D_8018CAA0; + D_801CA9E4 = &D_8018CB2C; + } else { + D_801CA9E0 = &D_8018CAB8; + D_801CA9E4 = &D_8018CB34; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018CE28/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018CE28 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018CE28)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018CE04; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018CE04)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018CE04)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018CE00; +extern s16 D_8018CE02; +extern unsigned char D_8018CE04; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018CE02` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018CE00` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018CE02; + if (*r < 3) { + *r = *r + 1; + } + D_8018CE00 = (u16)D_8018CE00 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CE04); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018CE04; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018CE04); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_091/ov_SC03_091_jr_8012ACE0.c b/src/ov_SC03_091/ov_SC03_091_jr_8012ACE0.c index c0caad46d..08cfca78b 100644 --- a/src/ov_SC03_091/ov_SC03_091_jr_8012ACE0.c +++ b/src/ov_SC03_091/ov_SC03_091_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018CF34[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018CF34[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018CF78; -extern u8 D_8018CFBC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018CF78; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018CFBC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018D000[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018D03C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018D03C; - if (((s16)a1) < 0xC00) { - tbl = D_8018D000; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018D078, D_8018D07A, D_8018D07C, D_8018D07E, D_8018D080, D_8018D082; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018D07A < ang)) goto outer_else; - if (!(ang < D_8018D080)) goto inner_else; - if (ang < D_8018D07C) { *(s16 *)L = D_8018D07C; goto done; } - if (D_8018D07E < ang) { *(s16 *)L = D_8018D07E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018D078) { *(s16 *)L = D_8018D078; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018D082 < ang) { *(s16 *)L = D_8018D082; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D1050; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D1050, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D1050; -extern s8 D_801D1054; -extern s8 D_801D1055; - -void func_8013C9C4(void * arg0) -{ - D_801D1050 = arg0; - D_801D1054 = 0; - D_801D1055 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D1050; -extern s8 D_801D1054; -extern s8 D_801D1055; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D1050; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D1055; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D1054)) * 2) + D_801D1050); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D1055 = (unsigned char) p[1]; - D_801D1054 = D_801D1054 + 1; - if (D_801D1055 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D1054 = 0; - *base = 0; - } - } - else - { - D_801D1055 = c - 1; - } - } - return; -} - - - -extern s32 D_801D1074; -extern s32 D_801D1068; -extern s32 D_801D106C; -extern s32 D_801D1078; - -void func_8013CABC(void) { - D_801D1074 = 1; - D_801D1068 = 1; - D_801D106C = 0; - D_801D1078 = 1; -} - - - -extern s32 D_801D1068; -extern s32 D_801D106C; -extern s32 D_801D1070; -extern s32 D_801D1074; -extern s32 D_801D1078; - -void func_8013CAE8(void) { - D_801D1068 = 1; - D_801D1074 = 0; - D_801D106C = 0; - D_801D1070 = -1; - D_801D1078 = 0; -} - - - -extern s32 D_801D1074; -extern s32 D_801D1078; -extern s32 D_801D10A0; -extern s32 D_801D10A4; - -void func_8013CB20(void) -{ - D_801D10A0 = D_801D1078; - D_801D10A4 = D_801D1074; - D_801D1078 = 1; - D_801D1074 = 0; -} - - - -extern s32 D_801D10A0; -extern s32 D_801D10A4; -extern s32 D_801D1078; -extern s32 D_801D1074; - -void func_8013CB5C(void) { - D_801D1078 = D_801D10A0; - D_801D1074 = D_801D10A4; -} - - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D2588; - extern u8 D_801D2589; - extern u8 D_801D258A; - extern u8 D_801D258B; - extern u8 D_801D258C; - extern u8 D_801D258D; - extern u8 D_801D258E; - extern u8 D_801D258F; - extern u8 D_801D2590; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D2588; t1 = D_801D2589; t2 = D_801D258A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D258B; t1 = D_801D258C; t2 = D_801D258D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D258E; t1 = D_801D258F; t2 = D_801D2590; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D1080; -extern s32 D_801D1068; -extern s32 D_801D1084; -extern s32 D_801D1074; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D1080 != 0) { - if (D_801D1080 != 2) { - if (((D_801D1080 < 3) && (D_801D1080 == 1)) && - (D_801D1084 = D_801D1084 + 1, 0x23a < D_801D1084)) { - D_801D1068 = D_801D1080; - D_801D1080 = 2; - } - } else { - D_801D1068 = D_801D1068 + -1; - if (D_801D1068 == 0) { - D_801D1068 = D_801D1080; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D1074 == 0) { - D_801D1080 = D_801D1080 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D1074; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D1074; -} - - - -extern s32 D_801D1080; - -void func_8013D164(void) { - D_801D1080 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D266A; -extern u8 D_801D26DE; -extern u8 D_801D2592; -extern u8 D_801D264C; -extern u8 D_801D2570; -extern u8 D_801D2591; -extern s32 D_801D2650; - -void func_8013D330(void) { - if ((D_801D266A & 0xff) != D_801D26DE) { - D_801D266A = ((D_801D266A & 0xff) < D_801D26DE) ? (D_801D266A + 1) : (D_801D266A - 1); - } - if ((D_801D2592 & 0xff) != D_801D264C) { - D_801D2592 = ((D_801D2592 & 0xff) < D_801D264C) ? (D_801D2592 + 1) : (D_801D2592 - 1); - } - if ((D_801D2570 & 0xff) != D_801D2591) { - D_801D2570 = ((D_801D2570 & 0xff) < D_801D2591) ? (D_801D2570 + 1) : (D_801D2570 - 1); - } - D_801D2650 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D1058; -extern void *D_801D105C; -extern void *D_801D1060; -extern s32 D_801D1088; -extern s32 D_801D108C; -extern s32 D_801D1090; -extern s32 D_801D25C4[]; - -extern u8 D_8018D170[]; -extern u8 D_8018D218[]; -extern u8 D_8018D0C8[]; -extern u8 D_8018D1C4[]; -extern u8 D_8018D244[]; -extern u8 D_8018D11C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D1088 = param_2; - D_801D108C = (param_2 >> 2) & 3; - D_801D1090 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D1058 = D_8018D170; - D_801D105C = D_8018D218; - D_801D1060 = D_8018D0C8; - } else { - D_801D1058 = D_8018D1C4; - D_801D105C = D_8018D244; - D_801D1060 = D_8018D11C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D1090 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D1088 & 2) != 0) { - D_801D25C4[0] = 0x140; - D_801D25C4[3] = 0x80; - if (p[0x37] == 4) { - D_801D25C4[0] = 0x140; - D_801D25C4[3] = 0; - } - if (p[0x37] == 0) { - D_801D25C4[0] = 0x140; - D_801D25C4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D1060)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D1060; -extern s16 *D_801D1064; -extern s32 D_801D1074; -extern s32 D_801D1094; -extern s32 D_801D1098; -extern s32 D_801D109C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D1064 != 0) { - D_801D1074 = 0; - p = (int *)(param_1 * 12 + (int)D_801D1060); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D1094 != x) { - flag = 1; - if (D_801D1094 < x) { - if (x - D_801D1094 < 5) { - D_801D1094 = x; - } else { - D_801D1094 = D_801D1094 + 4; - } - } else { - if (D_801D1094 - x < 5) { - D_801D1094 = x; - } else { - D_801D1094 = D_801D1094 - 4; - } - } - } - if (D_801D1098 != y) { - flag = 1; - if (D_801D1098 < y) { - if (y - D_801D1098 < 5) { - D_801D1098 = y; - } else { - D_801D1098 = D_801D1098 + 4; - } - } else { - if (D_801D1098 - y < 5) { - D_801D1098 = y; - } else { - D_801D1098 = D_801D1098 - 4; - } - } - } - if (D_801D109C != z) { - flag = 1; - if (D_801D109C < z) { - if (z - D_801D109C < 5) { - D_801D109C = z; - } else { - D_801D109C = D_801D109C + 4; - } - } else { - if (D_801D109C - z < 5) { - D_801D109C = z; - } else { - D_801D109C = D_801D109C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D1074 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018D2D4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D1064); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D1094); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D1098); - uVar5 = (*(int*)&D_801D109C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018D2D4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D107C; - -s32 func_8013E054(void) { - return D_801D107C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018DCD0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018DCA8; -extern s16 D_8018DCAA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018DCD0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018DCA8 = 2; - D_8018DCAA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018DCAA = 0; - D_8018DCA8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D10B0; - extern void * D_801D10B4; - extern unsigned char D_8018D948; - extern unsigned char D_8018D960; - extern unsigned char D_8018D9D4; - extern unsigned char D_8018D9DC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D10B0 = &D_8018D948; - D_801D10B4 = &D_8018D9D4; - } else { - D_801D10B0 = &D_8018D960; - D_801D10B4 = &D_8018D9DC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018DCD0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018DCD0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018DCD0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018DCAC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018DCAC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018DCAC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018DCA8; -extern s16 D_8018DCAA; -extern unsigned char D_8018DCAC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018DCAA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018DCA8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018DCAA; - if (*r < 3) { - *r = *r + 1; - } - D_8018DCA8 = (u16)D_8018DCA8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018DCAC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018DCAC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018DCAC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_091/ov_SC03_091_jr_801380E0.c b/src/ov_SC03_091/ov_SC03_091_jr_801380E0.c new file mode 100644 index 000000000..12e59332f --- /dev/null +++ b/src/ov_SC03_091/ov_SC03_091_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CFDA4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018CBC8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D0F6C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D2670; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CFDA4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018C904)(); +extern s16 (*D_8018C908)(); +extern M2C_UNK (*D_8018C910)(); +extern s32 (*D_8018C914)(); +extern s32 D_801D0F68; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CFDA8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018CC5C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80190140; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018CC74; +extern M2C_UNK D_8018CC7C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018CC84; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018CCA0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018CCAC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018CCC0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018CD10[]; +extern s16 D_8018CD40[]; +extern s16 D_8018CDA0[]; +extern s16 D_8018CDA8[]; +extern s16 D_8018CDC8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018CE00[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018CE58[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018CEA0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018CEA8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018CEB0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018CEB8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018CE60; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018CE80; +extern void func_801321B0(int param_1); +extern int D_8018CE90; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D0FD8; +extern s32 D_801D0FDC[]; +extern int D_801D0FE0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018CEC4; +extern u8 D_8018CEC0; +extern s16 *D_8018CEC8; +extern u8 D_8018CECC; +extern int D_801D0FD8; +extern u16 D_801D0FE8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018CEC8; /* holds a pointer value (*(u16**)&D_8018CEC8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018CEDC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018CF30; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018CF34[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018CF34[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018CF78; +extern u8 D_8018CFBC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018CF78; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018CFBC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018D000[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018D03C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018D03C; + if (((s16)a1) < 0xC00) { + tbl = D_8018D000; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018D078, D_8018D07A, D_8018D07C, D_8018D07E, D_8018D080, D_8018D082; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D07A < ang)) goto outer_else; + if (!(ang < D_8018D080)) goto inner_else; + if (ang < D_8018D07C) { *(s16 *)L = D_8018D07C; goto done; } + if (D_8018D07E < ang) { *(s16 *)L = D_8018D07E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D078) { *(s16 *)L = D_8018D078; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D082 < ang) { *(s16 *)L = D_8018D082; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D1050; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D1050, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D1050; +extern s8 D_801D1054; +extern s8 D_801D1055; + +void func_8013C9C4(void * arg0) +{ + D_801D1050 = arg0; + D_801D1054 = 0; + D_801D1055 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D1050; +extern s8 D_801D1054; +extern s8 D_801D1055; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D1050; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D1055; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D1054)) * 2) + D_801D1050); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D1055 = (unsigned char) p[1]; + D_801D1054 = D_801D1054 + 1; + if (D_801D1055 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D1054 = 0; + *base = 0; + } + } + else + { + D_801D1055 = c - 1; + } + } + return; +} + + + +extern s32 D_801D1074; +extern s32 D_801D1068; +extern s32 D_801D106C; +extern s32 D_801D1078; + +void func_8013CABC(void) { + D_801D1074 = 1; + D_801D1068 = 1; + D_801D106C = 0; + D_801D1078 = 1; +} + + + +extern s32 D_801D1068; +extern s32 D_801D106C; +extern s32 D_801D1070; +extern s32 D_801D1074; +extern s32 D_801D1078; + +void func_8013CAE8(void) { + D_801D1068 = 1; + D_801D1074 = 0; + D_801D106C = 0; + D_801D1070 = -1; + D_801D1078 = 0; +} + + + +extern s32 D_801D1074; +extern s32 D_801D1078; +extern s32 D_801D10A0; +extern s32 D_801D10A4; + +void func_8013CB20(void) +{ + D_801D10A0 = D_801D1078; + D_801D10A4 = D_801D1074; + D_801D1078 = 1; + D_801D1074 = 0; +} + + + +extern s32 D_801D10A0; +extern s32 D_801D10A4; +extern s32 D_801D1078; +extern s32 D_801D1074; + +void func_8013CB5C(void) { + D_801D1078 = D_801D10A0; + D_801D1074 = D_801D10A4; +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D2588; + extern u8 D_801D2589; + extern u8 D_801D258A; + extern u8 D_801D258B; + extern u8 D_801D258C; + extern u8 D_801D258D; + extern u8 D_801D258E; + extern u8 D_801D258F; + extern u8 D_801D2590; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D2588; t1 = D_801D2589; t2 = D_801D258A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D258B; t1 = D_801D258C; t2 = D_801D258D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D258E; t1 = D_801D258F; t2 = D_801D2590; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D1080; +extern s32 D_801D1068; +extern s32 D_801D1084; +extern s32 D_801D1074; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D1080 != 0) { + if (D_801D1080 != 2) { + if (((D_801D1080 < 3) && (D_801D1080 == 1)) && + (D_801D1084 = D_801D1084 + 1, 0x23a < D_801D1084)) { + D_801D1068 = D_801D1080; + D_801D1080 = 2; + } + } else { + D_801D1068 = D_801D1068 + -1; + if (D_801D1068 == 0) { + D_801D1068 = D_801D1080; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D1074 == 0) { + D_801D1080 = D_801D1080 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D1074; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D1074; +} + + + +extern s32 D_801D1080; + +void func_8013D164(void) { + D_801D1080 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D266A; +extern u8 D_801D26DE; +extern u8 D_801D2592; +extern u8 D_801D264C; +extern u8 D_801D2570; +extern u8 D_801D2591; +extern s32 D_801D2650; + +void func_8013D330(void) { + if ((D_801D266A & 0xff) != D_801D26DE) { + D_801D266A = ((D_801D266A & 0xff) < D_801D26DE) ? (D_801D266A + 1) : (D_801D266A - 1); + } + if ((D_801D2592 & 0xff) != D_801D264C) { + D_801D2592 = ((D_801D2592 & 0xff) < D_801D264C) ? (D_801D2592 + 1) : (D_801D2592 - 1); + } + if ((D_801D2570 & 0xff) != D_801D2591) { + D_801D2570 = ((D_801D2570 & 0xff) < D_801D2591) ? (D_801D2570 + 1) : (D_801D2570 - 1); + } + D_801D2650 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D1058; +extern void *D_801D105C; +extern void *D_801D1060; +extern s32 D_801D1088; +extern s32 D_801D108C; +extern s32 D_801D1090; +extern s32 D_801D25C4[]; + +extern u8 D_8018D170[]; +extern u8 D_8018D218[]; +extern u8 D_8018D0C8[]; +extern u8 D_8018D1C4[]; +extern u8 D_8018D244[]; +extern u8 D_8018D11C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D1088 = param_2; + D_801D108C = (param_2 >> 2) & 3; + D_801D1090 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D1058 = D_8018D170; + D_801D105C = D_8018D218; + D_801D1060 = D_8018D0C8; + } else { + D_801D1058 = D_8018D1C4; + D_801D105C = D_8018D244; + D_801D1060 = D_8018D11C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D1090 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D1088 & 2) != 0) { + D_801D25C4[0] = 0x140; + D_801D25C4[3] = 0x80; + if (p[0x37] == 4) { + D_801D25C4[0] = 0x140; + D_801D25C4[3] = 0; + } + if (p[0x37] == 0) { + D_801D25C4[0] = 0x140; + D_801D25C4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D1060)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D1060; +extern s16 *D_801D1064; +extern s32 D_801D1074; +extern s32 D_801D1094; +extern s32 D_801D1098; +extern s32 D_801D109C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D1064 != 0) { + D_801D1074 = 0; + p = (int *)(param_1 * 12 + (int)D_801D1060); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D1094 != x) { + flag = 1; + if (D_801D1094 < x) { + if (x - D_801D1094 < 5) { + D_801D1094 = x; + } else { + D_801D1094 = D_801D1094 + 4; + } + } else { + if (D_801D1094 - x < 5) { + D_801D1094 = x; + } else { + D_801D1094 = D_801D1094 - 4; + } + } + } + if (D_801D1098 != y) { + flag = 1; + if (D_801D1098 < y) { + if (y - D_801D1098 < 5) { + D_801D1098 = y; + } else { + D_801D1098 = D_801D1098 + 4; + } + } else { + if (D_801D1098 - y < 5) { + D_801D1098 = y; + } else { + D_801D1098 = D_801D1098 - 4; + } + } + } + if (D_801D109C != z) { + flag = 1; + if (D_801D109C < z) { + if (z - D_801D109C < 5) { + D_801D109C = z; + } else { + D_801D109C = D_801D109C + 4; + } + } else { + if (D_801D109C - z < 5) { + D_801D109C = z; + } else { + D_801D109C = D_801D109C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D1074 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018D2D4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D1064); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D1094); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D1098); + uVar5 = (*(int*)&D_801D109C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018D2D4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D107C; + +s32 func_8013E054(void) { + return D_801D107C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018DCD0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018DCA8; +extern s16 D_8018DCAA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018DCD0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018DCA8 = 2; + D_8018DCAA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018DCAA = 0; + D_8018DCA8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D10B0; + extern void * D_801D10B4; + extern unsigned char D_8018D948; + extern unsigned char D_8018D960; + extern unsigned char D_8018D9D4; + extern unsigned char D_8018D9DC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D10B0 = &D_8018D948; + D_801D10B4 = &D_8018D9D4; + } else { + D_801D10B0 = &D_8018D960; + D_801D10B4 = &D_8018D9DC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018DCD0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018DCD0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018DCD0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018DCAC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018DCAC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018DCAC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018DCA8; +extern s16 D_8018DCAA; +extern unsigned char D_8018DCAC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018DCAA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018DCA8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018DCAA; + if (*r < 3) { + *r = *r + 1; + } + D_8018DCA8 = (u16)D_8018DCA8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018DCAC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018DCAC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018DCAC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_092/ov_SC03_092_jr_8012ACE0.c b/src/ov_SC03_092/ov_SC03_092_jr_8012ACE0.c index 7ac6ebc7f..1bf5fba70 100644 --- a/src/ov_SC03_092/ov_SC03_092_jr_8012ACE0.c +++ b/src/ov_SC03_092/ov_SC03_092_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185304[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185304[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80185348; -extern u8 D_8018538C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80185348; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018538C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801853D0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018540C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018540C; - if (((s16)a1) < 0xC00) { - tbl = D_801853D0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185448, D_8018544A, D_8018544C, D_8018544E, D_80185450, D_80185452; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018544A < ang)) goto outer_else; - if (!(ang < D_80185450)) goto inner_else; - if (ang < D_8018544C) { *(s16 *)L = D_8018544C; goto done; } - if (D_8018544E < ang) { *(s16 *)L = D_8018544E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185448) { *(s16 *)L = D_80185448; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80185452 < ang) { *(s16 *)L = D_80185452; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B1C18; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B1C18, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B1C18; -extern s8 D_801B1C1C; -extern s8 D_801B1C1D; - -void func_8013C9C4(void * arg0) -{ - D_801B1C18 = arg0; - D_801B1C1C = 0; - D_801B1C1D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B1C18; -extern s8 D_801B1C1C; -extern s8 D_801B1C1D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B1C18; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B1C1D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B1C1C)) * 2) + D_801B1C18); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B1C1D = (unsigned char) p[1]; - D_801B1C1C = D_801B1C1C + 1; - if (D_801B1C1D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B1C1C = 0; - *base = 0; - } - } - else - { - D_801B1C1D = c - 1; - } - } - return; -} - - - -extern s32 D_801B1C3C; -extern s32 D_801B1C30; -extern s32 D_801B1C34; -extern s32 D_801B1C40; - -void func_8013CABC(void) { - D_801B1C3C = 1; - D_801B1C30 = 1; - D_801B1C34 = 0; - D_801B1C40 = 1; -} - - - -extern s32 D_801B1C30; -extern s32 D_801B1C34; -extern s32 D_801B1C38; -extern s32 D_801B1C3C; -extern s32 D_801B1C40; - -void func_8013CAE8(void) { - D_801B1C30 = 1; - D_801B1C3C = 0; - D_801B1C34 = 0; - D_801B1C38 = -1; - D_801B1C40 = 0; -} - - - -extern s32 D_801B1C3C; -extern s32 D_801B1C40; -extern s32 D_801B1C68; -extern s32 D_801B1C6C; - -void func_8013CB20(void) -{ - D_801B1C68 = D_801B1C40; - D_801B1C6C = D_801B1C3C; - D_801B1C40 = 1; - D_801B1C3C = 0; -} - - - -extern s32 D_801B1C68; -extern s32 D_801B1C6C; -extern s32 D_801B1C40; -extern s32 D_801B1C3C; - -void func_8013CB5C(void) { - D_801B1C40 = D_801B1C68; - D_801B1C3C = D_801B1C6C; -} - - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B2F30; - extern u8 D_801B2F31; - extern u8 D_801B2F32; - extern u8 D_801B2F33; - extern u8 D_801B2F34; - extern u8 D_801B2F35; - extern u8 D_801B2F36; - extern u8 D_801B2F37; - extern u8 D_801B2F38; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B2F30; t1 = D_801B2F31; t2 = D_801B2F32; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B2F33; t1 = D_801B2F34; t2 = D_801B2F35; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B2F36; t1 = D_801B2F37; t2 = D_801B2F38; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B1C48; -extern s32 D_801B1C30; -extern s32 D_801B1C4C; -extern s32 D_801B1C3C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B1C48 != 0) { - if (D_801B1C48 != 2) { - if (((D_801B1C48 < 3) && (D_801B1C48 == 1)) && - (D_801B1C4C = D_801B1C4C + 1, 0x23a < D_801B1C4C)) { - D_801B1C30 = D_801B1C48; - D_801B1C48 = 2; - } - } else { - D_801B1C30 = D_801B1C30 + -1; - if (D_801B1C30 == 0) { - D_801B1C30 = D_801B1C48; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B1C3C == 0) { - D_801B1C48 = D_801B1C48 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B1C3C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B1C3C; -} - - - -extern s32 D_801B1C48; - -void func_8013D164(void) { - D_801B1C48 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B3012; -extern u8 D_801B3086; -extern u8 D_801B2F3A; -extern u8 D_801B2FF4; -extern u8 D_801B2F18; -extern u8 D_801B2F39; -extern s32 D_801B2FF8; - -void func_8013D330(void) { - if ((D_801B3012 & 0xff) != D_801B3086) { - D_801B3012 = ((D_801B3012 & 0xff) < D_801B3086) ? (D_801B3012 + 1) : (D_801B3012 - 1); - } - if ((D_801B2F3A & 0xff) != D_801B2FF4) { - D_801B2F3A = ((D_801B2F3A & 0xff) < D_801B2FF4) ? (D_801B2F3A + 1) : (D_801B2F3A - 1); - } - if ((D_801B2F18 & 0xff) != D_801B2F39) { - D_801B2F18 = ((D_801B2F18 & 0xff) < D_801B2F39) ? (D_801B2F18 + 1) : (D_801B2F18 - 1); - } - D_801B2FF8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B1C20; -extern void *D_801B1C24; -extern void *D_801B1C28; -extern s32 D_801B1C50; -extern s32 D_801B1C54; -extern s32 D_801B1C58; -extern s32 D_801B2F6C[]; - -extern u8 D_80185540[]; -extern u8 D_801855E8[]; -extern u8 D_80185498[]; -extern u8 D_80185594[]; -extern u8 D_80185614[]; -extern u8 D_801854EC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B1C50 = param_2; - D_801B1C54 = (param_2 >> 2) & 3; - D_801B1C58 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B1C20 = D_80185540; - D_801B1C24 = D_801855E8; - D_801B1C28 = D_80185498; - } else { - D_801B1C20 = D_80185594; - D_801B1C24 = D_80185614; - D_801B1C28 = D_801854EC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B1C58 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B1C50 & 2) != 0) { - D_801B2F6C[0] = 0x140; - D_801B2F6C[3] = 0x80; - if (p[0x37] == 4) { - D_801B2F6C[0] = 0x140; - D_801B2F6C[3] = 0; - } - if (p[0x37] == 0) { - D_801B2F6C[0] = 0x140; - D_801B2F6C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B1C28)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B1C28; -extern s16 *D_801B1C2C; -extern s32 D_801B1C3C; -extern s32 D_801B1C5C; -extern s32 D_801B1C60; -extern s32 D_801B1C64; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B1C2C != 0) { - D_801B1C3C = 0; - p = (int *)(param_1 * 12 + (int)D_801B1C28); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B1C5C != x) { - flag = 1; - if (D_801B1C5C < x) { - if (x - D_801B1C5C < 5) { - D_801B1C5C = x; - } else { - D_801B1C5C = D_801B1C5C + 4; - } - } else { - if (D_801B1C5C - x < 5) { - D_801B1C5C = x; - } else { - D_801B1C5C = D_801B1C5C - 4; - } - } - } - if (D_801B1C60 != y) { - flag = 1; - if (D_801B1C60 < y) { - if (y - D_801B1C60 < 5) { - D_801B1C60 = y; - } else { - D_801B1C60 = D_801B1C60 + 4; - } - } else { - if (D_801B1C60 - y < 5) { - D_801B1C60 = y; - } else { - D_801B1C60 = D_801B1C60 - 4; - } - } - } - if (D_801B1C64 != z) { - flag = 1; - if (D_801B1C64 < z) { - if (z - D_801B1C64 < 5) { - D_801B1C64 = z; - } else { - D_801B1C64 = D_801B1C64 + 4; - } - } else { - if (D_801B1C64 - z < 5) { - D_801B1C64 = z; - } else { - D_801B1C64 = D_801B1C64 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B1C3C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801856A4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B1C2C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B1C5C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B1C60); - uVar5 = (*(int*)&D_801B1C64); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801856A4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B1C44; - -s32 func_8013E054(void) { - return D_801B1C44; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801860A0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186078; -extern s16 D_8018607A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801860A0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186078 = 2; - D_8018607A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018607A = 0; - D_80186078 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B1C78; - extern void * D_801B1C7C; - extern unsigned char D_80185D18; - extern unsigned char D_80185D30; - extern unsigned char D_80185DA4; - extern unsigned char D_80185DAC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B1C78 = &D_80185D18; - D_801B1C7C = &D_80185DA4; - } else { - D_801B1C78 = &D_80185D30; - D_801B1C7C = &D_80185DAC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801860A0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801860A0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801860A0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018607C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018607C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018607C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186078; -extern s16 D_8018607A; -extern unsigned char D_8018607C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018607A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186078` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018607A; - if (*r < 3) { - *r = *r + 1; - } - D_80186078 = (u16)D_80186078 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018607C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018607C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018607C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_092/ov_SC03_092_jr_801380E0.c b/src/ov_SC03_092/ov_SC03_092_jr_801380E0.c new file mode 100644 index 000000000..1c81fabd8 --- /dev/null +++ b/src/ov_SC03_092/ov_SC03_092_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B097C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184F98[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B1B34; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B3018; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B097C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184CD4)(); +extern s16 (*D_80184CD8)(); +extern M2C_UNK (*D_80184CE0)(); +extern s32 (*D_80184CE4)(); +extern s32 D_801B1B30; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B0980; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018502C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80188510; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185044; +extern M2C_UNK D_8018504C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185054; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185070[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018507C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185090[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801850E0[]; +extern s16 D_80185110[]; +extern s16 D_80185170[]; +extern s16 D_80185178[]; +extern s16 D_80185198[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801851D0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185228[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185270[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185278[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185280[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185288[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80185230; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80185250; +extern void func_801321B0(int param_1); +extern int D_80185260; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B1BA0; +extern s32 D_801B1BA4[]; +extern int D_801B1BA8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185294; +extern u8 D_80185290; +extern s16 *D_80185298; +extern u8 D_8018529C; +extern int D_801B1BA0; +extern u16 D_801B1BB0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185298; /* holds a pointer value (*(u16**)&D_80185298) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801852AC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185300; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185304[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185304[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80185348; +extern u8 D_8018538C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80185348; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018538C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801853D0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018540C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018540C; + if (((s16)a1) < 0xC00) { + tbl = D_801853D0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185448, D_8018544A, D_8018544C, D_8018544E, D_80185450, D_80185452; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018544A < ang)) goto outer_else; + if (!(ang < D_80185450)) goto inner_else; + if (ang < D_8018544C) { *(s16 *)L = D_8018544C; goto done; } + if (D_8018544E < ang) { *(s16 *)L = D_8018544E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185448) { *(s16 *)L = D_80185448; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185452 < ang) { *(s16 *)L = D_80185452; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B1C18; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B1C18, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B1C18; +extern s8 D_801B1C1C; +extern s8 D_801B1C1D; + +void func_8013C9C4(void * arg0) +{ + D_801B1C18 = arg0; + D_801B1C1C = 0; + D_801B1C1D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B1C18; +extern s8 D_801B1C1C; +extern s8 D_801B1C1D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B1C18; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B1C1D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B1C1C)) * 2) + D_801B1C18); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B1C1D = (unsigned char) p[1]; + D_801B1C1C = D_801B1C1C + 1; + if (D_801B1C1D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B1C1C = 0; + *base = 0; + } + } + else + { + D_801B1C1D = c - 1; + } + } + return; +} + + + +extern s32 D_801B1C3C; +extern s32 D_801B1C30; +extern s32 D_801B1C34; +extern s32 D_801B1C40; + +void func_8013CABC(void) { + D_801B1C3C = 1; + D_801B1C30 = 1; + D_801B1C34 = 0; + D_801B1C40 = 1; +} + + + +extern s32 D_801B1C30; +extern s32 D_801B1C34; +extern s32 D_801B1C38; +extern s32 D_801B1C3C; +extern s32 D_801B1C40; + +void func_8013CAE8(void) { + D_801B1C30 = 1; + D_801B1C3C = 0; + D_801B1C34 = 0; + D_801B1C38 = -1; + D_801B1C40 = 0; +} + + + +extern s32 D_801B1C3C; +extern s32 D_801B1C40; +extern s32 D_801B1C68; +extern s32 D_801B1C6C; + +void func_8013CB20(void) +{ + D_801B1C68 = D_801B1C40; + D_801B1C6C = D_801B1C3C; + D_801B1C40 = 1; + D_801B1C3C = 0; +} + + + +extern s32 D_801B1C68; +extern s32 D_801B1C6C; +extern s32 D_801B1C40; +extern s32 D_801B1C3C; + +void func_8013CB5C(void) { + D_801B1C40 = D_801B1C68; + D_801B1C3C = D_801B1C6C; +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B2F30; + extern u8 D_801B2F31; + extern u8 D_801B2F32; + extern u8 D_801B2F33; + extern u8 D_801B2F34; + extern u8 D_801B2F35; + extern u8 D_801B2F36; + extern u8 D_801B2F37; + extern u8 D_801B2F38; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B2F30; t1 = D_801B2F31; t2 = D_801B2F32; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B2F33; t1 = D_801B2F34; t2 = D_801B2F35; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B2F36; t1 = D_801B2F37; t2 = D_801B2F38; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B1C48; +extern s32 D_801B1C30; +extern s32 D_801B1C4C; +extern s32 D_801B1C3C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B1C48 != 0) { + if (D_801B1C48 != 2) { + if (((D_801B1C48 < 3) && (D_801B1C48 == 1)) && + (D_801B1C4C = D_801B1C4C + 1, 0x23a < D_801B1C4C)) { + D_801B1C30 = D_801B1C48; + D_801B1C48 = 2; + } + } else { + D_801B1C30 = D_801B1C30 + -1; + if (D_801B1C30 == 0) { + D_801B1C30 = D_801B1C48; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B1C3C == 0) { + D_801B1C48 = D_801B1C48 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B1C3C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B1C3C; +} + + + +extern s32 D_801B1C48; + +void func_8013D164(void) { + D_801B1C48 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B3012; +extern u8 D_801B3086; +extern u8 D_801B2F3A; +extern u8 D_801B2FF4; +extern u8 D_801B2F18; +extern u8 D_801B2F39; +extern s32 D_801B2FF8; + +void func_8013D330(void) { + if ((D_801B3012 & 0xff) != D_801B3086) { + D_801B3012 = ((D_801B3012 & 0xff) < D_801B3086) ? (D_801B3012 + 1) : (D_801B3012 - 1); + } + if ((D_801B2F3A & 0xff) != D_801B2FF4) { + D_801B2F3A = ((D_801B2F3A & 0xff) < D_801B2FF4) ? (D_801B2F3A + 1) : (D_801B2F3A - 1); + } + if ((D_801B2F18 & 0xff) != D_801B2F39) { + D_801B2F18 = ((D_801B2F18 & 0xff) < D_801B2F39) ? (D_801B2F18 + 1) : (D_801B2F18 - 1); + } + D_801B2FF8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B1C20; +extern void *D_801B1C24; +extern void *D_801B1C28; +extern s32 D_801B1C50; +extern s32 D_801B1C54; +extern s32 D_801B1C58; +extern s32 D_801B2F6C[]; + +extern u8 D_80185540[]; +extern u8 D_801855E8[]; +extern u8 D_80185498[]; +extern u8 D_80185594[]; +extern u8 D_80185614[]; +extern u8 D_801854EC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B1C50 = param_2; + D_801B1C54 = (param_2 >> 2) & 3; + D_801B1C58 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B1C20 = D_80185540; + D_801B1C24 = D_801855E8; + D_801B1C28 = D_80185498; + } else { + D_801B1C20 = D_80185594; + D_801B1C24 = D_80185614; + D_801B1C28 = D_801854EC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B1C58 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B1C50 & 2) != 0) { + D_801B2F6C[0] = 0x140; + D_801B2F6C[3] = 0x80; + if (p[0x37] == 4) { + D_801B2F6C[0] = 0x140; + D_801B2F6C[3] = 0; + } + if (p[0x37] == 0) { + D_801B2F6C[0] = 0x140; + D_801B2F6C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B1C28)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B1C28; +extern s16 *D_801B1C2C; +extern s32 D_801B1C3C; +extern s32 D_801B1C5C; +extern s32 D_801B1C60; +extern s32 D_801B1C64; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B1C2C != 0) { + D_801B1C3C = 0; + p = (int *)(param_1 * 12 + (int)D_801B1C28); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B1C5C != x) { + flag = 1; + if (D_801B1C5C < x) { + if (x - D_801B1C5C < 5) { + D_801B1C5C = x; + } else { + D_801B1C5C = D_801B1C5C + 4; + } + } else { + if (D_801B1C5C - x < 5) { + D_801B1C5C = x; + } else { + D_801B1C5C = D_801B1C5C - 4; + } + } + } + if (D_801B1C60 != y) { + flag = 1; + if (D_801B1C60 < y) { + if (y - D_801B1C60 < 5) { + D_801B1C60 = y; + } else { + D_801B1C60 = D_801B1C60 + 4; + } + } else { + if (D_801B1C60 - y < 5) { + D_801B1C60 = y; + } else { + D_801B1C60 = D_801B1C60 - 4; + } + } + } + if (D_801B1C64 != z) { + flag = 1; + if (D_801B1C64 < z) { + if (z - D_801B1C64 < 5) { + D_801B1C64 = z; + } else { + D_801B1C64 = D_801B1C64 + 4; + } + } else { + if (D_801B1C64 - z < 5) { + D_801B1C64 = z; + } else { + D_801B1C64 = D_801B1C64 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B1C3C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801856A4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B1C2C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B1C5C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B1C60); + uVar5 = (*(int*)&D_801B1C64); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801856A4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B1C44; + +s32 func_8013E054(void) { + return D_801B1C44; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801860A0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186078; +extern s16 D_8018607A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801860A0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186078 = 2; + D_8018607A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018607A = 0; + D_80186078 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B1C78; + extern void * D_801B1C7C; + extern unsigned char D_80185D18; + extern unsigned char D_80185D30; + extern unsigned char D_80185DA4; + extern unsigned char D_80185DAC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B1C78 = &D_80185D18; + D_801B1C7C = &D_80185DA4; + } else { + D_801B1C78 = &D_80185D30; + D_801B1C7C = &D_80185DAC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801860A0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801860A0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801860A0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018607C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018607C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018607C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186078; +extern s16 D_8018607A; +extern unsigned char D_8018607C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018607A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186078` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018607A; + if (*r < 3) { + *r = *r + 1; + } + D_80186078 = (u16)D_80186078 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018607C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018607C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018607C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_093/ov_SC03_093_jr_8012ACE0.c b/src/ov_SC03_093/ov_SC03_093_jr_8012ACE0.c index 787c2502d..347964dbc 100644 --- a/src/ov_SC03_093/ov_SC03_093_jr_8012ACE0.c +++ b/src/ov_SC03_093/ov_SC03_093_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801864DC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801864DC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80186520; -extern u8 D_80186564; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80186520; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80186564 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801865A8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801865E4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801865E4; - if (((s16)a1) < 0xC00) { - tbl = D_801865A8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80186620, D_80186622, D_80186624, D_80186626, D_80186628, D_8018662A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80186622 < ang)) goto outer_else; - if (!(ang < D_80186628)) goto inner_else; - if (ang < D_80186624) { *(s16 *)L = D_80186624; goto done; } - if (D_80186626 < ang) { *(s16 *)L = D_80186626; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80186620) { *(s16 *)L = D_80186620; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018662A < ang) { *(s16 *)L = D_8018662A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CB088; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CB088, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CB088; -extern s8 D_801CB08C; -extern s8 D_801CB08D; - -void func_8013C9C4(void * arg0) -{ - D_801CB088 = arg0; - D_801CB08C = 0; - D_801CB08D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CB088; -extern s8 D_801CB08C; -extern s8 D_801CB08D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CB088; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CB08D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CB08C)) * 2) + D_801CB088); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CB08D = (unsigned char) p[1]; - D_801CB08C = D_801CB08C + 1; - if (D_801CB08D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CB08C = 0; - *base = 0; - } - } - else - { - D_801CB08D = c - 1; - } - } - return; -} - - - -extern s32 D_801CB0AC; -extern s32 D_801CB0A0; -extern s32 D_801CB0A4; -extern s32 D_801CB0B0; - -void func_8013CABC(void) { - D_801CB0AC = 1; - D_801CB0A0 = 1; - D_801CB0A4 = 0; - D_801CB0B0 = 1; -} - - - -extern s32 D_801CB0A0; -extern s32 D_801CB0A4; -extern s32 D_801CB0A8; -extern s32 D_801CB0AC; -extern s32 D_801CB0B0; - -void func_8013CAE8(void) { - D_801CB0A0 = 1; - D_801CB0AC = 0; - D_801CB0A4 = 0; - D_801CB0A8 = -1; - D_801CB0B0 = 0; -} - - - -extern s32 D_801CB0AC; -extern s32 D_801CB0B0; -extern s32 D_801CB0D8; -extern s32 D_801CB0DC; - -void func_8013CB20(void) -{ - D_801CB0D8 = D_801CB0B0; - D_801CB0DC = D_801CB0AC; - D_801CB0B0 = 1; - D_801CB0AC = 0; -} - - - -extern s32 D_801CB0D8; -extern s32 D_801CB0DC; -extern s32 D_801CB0B0; -extern s32 D_801CB0AC; - -void func_8013CB5C(void) { - D_801CB0B0 = D_801CB0D8; - D_801CB0AC = D_801CB0DC; -} - - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801CC588; - extern u8 D_801CC589; - extern u8 D_801CC58A; - extern u8 D_801CC58B; - extern u8 D_801CC58C; - extern u8 D_801CC58D; - extern u8 D_801CC58E; - extern u8 D_801CC58F; - extern u8 D_801CC590; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801CC588; t1 = D_801CC589; t2 = D_801CC58A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801CC58B; t1 = D_801CC58C; t2 = D_801CC58D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801CC58E; t1 = D_801CC58F; t2 = D_801CC590; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CB0B8; -extern s32 D_801CB0A0; -extern s32 D_801CB0BC; -extern s32 D_801CB0AC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CB0B8 != 0) { - if (D_801CB0B8 != 2) { - if (((D_801CB0B8 < 3) && (D_801CB0B8 == 1)) && - (D_801CB0BC = D_801CB0BC + 1, 0x23a < D_801CB0BC)) { - D_801CB0A0 = D_801CB0B8; - D_801CB0B8 = 2; - } - } else { - D_801CB0A0 = D_801CB0A0 + -1; - if (D_801CB0A0 == 0) { - D_801CB0A0 = D_801CB0B8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CB0AC == 0) { - D_801CB0B8 = D_801CB0B8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CB0AC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CB0AC; -} - - - -extern s32 D_801CB0B8; - -void func_8013D164(void) { - D_801CB0B8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801CC66A; -extern u8 D_801CC6DE; -extern u8 D_801CC592; -extern u8 D_801CC64C; -extern u8 D_801CC570; -extern u8 D_801CC591; -extern s32 D_801CC650; - -void func_8013D330(void) { - if ((D_801CC66A & 0xff) != D_801CC6DE) { - D_801CC66A = ((D_801CC66A & 0xff) < D_801CC6DE) ? (D_801CC66A + 1) : (D_801CC66A - 1); - } - if ((D_801CC592 & 0xff) != D_801CC64C) { - D_801CC592 = ((D_801CC592 & 0xff) < D_801CC64C) ? (D_801CC592 + 1) : (D_801CC592 - 1); - } - if ((D_801CC570 & 0xff) != D_801CC591) { - D_801CC570 = ((D_801CC570 & 0xff) < D_801CC591) ? (D_801CC570 + 1) : (D_801CC570 - 1); - } - D_801CC650 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CB090; -extern void *D_801CB094; -extern void *D_801CB098; -extern s32 D_801CB0C0; -extern s32 D_801CB0C4; -extern s32 D_801CB0C8; -extern s32 D_801CC5C4[]; - -extern u8 D_80186718[]; -extern u8 D_801867C0[]; -extern u8 D_80186670[]; -extern u8 D_8018676C[]; -extern u8 D_801867EC[]; -extern u8 D_801866C4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CB0C0 = param_2; - D_801CB0C4 = (param_2 >> 2) & 3; - D_801CB0C8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CB090 = D_80186718; - D_801CB094 = D_801867C0; - D_801CB098 = D_80186670; - } else { - D_801CB090 = D_8018676C; - D_801CB094 = D_801867EC; - D_801CB098 = D_801866C4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CB0C8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CB0C0 & 2) != 0) { - D_801CC5C4[0] = 0x140; - D_801CC5C4[3] = 0x80; - if (p[0x37] == 4) { - D_801CC5C4[0] = 0x140; - D_801CC5C4[3] = 0; - } - if (p[0x37] == 0) { - D_801CC5C4[0] = 0x140; - D_801CC5C4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CB098)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CB098; -extern s16 *D_801CB09C; -extern s32 D_801CB0AC; -extern s32 D_801CB0CC; -extern s32 D_801CB0D0; -extern s32 D_801CB0D4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CB09C != 0) { - D_801CB0AC = 0; - p = (int *)(param_1 * 12 + (int)D_801CB098); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CB0CC != x) { - flag = 1; - if (D_801CB0CC < x) { - if (x - D_801CB0CC < 5) { - D_801CB0CC = x; - } else { - D_801CB0CC = D_801CB0CC + 4; - } - } else { - if (D_801CB0CC - x < 5) { - D_801CB0CC = x; - } else { - D_801CB0CC = D_801CB0CC - 4; - } - } - } - if (D_801CB0D0 != y) { - flag = 1; - if (D_801CB0D0 < y) { - if (y - D_801CB0D0 < 5) { - D_801CB0D0 = y; - } else { - D_801CB0D0 = D_801CB0D0 + 4; - } - } else { - if (D_801CB0D0 - y < 5) { - D_801CB0D0 = y; - } else { - D_801CB0D0 = D_801CB0D0 - 4; - } - } - } - if (D_801CB0D4 != z) { - flag = 1; - if (D_801CB0D4 < z) { - if (z - D_801CB0D4 < 5) { - D_801CB0D4 = z; - } else { - D_801CB0D4 = D_801CB0D4 + 4; - } - } else { - if (D_801CB0D4 - z < 5) { - D_801CB0D4 = z; - } else { - D_801CB0D4 = D_801CB0D4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CB0AC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018687C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CB09C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CB0CC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CB0D0); - uVar5 = (*(int*)&D_801CB0D4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018687C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CB0B4; - -s32 func_8013E054(void) { - return D_801CB0B4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187278; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80187250; -extern s16 D_80187252; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187278; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80187250 = 2; - D_80187252 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80187252 = 0; - D_80187250 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CB0E8; - extern void * D_801CB0EC; - extern unsigned char D_80186EF0; - extern unsigned char D_80186F08; - extern unsigned char D_80186F7C; - extern unsigned char D_80186F84; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CB0E8 = &D_80186EF0; - D_801CB0EC = &D_80186F7C; - } else { - D_801CB0E8 = &D_80186F08; - D_801CB0EC = &D_80186F84; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187278/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187278 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187278)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187254; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187254)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187254)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80187250; -extern s16 D_80187252; -extern unsigned char D_80187254; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187252` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80187250` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80187252; - if (*r < 3) { - *r = *r + 1; - } - D_80187250 = (u16)D_80187250 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187254); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187254; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187254); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_093/ov_SC03_093_jr_801380E0.c b/src/ov_SC03_093/ov_SC03_093_jr_801380E0.c new file mode 100644 index 000000000..aeb96be57 --- /dev/null +++ b/src/ov_SC03_093/ov_SC03_093_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C9DD0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186170[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CAFA4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801CC670; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C9DD0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80185EAC)(); +extern s16 (*D_80185EB0)(); +extern M2C_UNK (*D_80185EB8)(); +extern s32 (*D_80185EBC)(); +extern s32 D_801CAFA0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C9DD4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186204; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801896E8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018621C; +extern M2C_UNK D_80186224; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018622C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186248[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186254[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186268[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801862B8[]; +extern s16 D_801862E8[]; +extern s16 D_80186348[]; +extern s16 D_80186350[]; +extern s16 D_80186370[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801863A8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80186400[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80186448[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186450[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186458[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186460[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80186408; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80186428; +extern void func_801321B0(int param_1); +extern int D_80186438; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CB010; +extern s32 D_801CB014[]; +extern int D_801CB018; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018646C; +extern u8 D_80186468; +extern s16 *D_80186470; +extern u8 D_80186474; +extern int D_801CB010; +extern u16 D_801CB020; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186470; /* holds a pointer value (*(u16**)&D_80186470) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186484[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801864D8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801864DC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801864DC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80186520; +extern u8 D_80186564; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80186520; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80186564 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801865A8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801865E4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801865E4; + if (((s16)a1) < 0xC00) { + tbl = D_801865A8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80186620, D_80186622, D_80186624, D_80186626, D_80186628, D_8018662A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186622 < ang)) goto outer_else; + if (!(ang < D_80186628)) goto inner_else; + if (ang < D_80186624) { *(s16 *)L = D_80186624; goto done; } + if (D_80186626 < ang) { *(s16 *)L = D_80186626; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186620) { *(s16 *)L = D_80186620; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018662A < ang) { *(s16 *)L = D_8018662A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CB088; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CB088, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CB088; +extern s8 D_801CB08C; +extern s8 D_801CB08D; + +void func_8013C9C4(void * arg0) +{ + D_801CB088 = arg0; + D_801CB08C = 0; + D_801CB08D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CB088; +extern s8 D_801CB08C; +extern s8 D_801CB08D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CB088; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CB08D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CB08C)) * 2) + D_801CB088); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CB08D = (unsigned char) p[1]; + D_801CB08C = D_801CB08C + 1; + if (D_801CB08D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CB08C = 0; + *base = 0; + } + } + else + { + D_801CB08D = c - 1; + } + } + return; +} + + + +extern s32 D_801CB0AC; +extern s32 D_801CB0A0; +extern s32 D_801CB0A4; +extern s32 D_801CB0B0; + +void func_8013CABC(void) { + D_801CB0AC = 1; + D_801CB0A0 = 1; + D_801CB0A4 = 0; + D_801CB0B0 = 1; +} + + + +extern s32 D_801CB0A0; +extern s32 D_801CB0A4; +extern s32 D_801CB0A8; +extern s32 D_801CB0AC; +extern s32 D_801CB0B0; + +void func_8013CAE8(void) { + D_801CB0A0 = 1; + D_801CB0AC = 0; + D_801CB0A4 = 0; + D_801CB0A8 = -1; + D_801CB0B0 = 0; +} + + + +extern s32 D_801CB0AC; +extern s32 D_801CB0B0; +extern s32 D_801CB0D8; +extern s32 D_801CB0DC; + +void func_8013CB20(void) +{ + D_801CB0D8 = D_801CB0B0; + D_801CB0DC = D_801CB0AC; + D_801CB0B0 = 1; + D_801CB0AC = 0; +} + + + +extern s32 D_801CB0D8; +extern s32 D_801CB0DC; +extern s32 D_801CB0B0; +extern s32 D_801CB0AC; + +void func_8013CB5C(void) { + D_801CB0B0 = D_801CB0D8; + D_801CB0AC = D_801CB0DC; +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801CC588; + extern u8 D_801CC589; + extern u8 D_801CC58A; + extern u8 D_801CC58B; + extern u8 D_801CC58C; + extern u8 D_801CC58D; + extern u8 D_801CC58E; + extern u8 D_801CC58F; + extern u8 D_801CC590; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801CC588; t1 = D_801CC589; t2 = D_801CC58A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801CC58B; t1 = D_801CC58C; t2 = D_801CC58D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801CC58E; t1 = D_801CC58F; t2 = D_801CC590; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CB0B8; +extern s32 D_801CB0A0; +extern s32 D_801CB0BC; +extern s32 D_801CB0AC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CB0B8 != 0) { + if (D_801CB0B8 != 2) { + if (((D_801CB0B8 < 3) && (D_801CB0B8 == 1)) && + (D_801CB0BC = D_801CB0BC + 1, 0x23a < D_801CB0BC)) { + D_801CB0A0 = D_801CB0B8; + D_801CB0B8 = 2; + } + } else { + D_801CB0A0 = D_801CB0A0 + -1; + if (D_801CB0A0 == 0) { + D_801CB0A0 = D_801CB0B8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CB0AC == 0) { + D_801CB0B8 = D_801CB0B8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CB0AC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CB0AC; +} + + + +extern s32 D_801CB0B8; + +void func_8013D164(void) { + D_801CB0B8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801CC66A; +extern u8 D_801CC6DE; +extern u8 D_801CC592; +extern u8 D_801CC64C; +extern u8 D_801CC570; +extern u8 D_801CC591; +extern s32 D_801CC650; + +void func_8013D330(void) { + if ((D_801CC66A & 0xff) != D_801CC6DE) { + D_801CC66A = ((D_801CC66A & 0xff) < D_801CC6DE) ? (D_801CC66A + 1) : (D_801CC66A - 1); + } + if ((D_801CC592 & 0xff) != D_801CC64C) { + D_801CC592 = ((D_801CC592 & 0xff) < D_801CC64C) ? (D_801CC592 + 1) : (D_801CC592 - 1); + } + if ((D_801CC570 & 0xff) != D_801CC591) { + D_801CC570 = ((D_801CC570 & 0xff) < D_801CC591) ? (D_801CC570 + 1) : (D_801CC570 - 1); + } + D_801CC650 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CB090; +extern void *D_801CB094; +extern void *D_801CB098; +extern s32 D_801CB0C0; +extern s32 D_801CB0C4; +extern s32 D_801CB0C8; +extern s32 D_801CC5C4[]; + +extern u8 D_80186718[]; +extern u8 D_801867C0[]; +extern u8 D_80186670[]; +extern u8 D_8018676C[]; +extern u8 D_801867EC[]; +extern u8 D_801866C4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CB0C0 = param_2; + D_801CB0C4 = (param_2 >> 2) & 3; + D_801CB0C8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CB090 = D_80186718; + D_801CB094 = D_801867C0; + D_801CB098 = D_80186670; + } else { + D_801CB090 = D_8018676C; + D_801CB094 = D_801867EC; + D_801CB098 = D_801866C4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CB0C8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CB0C0 & 2) != 0) { + D_801CC5C4[0] = 0x140; + D_801CC5C4[3] = 0x80; + if (p[0x37] == 4) { + D_801CC5C4[0] = 0x140; + D_801CC5C4[3] = 0; + } + if (p[0x37] == 0) { + D_801CC5C4[0] = 0x140; + D_801CC5C4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CB098)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CB098; +extern s16 *D_801CB09C; +extern s32 D_801CB0AC; +extern s32 D_801CB0CC; +extern s32 D_801CB0D0; +extern s32 D_801CB0D4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CB09C != 0) { + D_801CB0AC = 0; + p = (int *)(param_1 * 12 + (int)D_801CB098); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CB0CC != x) { + flag = 1; + if (D_801CB0CC < x) { + if (x - D_801CB0CC < 5) { + D_801CB0CC = x; + } else { + D_801CB0CC = D_801CB0CC + 4; + } + } else { + if (D_801CB0CC - x < 5) { + D_801CB0CC = x; + } else { + D_801CB0CC = D_801CB0CC - 4; + } + } + } + if (D_801CB0D0 != y) { + flag = 1; + if (D_801CB0D0 < y) { + if (y - D_801CB0D0 < 5) { + D_801CB0D0 = y; + } else { + D_801CB0D0 = D_801CB0D0 + 4; + } + } else { + if (D_801CB0D0 - y < 5) { + D_801CB0D0 = y; + } else { + D_801CB0D0 = D_801CB0D0 - 4; + } + } + } + if (D_801CB0D4 != z) { + flag = 1; + if (D_801CB0D4 < z) { + if (z - D_801CB0D4 < 5) { + D_801CB0D4 = z; + } else { + D_801CB0D4 = D_801CB0D4 + 4; + } + } else { + if (D_801CB0D4 - z < 5) { + D_801CB0D4 = z; + } else { + D_801CB0D4 = D_801CB0D4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CB0AC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018687C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CB09C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CB0CC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CB0D0); + uVar5 = (*(int*)&D_801CB0D4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018687C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CB0B4; + +s32 func_8013E054(void) { + return D_801CB0B4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187278; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80187250; +extern s16 D_80187252; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187278; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80187250 = 2; + D_80187252 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80187252 = 0; + D_80187250 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CB0E8; + extern void * D_801CB0EC; + extern unsigned char D_80186EF0; + extern unsigned char D_80186F08; + extern unsigned char D_80186F7C; + extern unsigned char D_80186F84; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CB0E8 = &D_80186EF0; + D_801CB0EC = &D_80186F7C; + } else { + D_801CB0E8 = &D_80186F08; + D_801CB0EC = &D_80186F84; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187278/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187278 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187278)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187254; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187254)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187254)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80187250; +extern s16 D_80187252; +extern unsigned char D_80187254; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187252` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80187250` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80187252; + if (*r < 3) { + *r = *r + 1; + } + D_80187250 = (u16)D_80187250 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187254); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187254; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187254); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_093/nonmatchings/ov_SC03_093_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_094/ov_SC03_094_jr_8012ACE0.c b/src/ov_SC03_094/ov_SC03_094_jr_8012ACE0.c index 1c5a616c9..117a69bdc 100644 --- a/src/ov_SC03_094/ov_SC03_094_jr_8012ACE0.c +++ b/src/ov_SC03_094/ov_SC03_094_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80187ED8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80187ED8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80187F1C; -extern u8 D_80187F60; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80187F1C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80187F60 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80187FA4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80187FE0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80187FE0; - if (((s16)a1) < 0xC00) { - tbl = D_80187FA4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018801C, D_8018801E, D_80188020, D_80188022, D_80188024, D_80188026; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018801E < ang)) goto outer_else; - if (!(ang < D_80188024)) goto inner_else; - if (ang < D_80188020) { *(s16 *)L = D_80188020; goto done; } - if (D_80188022 < ang) { *(s16 *)L = D_80188022; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018801C) { *(s16 *)L = D_8018801C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80188026 < ang) { *(s16 *)L = D_80188026; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D1EC8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D1EC8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D1EC8; -extern s8 D_801D1ECC; -extern s8 D_801D1ECD; - -void func_8013C9C4(void * arg0) -{ - D_801D1EC8 = arg0; - D_801D1ECC = 0; - D_801D1ECD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D1EC8; -extern s8 D_801D1ECC; -extern s8 D_801D1ECD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D1EC8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D1ECD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D1ECC)) * 2) + D_801D1EC8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D1ECD = (unsigned char) p[1]; - D_801D1ECC = D_801D1ECC + 1; - if (D_801D1ECD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D1ECC = 0; - *base = 0; - } - } - else - { - D_801D1ECD = c - 1; - } - } - return; -} - - - -extern s32 D_801D1EEC; -extern s32 D_801D1EE0; -extern s32 D_801D1EE4; -extern s32 D_801D1EF0; - -void func_8013CABC(void) { - D_801D1EEC = 1; - D_801D1EE0 = 1; - D_801D1EE4 = 0; - D_801D1EF0 = 1; -} - - - -extern s32 D_801D1EE0; -extern s32 D_801D1EE4; -extern s32 D_801D1EE8; -extern s32 D_801D1EEC; -extern s32 D_801D1EF0; - -void func_8013CAE8(void) { - D_801D1EE0 = 1; - D_801D1EEC = 0; - D_801D1EE4 = 0; - D_801D1EE8 = -1; - D_801D1EF0 = 0; -} - - - -extern s32 D_801D1EEC; -extern s32 D_801D1EF0; -extern s32 D_801D1F18; -extern s32 D_801D1F1C; - -void func_8013CB20(void) -{ - D_801D1F18 = D_801D1EF0; - D_801D1F1C = D_801D1EEC; - D_801D1EF0 = 1; - D_801D1EEC = 0; -} - - - -extern s32 D_801D1F18; -extern s32 D_801D1F1C; -extern s32 D_801D1EF0; -extern s32 D_801D1EEC; - -void func_8013CB5C(void) { - D_801D1EF0 = D_801D1F18; - D_801D1EEC = D_801D1F1C; -} - - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D3140; - extern u8 D_801D3141; - extern u8 D_801D3142; - extern u8 D_801D3143; - extern u8 D_801D3144; - extern u8 D_801D3145; - extern u8 D_801D3146; - extern u8 D_801D3147; - extern u8 D_801D3148; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D3140; t1 = D_801D3141; t2 = D_801D3142; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D3143; t1 = D_801D3144; t2 = D_801D3145; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D3146; t1 = D_801D3147; t2 = D_801D3148; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D1EF8; -extern s32 D_801D1EE0; -extern s32 D_801D1EFC; -extern s32 D_801D1EEC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D1EF8 != 0) { - if (D_801D1EF8 != 2) { - if (((D_801D1EF8 < 3) && (D_801D1EF8 == 1)) && - (D_801D1EFC = D_801D1EFC + 1, 0x23a < D_801D1EFC)) { - D_801D1EE0 = D_801D1EF8; - D_801D1EF8 = 2; - } - } else { - D_801D1EE0 = D_801D1EE0 + -1; - if (D_801D1EE0 == 0) { - D_801D1EE0 = D_801D1EF8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D1EEC == 0) { - D_801D1EF8 = D_801D1EF8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D1EEC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D1EEC; -} - - - -extern s32 D_801D1EF8; - -void func_8013D164(void) { - D_801D1EF8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D3222; -extern u8 D_801D3296; -extern u8 D_801D314A; -extern u8 D_801D3204; -extern u8 D_801D3128; -extern u8 D_801D3149; -extern s32 D_801D3208; - -void func_8013D330(void) { - if ((D_801D3222 & 0xff) != D_801D3296) { - D_801D3222 = ((D_801D3222 & 0xff) < D_801D3296) ? (D_801D3222 + 1) : (D_801D3222 - 1); - } - if ((D_801D314A & 0xff) != D_801D3204) { - D_801D314A = ((D_801D314A & 0xff) < D_801D3204) ? (D_801D314A + 1) : (D_801D314A - 1); - } - if ((D_801D3128 & 0xff) != D_801D3149) { - D_801D3128 = ((D_801D3128 & 0xff) < D_801D3149) ? (D_801D3128 + 1) : (D_801D3128 - 1); - } - D_801D3208 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D1ED0; -extern void *D_801D1ED4; -extern void *D_801D1ED8; -extern s32 D_801D1F00; -extern s32 D_801D1F04; -extern s32 D_801D1F08; -extern s32 D_801D317C[]; - -extern u8 D_80188114[]; -extern u8 D_801881BC[]; -extern u8 D_8018806C[]; -extern u8 D_80188168[]; -extern u8 D_801881E8[]; -extern u8 D_801880C0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D1F00 = param_2; - D_801D1F04 = (param_2 >> 2) & 3; - D_801D1F08 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D1ED0 = D_80188114; - D_801D1ED4 = D_801881BC; - D_801D1ED8 = D_8018806C; - } else { - D_801D1ED0 = D_80188168; - D_801D1ED4 = D_801881E8; - D_801D1ED8 = D_801880C0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D1F08 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D1F00 & 2) != 0) { - D_801D317C[0] = 0x140; - D_801D317C[3] = 0x80; - if (p[0x37] == 4) { - D_801D317C[0] = 0x140; - D_801D317C[3] = 0; - } - if (p[0x37] == 0) { - D_801D317C[0] = 0x140; - D_801D317C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D1ED8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D1ED8; -extern s16 *D_801D1EDC; -extern s32 D_801D1EEC; -extern s32 D_801D1F0C; -extern s32 D_801D1F10; -extern s32 D_801D1F14; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D1EDC != 0) { - D_801D1EEC = 0; - p = (int *)(param_1 * 12 + (int)D_801D1ED8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D1F0C != x) { - flag = 1; - if (D_801D1F0C < x) { - if (x - D_801D1F0C < 5) { - D_801D1F0C = x; - } else { - D_801D1F0C = D_801D1F0C + 4; - } - } else { - if (D_801D1F0C - x < 5) { - D_801D1F0C = x; - } else { - D_801D1F0C = D_801D1F0C - 4; - } - } - } - if (D_801D1F10 != y) { - flag = 1; - if (D_801D1F10 < y) { - if (y - D_801D1F10 < 5) { - D_801D1F10 = y; - } else { - D_801D1F10 = D_801D1F10 + 4; - } - } else { - if (D_801D1F10 - y < 5) { - D_801D1F10 = y; - } else { - D_801D1F10 = D_801D1F10 - 4; - } - } - } - if (D_801D1F14 != z) { - flag = 1; - if (D_801D1F14 < z) { - if (z - D_801D1F14 < 5) { - D_801D1F14 = z; - } else { - D_801D1F14 = D_801D1F14 + 4; - } - } else { - if (D_801D1F14 - z < 5) { - D_801D1F14 = z; - } else { - D_801D1F14 = D_801D1F14 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D1EEC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80188278[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D1EDC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D1F0C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D1F10); - uVar5 = (*(int*)&D_801D1F14); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80188278); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D1EF4; - -s32 func_8013E054(void) { - return D_801D1EF4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80188C74; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80188C4C; -extern s16 D_80188C4E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80188C74; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80188C4C = 2; - D_80188C4E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80188C4E = 0; - D_80188C4C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D1F28; - extern void * D_801D1F2C; - extern unsigned char D_801888EC; - extern unsigned char D_80188904; - extern unsigned char D_80188978; - extern unsigned char D_80188980; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D1F28 = &D_801888EC; - D_801D1F2C = &D_80188978; - } else { - D_801D1F28 = &D_80188904; - D_801D1F2C = &D_80188980; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80188C74/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188C74 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80188C74)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80188C50; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188C50)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188C50)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80188C4C; -extern s16 D_80188C4E; -extern unsigned char D_80188C50; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188C4E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80188C4C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80188C4E; - if (*r < 3) { - *r = *r + 1; - } - D_80188C4C = (u16)D_80188C4C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188C50); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80188C50; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188C50); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_094/ov_SC03_094_jr_801380E0.c b/src/ov_SC03_094/ov_SC03_094_jr_801380E0.c new file mode 100644 index 000000000..1f083846d --- /dev/null +++ b/src/ov_SC03_094/ov_SC03_094_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D0C0C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80187B6C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D1DE4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D3228; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D0C0C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801878A8)(); +extern s16 (*D_801878AC)(); +extern M2C_UNK (*D_801878B4)(); +extern s32 (*D_801878B8)(); +extern s32 D_801D1DE0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D0C10; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80187C00; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018B0E4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80187C18; +extern M2C_UNK D_80187C20; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80187C28; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80187C44[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80187C50[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80187C64[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80187CB4[]; +extern s16 D_80187CE4[]; +extern s16 D_80187D44[]; +extern s16 D_80187D4C[]; +extern s16 D_80187D6C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80187DA4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80187DFC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80187E44[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80187E4C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80187E54[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80187E5C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80187E04; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80187E24; +extern void func_801321B0(int param_1); +extern int D_80187E34; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D1E50; +extern s32 D_801D1E54[]; +extern int D_801D1E58; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80187E68; +extern u8 D_80187E64; +extern s16 *D_80187E6C; +extern u8 D_80187E70; +extern int D_801D1E50; +extern u16 D_801D1E60; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80187E6C; /* holds a pointer value (*(u16**)&D_80187E6C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80187E80[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80187ED4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80187ED8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80187ED8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80187F1C; +extern u8 D_80187F60; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80187F1C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80187F60 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80187FA4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80187FE0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80187FE0; + if (((s16)a1) < 0xC00) { + tbl = D_80187FA4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018801C, D_8018801E, D_80188020, D_80188022, D_80188024, D_80188026; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018801E < ang)) goto outer_else; + if (!(ang < D_80188024)) goto inner_else; + if (ang < D_80188020) { *(s16 *)L = D_80188020; goto done; } + if (D_80188022 < ang) { *(s16 *)L = D_80188022; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018801C) { *(s16 *)L = D_8018801C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80188026 < ang) { *(s16 *)L = D_80188026; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D1EC8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D1EC8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D1EC8; +extern s8 D_801D1ECC; +extern s8 D_801D1ECD; + +void func_8013C9C4(void * arg0) +{ + D_801D1EC8 = arg0; + D_801D1ECC = 0; + D_801D1ECD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D1EC8; +extern s8 D_801D1ECC; +extern s8 D_801D1ECD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D1EC8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D1ECD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D1ECC)) * 2) + D_801D1EC8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D1ECD = (unsigned char) p[1]; + D_801D1ECC = D_801D1ECC + 1; + if (D_801D1ECD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D1ECC = 0; + *base = 0; + } + } + else + { + D_801D1ECD = c - 1; + } + } + return; +} + + + +extern s32 D_801D1EEC; +extern s32 D_801D1EE0; +extern s32 D_801D1EE4; +extern s32 D_801D1EF0; + +void func_8013CABC(void) { + D_801D1EEC = 1; + D_801D1EE0 = 1; + D_801D1EE4 = 0; + D_801D1EF0 = 1; +} + + + +extern s32 D_801D1EE0; +extern s32 D_801D1EE4; +extern s32 D_801D1EE8; +extern s32 D_801D1EEC; +extern s32 D_801D1EF0; + +void func_8013CAE8(void) { + D_801D1EE0 = 1; + D_801D1EEC = 0; + D_801D1EE4 = 0; + D_801D1EE8 = -1; + D_801D1EF0 = 0; +} + + + +extern s32 D_801D1EEC; +extern s32 D_801D1EF0; +extern s32 D_801D1F18; +extern s32 D_801D1F1C; + +void func_8013CB20(void) +{ + D_801D1F18 = D_801D1EF0; + D_801D1F1C = D_801D1EEC; + D_801D1EF0 = 1; + D_801D1EEC = 0; +} + + + +extern s32 D_801D1F18; +extern s32 D_801D1F1C; +extern s32 D_801D1EF0; +extern s32 D_801D1EEC; + +void func_8013CB5C(void) { + D_801D1EF0 = D_801D1F18; + D_801D1EEC = D_801D1F1C; +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D3140; + extern u8 D_801D3141; + extern u8 D_801D3142; + extern u8 D_801D3143; + extern u8 D_801D3144; + extern u8 D_801D3145; + extern u8 D_801D3146; + extern u8 D_801D3147; + extern u8 D_801D3148; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D3140; t1 = D_801D3141; t2 = D_801D3142; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D3143; t1 = D_801D3144; t2 = D_801D3145; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D3146; t1 = D_801D3147; t2 = D_801D3148; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D1EF8; +extern s32 D_801D1EE0; +extern s32 D_801D1EFC; +extern s32 D_801D1EEC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D1EF8 != 0) { + if (D_801D1EF8 != 2) { + if (((D_801D1EF8 < 3) && (D_801D1EF8 == 1)) && + (D_801D1EFC = D_801D1EFC + 1, 0x23a < D_801D1EFC)) { + D_801D1EE0 = D_801D1EF8; + D_801D1EF8 = 2; + } + } else { + D_801D1EE0 = D_801D1EE0 + -1; + if (D_801D1EE0 == 0) { + D_801D1EE0 = D_801D1EF8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D1EEC == 0) { + D_801D1EF8 = D_801D1EF8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D1EEC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D1EEC; +} + + + +extern s32 D_801D1EF8; + +void func_8013D164(void) { + D_801D1EF8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D3222; +extern u8 D_801D3296; +extern u8 D_801D314A; +extern u8 D_801D3204; +extern u8 D_801D3128; +extern u8 D_801D3149; +extern s32 D_801D3208; + +void func_8013D330(void) { + if ((D_801D3222 & 0xff) != D_801D3296) { + D_801D3222 = ((D_801D3222 & 0xff) < D_801D3296) ? (D_801D3222 + 1) : (D_801D3222 - 1); + } + if ((D_801D314A & 0xff) != D_801D3204) { + D_801D314A = ((D_801D314A & 0xff) < D_801D3204) ? (D_801D314A + 1) : (D_801D314A - 1); + } + if ((D_801D3128 & 0xff) != D_801D3149) { + D_801D3128 = ((D_801D3128 & 0xff) < D_801D3149) ? (D_801D3128 + 1) : (D_801D3128 - 1); + } + D_801D3208 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D1ED0; +extern void *D_801D1ED4; +extern void *D_801D1ED8; +extern s32 D_801D1F00; +extern s32 D_801D1F04; +extern s32 D_801D1F08; +extern s32 D_801D317C[]; + +extern u8 D_80188114[]; +extern u8 D_801881BC[]; +extern u8 D_8018806C[]; +extern u8 D_80188168[]; +extern u8 D_801881E8[]; +extern u8 D_801880C0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D1F00 = param_2; + D_801D1F04 = (param_2 >> 2) & 3; + D_801D1F08 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D1ED0 = D_80188114; + D_801D1ED4 = D_801881BC; + D_801D1ED8 = D_8018806C; + } else { + D_801D1ED0 = D_80188168; + D_801D1ED4 = D_801881E8; + D_801D1ED8 = D_801880C0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D1F08 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D1F00 & 2) != 0) { + D_801D317C[0] = 0x140; + D_801D317C[3] = 0x80; + if (p[0x37] == 4) { + D_801D317C[0] = 0x140; + D_801D317C[3] = 0; + } + if (p[0x37] == 0) { + D_801D317C[0] = 0x140; + D_801D317C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D1ED8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D1ED8; +extern s16 *D_801D1EDC; +extern s32 D_801D1EEC; +extern s32 D_801D1F0C; +extern s32 D_801D1F10; +extern s32 D_801D1F14; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D1EDC != 0) { + D_801D1EEC = 0; + p = (int *)(param_1 * 12 + (int)D_801D1ED8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D1F0C != x) { + flag = 1; + if (D_801D1F0C < x) { + if (x - D_801D1F0C < 5) { + D_801D1F0C = x; + } else { + D_801D1F0C = D_801D1F0C + 4; + } + } else { + if (D_801D1F0C - x < 5) { + D_801D1F0C = x; + } else { + D_801D1F0C = D_801D1F0C - 4; + } + } + } + if (D_801D1F10 != y) { + flag = 1; + if (D_801D1F10 < y) { + if (y - D_801D1F10 < 5) { + D_801D1F10 = y; + } else { + D_801D1F10 = D_801D1F10 + 4; + } + } else { + if (D_801D1F10 - y < 5) { + D_801D1F10 = y; + } else { + D_801D1F10 = D_801D1F10 - 4; + } + } + } + if (D_801D1F14 != z) { + flag = 1; + if (D_801D1F14 < z) { + if (z - D_801D1F14 < 5) { + D_801D1F14 = z; + } else { + D_801D1F14 = D_801D1F14 + 4; + } + } else { + if (D_801D1F14 - z < 5) { + D_801D1F14 = z; + } else { + D_801D1F14 = D_801D1F14 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D1EEC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80188278[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D1EDC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D1F0C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D1F10); + uVar5 = (*(int*)&D_801D1F14); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80188278); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D1EF4; + +s32 func_8013E054(void) { + return D_801D1EF4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80188C74; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80188C4C; +extern s16 D_80188C4E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80188C74; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80188C4C = 2; + D_80188C4E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80188C4E = 0; + D_80188C4C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D1F28; + extern void * D_801D1F2C; + extern unsigned char D_801888EC; + extern unsigned char D_80188904; + extern unsigned char D_80188978; + extern unsigned char D_80188980; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D1F28 = &D_801888EC; + D_801D1F2C = &D_80188978; + } else { + D_801D1F28 = &D_80188904; + D_801D1F2C = &D_80188980; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80188C74/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188C74 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80188C74)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80188C50; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188C50)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188C50)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80188C4C; +extern s16 D_80188C4E; +extern unsigned char D_80188C50; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188C4E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80188C4C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80188C4E; + if (*r < 3) { + *r = *r + 1; + } + D_80188C4C = (u16)D_80188C4C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188C50); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80188C50; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188C50); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_095/ov_SC03_095_jr_8012ACE0.c b/src/ov_SC03_095/ov_SC03_095_jr_8012ACE0.c index 604d246ef..9fa62350c 100644 --- a/src/ov_SC03_095/ov_SC03_095_jr_8012ACE0.c +++ b/src/ov_SC03_095/ov_SC03_095_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80181538[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80181538[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018157C; -extern u8 D_801815C0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018157C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801815C0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181604[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80181640[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80181640; - if (((s16)a1) < 0xC00) { - tbl = D_80181604; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018167C, D_8018167E, D_80181680, D_80181682, D_80181684, D_80181686; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018167E < ang)) goto outer_else; - if (!(ang < D_80181684)) goto inner_else; - if (ang < D_80181680) { *(s16 *)L = D_80181680; goto done; } - if (D_80181682 < ang) { *(s16 *)L = D_80181682; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018167C) { *(s16 *)L = D_8018167C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80181686 < ang) { *(s16 *)L = D_80181686; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019AAC0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019AAC0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019AAC0; -extern s8 D_8019AAC4; -extern s8 D_8019AAC5; - -void func_8013C9C4(void * arg0) -{ - D_8019AAC0 = arg0; - D_8019AAC4 = 0; - D_8019AAC5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019AAC0; -extern s8 D_8019AAC4; -extern s8 D_8019AAC5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019AAC0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019AAC5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019AAC4)) * 2) + D_8019AAC0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019AAC5 = (unsigned char) p[1]; - D_8019AAC4 = D_8019AAC4 + 1; - if (D_8019AAC5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019AAC4 = 0; - *base = 0; - } - } - else - { - D_8019AAC5 = c - 1; - } - } - return; -} - - - -extern s32 D_8019AAE4; -extern s32 D_8019AAD8; -extern s32 D_8019AADC; -extern s32 D_8019AAE8; - -void func_8013CABC(void) { - D_8019AAE4 = 1; - D_8019AAD8 = 1; - D_8019AADC = 0; - D_8019AAE8 = 1; -} - - - -extern s32 D_8019AAD8; -extern s32 D_8019AADC; -extern s32 D_8019AAE0; -extern s32 D_8019AAE4; -extern s32 D_8019AAE8; - -void func_8013CAE8(void) { - D_8019AAD8 = 1; - D_8019AAE4 = 0; - D_8019AADC = 0; - D_8019AAE0 = -1; - D_8019AAE8 = 0; -} - - - -extern s32 D_8019AAE4; -extern s32 D_8019AAE8; -extern s32 D_8019AB10; -extern s32 D_8019AB14; - -void func_8013CB20(void) -{ - D_8019AB10 = D_8019AAE8; - D_8019AB14 = D_8019AAE4; - D_8019AAE8 = 1; - D_8019AAE4 = 0; -} - - - -extern s32 D_8019AB10; -extern s32 D_8019AB14; -extern s32 D_8019AAE8; -extern s32 D_8019AAE4; - -void func_8013CB5C(void) { - D_8019AAE8 = D_8019AB10; - D_8019AAE4 = D_8019AB14; -} - - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019BD40; - extern u8 D_8019BD41; - extern u8 D_8019BD42; - extern u8 D_8019BD43; - extern u8 D_8019BD44; - extern u8 D_8019BD45; - extern u8 D_8019BD46; - extern u8 D_8019BD47; - extern u8 D_8019BD48; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019BD40; t1 = D_8019BD41; t2 = D_8019BD42; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019BD43; t1 = D_8019BD44; t2 = D_8019BD45; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019BD46; t1 = D_8019BD47; t2 = D_8019BD48; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019AAF0; -extern s32 D_8019AAD8; -extern s32 D_8019AAF4; -extern s32 D_8019AAE4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019AAF0 != 0) { - if (D_8019AAF0 != 2) { - if (((D_8019AAF0 < 3) && (D_8019AAF0 == 1)) && - (D_8019AAF4 = D_8019AAF4 + 1, 0x23a < D_8019AAF4)) { - D_8019AAD8 = D_8019AAF0; - D_8019AAF0 = 2; - } - } else { - D_8019AAD8 = D_8019AAD8 + -1; - if (D_8019AAD8 == 0) { - D_8019AAD8 = D_8019AAF0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019AAE4 == 0) { - D_8019AAF0 = D_8019AAF0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019AAE4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019AAE4; -} - - - -extern s32 D_8019AAF0; - -void func_8013D164(void) { - D_8019AAF0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019BE22; -extern u8 D_8019BE96; -extern u8 D_8019BD4A; -extern u8 D_8019BE04; -extern u8 D_8019BD28; -extern u8 D_8019BD49; -extern s32 D_8019BE08; - -void func_8013D330(void) { - if ((D_8019BE22 & 0xff) != D_8019BE96) { - D_8019BE22 = ((D_8019BE22 & 0xff) < D_8019BE96) ? (D_8019BE22 + 1) : (D_8019BE22 - 1); - } - if ((D_8019BD4A & 0xff) != D_8019BE04) { - D_8019BD4A = ((D_8019BD4A & 0xff) < D_8019BE04) ? (D_8019BD4A + 1) : (D_8019BD4A - 1); - } - if ((D_8019BD28 & 0xff) != D_8019BD49) { - D_8019BD28 = ((D_8019BD28 & 0xff) < D_8019BD49) ? (D_8019BD28 + 1) : (D_8019BD28 - 1); - } - D_8019BE08 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019AAC8; -extern void *D_8019AACC; -extern void *D_8019AAD0; -extern s32 D_8019AAF8; -extern s32 D_8019AAFC; -extern s32 D_8019AB00; -extern s32 D_8019BD7C[]; - -extern u8 D_80181774[]; -extern u8 D_8018181C[]; -extern u8 D_801816CC[]; -extern u8 D_801817C8[]; -extern u8 D_80181848[]; -extern u8 D_80181720[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019AAF8 = param_2; - D_8019AAFC = (param_2 >> 2) & 3; - D_8019AB00 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019AAC8 = D_80181774; - D_8019AACC = D_8018181C; - D_8019AAD0 = D_801816CC; - } else { - D_8019AAC8 = D_801817C8; - D_8019AACC = D_80181848; - D_8019AAD0 = D_80181720; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019AB00 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019AAF8 & 2) != 0) { - D_8019BD7C[0] = 0x140; - D_8019BD7C[3] = 0x80; - if (p[0x37] == 4) { - D_8019BD7C[0] = 0x140; - D_8019BD7C[3] = 0; - } - if (p[0x37] == 0) { - D_8019BD7C[0] = 0x140; - D_8019BD7C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019AAD0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019AAD0; -extern s16 *D_8019AAD4; -extern s32 D_8019AAE4; -extern s32 D_8019AB04; -extern s32 D_8019AB08; -extern s32 D_8019AB0C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019AAD4 != 0) { - D_8019AAE4 = 0; - p = (int *)(param_1 * 12 + (int)D_8019AAD0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019AB04 != x) { - flag = 1; - if (D_8019AB04 < x) { - if (x - D_8019AB04 < 5) { - D_8019AB04 = x; - } else { - D_8019AB04 = D_8019AB04 + 4; - } - } else { - if (D_8019AB04 - x < 5) { - D_8019AB04 = x; - } else { - D_8019AB04 = D_8019AB04 - 4; - } - } - } - if (D_8019AB08 != y) { - flag = 1; - if (D_8019AB08 < y) { - if (y - D_8019AB08 < 5) { - D_8019AB08 = y; - } else { - D_8019AB08 = D_8019AB08 + 4; - } - } else { - if (D_8019AB08 - y < 5) { - D_8019AB08 = y; - } else { - D_8019AB08 = D_8019AB08 - 4; - } - } - } - if (D_8019AB0C != z) { - flag = 1; - if (D_8019AB0C < z) { - if (z - D_8019AB0C < 5) { - D_8019AB0C = z; - } else { - D_8019AB0C = D_8019AB0C + 4; - } - } else { - if (D_8019AB0C - z < 5) { - D_8019AB0C = z; - } else { - D_8019AB0C = D_8019AB0C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019AAE4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801818D8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019AAD4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019AB04); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019AB08); - uVar5 = (*(int*)&D_8019AB0C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801818D8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019AAEC; - -s32 func_8013E054(void) { - return D_8019AAEC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801822D4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801822AC; -extern s16 D_801822AE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801822D4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801822AC = 2; - D_801822AE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801822AE = 0; - D_801822AC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019AB20; - extern void * D_8019AB24; - extern unsigned char D_80181F4C; - extern unsigned char D_80181F64; - extern unsigned char D_80181FD8; - extern unsigned char D_80181FE0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019AB20 = &D_80181F4C; - D_8019AB24 = &D_80181FD8; - } else { - D_8019AB20 = &D_80181F64; - D_8019AB24 = &D_80181FE0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801822D4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801822D4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801822D4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801822B0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801822B0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801822B0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801822AC; -extern s16 D_801822AE; -extern unsigned char D_801822B0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801822AE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801822AC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801822AE; - if (*r < 3) { - *r = *r + 1; - } - D_801822AC = (u16)D_801822AC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822B0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801822B0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822B0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_095/ov_SC03_095_jr_801380E0.c b/src/ov_SC03_095/ov_SC03_095_jr_801380E0.c new file mode 100644 index 000000000..cc0cd9c9f --- /dev/null +++ b/src/ov_SC03_095/ov_SC03_095_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80199838; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801811CC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019A9DC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019BE28; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80199838; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180F08)(); +extern s16 (*D_80180F0C)(); +extern M2C_UNK (*D_80180F14)(); +extern s32 (*D_80180F18)(); +extern s32 D_8019A9D8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019983C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80181260; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80184744; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80181278; +extern M2C_UNK D_80181280; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80181288; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801812A4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801812B0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801812C4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181314[]; +extern s16 D_80181344[]; +extern s16 D_801813A4[]; +extern s16 D_801813AC[]; +extern s16 D_801813CC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80181404[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018145C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801814A4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801814AC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801814B4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801814BC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80181464; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80181484; +extern void func_801321B0(int param_1); +extern int D_80181494; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019AA48; +extern s32 D_8019AA4C[]; +extern int D_8019AA50; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801814C8; +extern u8 D_801814C4; +extern s16 *D_801814CC; +extern u8 D_801814D0; +extern int D_8019AA48; +extern u16 D_8019AA58; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801814CC; /* holds a pointer value (*(u16**)&D_801814CC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801814E0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80181534; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80181538[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80181538[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018157C; +extern u8 D_801815C0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018157C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801815C0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181604[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80181640[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80181640; + if (((s16)a1) < 0xC00) { + tbl = D_80181604; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018167C, D_8018167E, D_80181680, D_80181682, D_80181684, D_80181686; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018167E < ang)) goto outer_else; + if (!(ang < D_80181684)) goto inner_else; + if (ang < D_80181680) { *(s16 *)L = D_80181680; goto done; } + if (D_80181682 < ang) { *(s16 *)L = D_80181682; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018167C) { *(s16 *)L = D_8018167C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181686 < ang) { *(s16 *)L = D_80181686; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019AAC0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019AAC0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019AAC0; +extern s8 D_8019AAC4; +extern s8 D_8019AAC5; + +void func_8013C9C4(void * arg0) +{ + D_8019AAC0 = arg0; + D_8019AAC4 = 0; + D_8019AAC5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019AAC0; +extern s8 D_8019AAC4; +extern s8 D_8019AAC5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019AAC0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019AAC5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019AAC4)) * 2) + D_8019AAC0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019AAC5 = (unsigned char) p[1]; + D_8019AAC4 = D_8019AAC4 + 1; + if (D_8019AAC5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019AAC4 = 0; + *base = 0; + } + } + else + { + D_8019AAC5 = c - 1; + } + } + return; +} + + + +extern s32 D_8019AAE4; +extern s32 D_8019AAD8; +extern s32 D_8019AADC; +extern s32 D_8019AAE8; + +void func_8013CABC(void) { + D_8019AAE4 = 1; + D_8019AAD8 = 1; + D_8019AADC = 0; + D_8019AAE8 = 1; +} + + + +extern s32 D_8019AAD8; +extern s32 D_8019AADC; +extern s32 D_8019AAE0; +extern s32 D_8019AAE4; +extern s32 D_8019AAE8; + +void func_8013CAE8(void) { + D_8019AAD8 = 1; + D_8019AAE4 = 0; + D_8019AADC = 0; + D_8019AAE0 = -1; + D_8019AAE8 = 0; +} + + + +extern s32 D_8019AAE4; +extern s32 D_8019AAE8; +extern s32 D_8019AB10; +extern s32 D_8019AB14; + +void func_8013CB20(void) +{ + D_8019AB10 = D_8019AAE8; + D_8019AB14 = D_8019AAE4; + D_8019AAE8 = 1; + D_8019AAE4 = 0; +} + + + +extern s32 D_8019AB10; +extern s32 D_8019AB14; +extern s32 D_8019AAE8; +extern s32 D_8019AAE4; + +void func_8013CB5C(void) { + D_8019AAE8 = D_8019AB10; + D_8019AAE4 = D_8019AB14; +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019BD40; + extern u8 D_8019BD41; + extern u8 D_8019BD42; + extern u8 D_8019BD43; + extern u8 D_8019BD44; + extern u8 D_8019BD45; + extern u8 D_8019BD46; + extern u8 D_8019BD47; + extern u8 D_8019BD48; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019BD40; t1 = D_8019BD41; t2 = D_8019BD42; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019BD43; t1 = D_8019BD44; t2 = D_8019BD45; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019BD46; t1 = D_8019BD47; t2 = D_8019BD48; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019AAF0; +extern s32 D_8019AAD8; +extern s32 D_8019AAF4; +extern s32 D_8019AAE4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019AAF0 != 0) { + if (D_8019AAF0 != 2) { + if (((D_8019AAF0 < 3) && (D_8019AAF0 == 1)) && + (D_8019AAF4 = D_8019AAF4 + 1, 0x23a < D_8019AAF4)) { + D_8019AAD8 = D_8019AAF0; + D_8019AAF0 = 2; + } + } else { + D_8019AAD8 = D_8019AAD8 + -1; + if (D_8019AAD8 == 0) { + D_8019AAD8 = D_8019AAF0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019AAE4 == 0) { + D_8019AAF0 = D_8019AAF0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019AAE4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019AAE4; +} + + + +extern s32 D_8019AAF0; + +void func_8013D164(void) { + D_8019AAF0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019BE22; +extern u8 D_8019BE96; +extern u8 D_8019BD4A; +extern u8 D_8019BE04; +extern u8 D_8019BD28; +extern u8 D_8019BD49; +extern s32 D_8019BE08; + +void func_8013D330(void) { + if ((D_8019BE22 & 0xff) != D_8019BE96) { + D_8019BE22 = ((D_8019BE22 & 0xff) < D_8019BE96) ? (D_8019BE22 + 1) : (D_8019BE22 - 1); + } + if ((D_8019BD4A & 0xff) != D_8019BE04) { + D_8019BD4A = ((D_8019BD4A & 0xff) < D_8019BE04) ? (D_8019BD4A + 1) : (D_8019BD4A - 1); + } + if ((D_8019BD28 & 0xff) != D_8019BD49) { + D_8019BD28 = ((D_8019BD28 & 0xff) < D_8019BD49) ? (D_8019BD28 + 1) : (D_8019BD28 - 1); + } + D_8019BE08 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019AAC8; +extern void *D_8019AACC; +extern void *D_8019AAD0; +extern s32 D_8019AAF8; +extern s32 D_8019AAFC; +extern s32 D_8019AB00; +extern s32 D_8019BD7C[]; + +extern u8 D_80181774[]; +extern u8 D_8018181C[]; +extern u8 D_801816CC[]; +extern u8 D_801817C8[]; +extern u8 D_80181848[]; +extern u8 D_80181720[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019AAF8 = param_2; + D_8019AAFC = (param_2 >> 2) & 3; + D_8019AB00 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019AAC8 = D_80181774; + D_8019AACC = D_8018181C; + D_8019AAD0 = D_801816CC; + } else { + D_8019AAC8 = D_801817C8; + D_8019AACC = D_80181848; + D_8019AAD0 = D_80181720; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019AB00 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019AAF8 & 2) != 0) { + D_8019BD7C[0] = 0x140; + D_8019BD7C[3] = 0x80; + if (p[0x37] == 4) { + D_8019BD7C[0] = 0x140; + D_8019BD7C[3] = 0; + } + if (p[0x37] == 0) { + D_8019BD7C[0] = 0x140; + D_8019BD7C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019AAD0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019AAD0; +extern s16 *D_8019AAD4; +extern s32 D_8019AAE4; +extern s32 D_8019AB04; +extern s32 D_8019AB08; +extern s32 D_8019AB0C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019AAD4 != 0) { + D_8019AAE4 = 0; + p = (int *)(param_1 * 12 + (int)D_8019AAD0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019AB04 != x) { + flag = 1; + if (D_8019AB04 < x) { + if (x - D_8019AB04 < 5) { + D_8019AB04 = x; + } else { + D_8019AB04 = D_8019AB04 + 4; + } + } else { + if (D_8019AB04 - x < 5) { + D_8019AB04 = x; + } else { + D_8019AB04 = D_8019AB04 - 4; + } + } + } + if (D_8019AB08 != y) { + flag = 1; + if (D_8019AB08 < y) { + if (y - D_8019AB08 < 5) { + D_8019AB08 = y; + } else { + D_8019AB08 = D_8019AB08 + 4; + } + } else { + if (D_8019AB08 - y < 5) { + D_8019AB08 = y; + } else { + D_8019AB08 = D_8019AB08 - 4; + } + } + } + if (D_8019AB0C != z) { + flag = 1; + if (D_8019AB0C < z) { + if (z - D_8019AB0C < 5) { + D_8019AB0C = z; + } else { + D_8019AB0C = D_8019AB0C + 4; + } + } else { + if (D_8019AB0C - z < 5) { + D_8019AB0C = z; + } else { + D_8019AB0C = D_8019AB0C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019AAE4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801818D8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019AAD4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019AB04); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019AB08); + uVar5 = (*(int*)&D_8019AB0C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801818D8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019AAEC; + +s32 func_8013E054(void) { + return D_8019AAEC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801822D4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801822AC; +extern s16 D_801822AE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801822D4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801822AC = 2; + D_801822AE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801822AE = 0; + D_801822AC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019AB20; + extern void * D_8019AB24; + extern unsigned char D_80181F4C; + extern unsigned char D_80181F64; + extern unsigned char D_80181FD8; + extern unsigned char D_80181FE0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019AB20 = &D_80181F4C; + D_8019AB24 = &D_80181FD8; + } else { + D_8019AB20 = &D_80181F64; + D_8019AB24 = &D_80181FE0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801822D4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801822D4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801822D4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801822B0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801822B0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801822B0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801822AC; +extern s16 D_801822AE; +extern unsigned char D_801822B0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801822AE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801822AC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801822AE; + if (*r < 3) { + *r = *r + 1; + } + D_801822AC = (u16)D_801822AC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822B0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801822B0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801822B0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_095/nonmatchings/ov_SC03_095_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_096/ov_SC03_096_jr_8012ACE0.c b/src/ov_SC03_096/ov_SC03_096_jr_8012ACE0.c index 60787d741..ed116c476 100644 --- a/src/ov_SC03_096/ov_SC03_096_jr_8012ACE0.c +++ b/src/ov_SC03_096/ov_SC03_096_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801810B8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801810B8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801810FC; -extern u8 D_80181140; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801810FC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80181140 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181184[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801811C0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801811C0; - if (((s16)a1) < 0xC00) { - tbl = D_80181184; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801811FC, D_801811FE, D_80181200, D_80181202, D_80181204, D_80181206; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801811FE < ang)) goto outer_else; - if (!(ang < D_80181204)) goto inner_else; - if (ang < D_80181200) { *(s16 *)L = D_80181200; goto done; } - if (D_80181202 < ang) { *(s16 *)L = D_80181202; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801811FC) { *(s16 *)L = D_801811FC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80181206 < ang) { *(s16 *)L = D_80181206; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80199578; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80199578, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80199578; -extern s8 D_8019957C; -extern s8 D_8019957D; - -void func_8013C9C4(void * arg0) -{ - D_80199578 = arg0; - D_8019957C = 0; - D_8019957D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80199578; -extern s8 D_8019957C; -extern s8 D_8019957D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80199578; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019957D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019957C)) * 2) + D_80199578); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019957D = (unsigned char) p[1]; - D_8019957C = D_8019957C + 1; - if (D_8019957D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019957C = 0; - *base = 0; - } - } - else - { - D_8019957D = c - 1; - } - } - return; -} - - - -extern s32 D_8019959C; -extern s32 D_80199590; -extern s32 D_80199594; -extern s32 D_801995A0; - -void func_8013CABC(void) { - D_8019959C = 1; - D_80199590 = 1; - D_80199594 = 0; - D_801995A0 = 1; -} - - - -extern s32 D_80199590; -extern s32 D_80199594; -extern s32 D_80199598; -extern s32 D_8019959C; -extern s32 D_801995A0; - -void func_8013CAE8(void) { - D_80199590 = 1; - D_8019959C = 0; - D_80199594 = 0; - D_80199598 = -1; - D_801995A0 = 0; -} - - - -extern s32 D_8019959C; -extern s32 D_801995A0; -extern s32 D_801995C8; -extern s32 D_801995CC; - -void func_8013CB20(void) -{ - D_801995C8 = D_801995A0; - D_801995CC = D_8019959C; - D_801995A0 = 1; - D_8019959C = 0; -} - - - -extern s32 D_801995C8; -extern s32 D_801995CC; -extern s32 D_801995A0; -extern s32 D_8019959C; - -void func_8013CB5C(void) { - D_801995A0 = D_801995C8; - D_8019959C = D_801995CC; -} - - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019A7F8; - extern u8 D_8019A7F9; - extern u8 D_8019A7FA; - extern u8 D_8019A7FB; - extern u8 D_8019A7FC; - extern u8 D_8019A7FD; - extern u8 D_8019A7FE; - extern u8 D_8019A7FF; - extern u8 D_8019A800; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019A7F8; t1 = D_8019A7F9; t2 = D_8019A7FA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019A7FB; t1 = D_8019A7FC; t2 = D_8019A7FD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019A7FE; t1 = D_8019A7FF; t2 = D_8019A800; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801995A8; -extern s32 D_80199590; -extern s32 D_801995AC; -extern s32 D_8019959C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801995A8 != 0) { - if (D_801995A8 != 2) { - if (((D_801995A8 < 3) && (D_801995A8 == 1)) && - (D_801995AC = D_801995AC + 1, 0x23a < D_801995AC)) { - D_80199590 = D_801995A8; - D_801995A8 = 2; - } - } else { - D_80199590 = D_80199590 + -1; - if (D_80199590 == 0) { - D_80199590 = D_801995A8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019959C == 0) { - D_801995A8 = D_801995A8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019959C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019959C; -} - - - -extern s32 D_801995A8; - -void func_8013D164(void) { - D_801995A8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019A8DA; -extern u8 D_8019A94E; -extern u8 D_8019A802; -extern u8 D_8019A8BC; -extern u8 D_8019A7E0; -extern u8 D_8019A801; -extern s32 D_8019A8C0; - -void func_8013D330(void) { - if ((D_8019A8DA & 0xff) != D_8019A94E) { - D_8019A8DA = ((D_8019A8DA & 0xff) < D_8019A94E) ? (D_8019A8DA + 1) : (D_8019A8DA - 1); - } - if ((D_8019A802 & 0xff) != D_8019A8BC) { - D_8019A802 = ((D_8019A802 & 0xff) < D_8019A8BC) ? (D_8019A802 + 1) : (D_8019A802 - 1); - } - if ((D_8019A7E0 & 0xff) != D_8019A801) { - D_8019A7E0 = ((D_8019A7E0 & 0xff) < D_8019A801) ? (D_8019A7E0 + 1) : (D_8019A7E0 - 1); - } - D_8019A8C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80199580; -extern void *D_80199584; -extern void *D_80199588; -extern s32 D_801995B0; -extern s32 D_801995B4; -extern s32 D_801995B8; -extern s32 D_8019A834[]; - -extern u8 D_801812F4[]; -extern u8 D_8018139C[]; -extern u8 D_8018124C[]; -extern u8 D_80181348[]; -extern u8 D_801813C8[]; -extern u8 D_801812A0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801995B0 = param_2; - D_801995B4 = (param_2 >> 2) & 3; - D_801995B8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80199580 = D_801812F4; - D_80199584 = D_8018139C; - D_80199588 = D_8018124C; - } else { - D_80199580 = D_80181348; - D_80199584 = D_801813C8; - D_80199588 = D_801812A0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801995B8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801995B0 & 2) != 0) { - D_8019A834[0] = 0x140; - D_8019A834[3] = 0x80; - if (p[0x37] == 4) { - D_8019A834[0] = 0x140; - D_8019A834[3] = 0; - } - if (p[0x37] == 0) { - D_8019A834[0] = 0x140; - D_8019A834[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80199588)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80199588; -extern s16 *D_8019958C; -extern s32 D_8019959C; -extern s32 D_801995BC; -extern s32 D_801995C0; -extern s32 D_801995C4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019958C != 0) { - D_8019959C = 0; - p = (int *)(param_1 * 12 + (int)D_80199588); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801995BC != x) { - flag = 1; - if (D_801995BC < x) { - if (x - D_801995BC < 5) { - D_801995BC = x; - } else { - D_801995BC = D_801995BC + 4; - } - } else { - if (D_801995BC - x < 5) { - D_801995BC = x; - } else { - D_801995BC = D_801995BC - 4; - } - } - } - if (D_801995C0 != y) { - flag = 1; - if (D_801995C0 < y) { - if (y - D_801995C0 < 5) { - D_801995C0 = y; - } else { - D_801995C0 = D_801995C0 + 4; - } - } else { - if (D_801995C0 - y < 5) { - D_801995C0 = y; - } else { - D_801995C0 = D_801995C0 - 4; - } - } - } - if (D_801995C4 != z) { - flag = 1; - if (D_801995C4 < z) { - if (z - D_801995C4 < 5) { - D_801995C4 = z; - } else { - D_801995C4 = D_801995C4 + 4; - } - } else { - if (D_801995C4 - z < 5) { - D_801995C4 = z; - } else { - D_801995C4 = D_801995C4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019959C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80181458[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019958C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801995BC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801995C0); - uVar5 = (*(int*)&D_801995C4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80181458); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801995A4; - -s32 func_8013E054(void) { - return D_801995A4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80181E54; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80181E2C; -extern s16 D_80181E2E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80181E54; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80181E2C = 2; - D_80181E2E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80181E2E = 0; - D_80181E2C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801995D8; - extern void * D_801995DC; - extern unsigned char D_80181ACC; - extern unsigned char D_80181AE4; - extern unsigned char D_80181B58; - extern unsigned char D_80181B60; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801995D8 = &D_80181ACC; - D_801995DC = &D_80181B58; - } else { - D_801995D8 = &D_80181AE4; - D_801995DC = &D_80181B60; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80181E54/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80181E54 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80181E54)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80181E30; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181E30)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181E30)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80181E2C; -extern s16 D_80181E2E; -extern unsigned char D_80181E30; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181E2E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80181E2C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80181E2E; - if (*r < 3) { - *r = *r + 1; - } - D_80181E2C = (u16)D_80181E2C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181E30); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80181E30; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181E30); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_096/ov_SC03_096_jr_801380E0.c b/src/ov_SC03_096/ov_SC03_096_jr_801380E0.c new file mode 100644 index 000000000..7488a09c5 --- /dev/null +++ b/src/ov_SC03_096/ov_SC03_096_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801982EC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80180D4C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80199494; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019A8E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801982EC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180A88)(); +extern s16 (*D_80180A8C)(); +extern M2C_UNK (*D_80180A94)(); +extern s32 (*D_80180A98)(); +extern s32 D_80199490; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801982F0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80180DE0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801842C4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80180DF8; +extern M2C_UNK D_80180E00; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80180E08; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80180E24[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80180E30[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80180E44[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180E94[]; +extern s16 D_80180EC4[]; +extern s16 D_80180F24[]; +extern s16 D_80180F2C[]; +extern s16 D_80180F4C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80180F84[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180FDC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80181024[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018102C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80181034[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018103C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180FE4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80181004; +extern void func_801321B0(int param_1); +extern int D_80181014; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80199500; +extern s32 D_80199504[]; +extern int D_80199508; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80181048; +extern u8 D_80181044; +extern s16 *D_8018104C; +extern u8 D_80181050; +extern int D_80199500; +extern u16 D_80199510; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018104C; /* holds a pointer value (*(u16**)&D_8018104C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80181060[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801810B4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801810B8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801810B8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801810FC; +extern u8 D_80181140; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801810FC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80181140 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181184[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801811C0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801811C0; + if (((s16)a1) < 0xC00) { + tbl = D_80181184; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801811FC, D_801811FE, D_80181200, D_80181202, D_80181204, D_80181206; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801811FE < ang)) goto outer_else; + if (!(ang < D_80181204)) goto inner_else; + if (ang < D_80181200) { *(s16 *)L = D_80181200; goto done; } + if (D_80181202 < ang) { *(s16 *)L = D_80181202; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801811FC) { *(s16 *)L = D_801811FC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181206 < ang) { *(s16 *)L = D_80181206; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80199578; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80199578, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80199578; +extern s8 D_8019957C; +extern s8 D_8019957D; + +void func_8013C9C4(void * arg0) +{ + D_80199578 = arg0; + D_8019957C = 0; + D_8019957D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80199578; +extern s8 D_8019957C; +extern s8 D_8019957D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80199578; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019957D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019957C)) * 2) + D_80199578); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019957D = (unsigned char) p[1]; + D_8019957C = D_8019957C + 1; + if (D_8019957D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019957C = 0; + *base = 0; + } + } + else + { + D_8019957D = c - 1; + } + } + return; +} + + + +extern s32 D_8019959C; +extern s32 D_80199590; +extern s32 D_80199594; +extern s32 D_801995A0; + +void func_8013CABC(void) { + D_8019959C = 1; + D_80199590 = 1; + D_80199594 = 0; + D_801995A0 = 1; +} + + + +extern s32 D_80199590; +extern s32 D_80199594; +extern s32 D_80199598; +extern s32 D_8019959C; +extern s32 D_801995A0; + +void func_8013CAE8(void) { + D_80199590 = 1; + D_8019959C = 0; + D_80199594 = 0; + D_80199598 = -1; + D_801995A0 = 0; +} + + + +extern s32 D_8019959C; +extern s32 D_801995A0; +extern s32 D_801995C8; +extern s32 D_801995CC; + +void func_8013CB20(void) +{ + D_801995C8 = D_801995A0; + D_801995CC = D_8019959C; + D_801995A0 = 1; + D_8019959C = 0; +} + + + +extern s32 D_801995C8; +extern s32 D_801995CC; +extern s32 D_801995A0; +extern s32 D_8019959C; + +void func_8013CB5C(void) { + D_801995A0 = D_801995C8; + D_8019959C = D_801995CC; +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019A7F8; + extern u8 D_8019A7F9; + extern u8 D_8019A7FA; + extern u8 D_8019A7FB; + extern u8 D_8019A7FC; + extern u8 D_8019A7FD; + extern u8 D_8019A7FE; + extern u8 D_8019A7FF; + extern u8 D_8019A800; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019A7F8; t1 = D_8019A7F9; t2 = D_8019A7FA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019A7FB; t1 = D_8019A7FC; t2 = D_8019A7FD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019A7FE; t1 = D_8019A7FF; t2 = D_8019A800; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801995A8; +extern s32 D_80199590; +extern s32 D_801995AC; +extern s32 D_8019959C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801995A8 != 0) { + if (D_801995A8 != 2) { + if (((D_801995A8 < 3) && (D_801995A8 == 1)) && + (D_801995AC = D_801995AC + 1, 0x23a < D_801995AC)) { + D_80199590 = D_801995A8; + D_801995A8 = 2; + } + } else { + D_80199590 = D_80199590 + -1; + if (D_80199590 == 0) { + D_80199590 = D_801995A8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019959C == 0) { + D_801995A8 = D_801995A8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019959C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019959C; +} + + + +extern s32 D_801995A8; + +void func_8013D164(void) { + D_801995A8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019A8DA; +extern u8 D_8019A94E; +extern u8 D_8019A802; +extern u8 D_8019A8BC; +extern u8 D_8019A7E0; +extern u8 D_8019A801; +extern s32 D_8019A8C0; + +void func_8013D330(void) { + if ((D_8019A8DA & 0xff) != D_8019A94E) { + D_8019A8DA = ((D_8019A8DA & 0xff) < D_8019A94E) ? (D_8019A8DA + 1) : (D_8019A8DA - 1); + } + if ((D_8019A802 & 0xff) != D_8019A8BC) { + D_8019A802 = ((D_8019A802 & 0xff) < D_8019A8BC) ? (D_8019A802 + 1) : (D_8019A802 - 1); + } + if ((D_8019A7E0 & 0xff) != D_8019A801) { + D_8019A7E0 = ((D_8019A7E0 & 0xff) < D_8019A801) ? (D_8019A7E0 + 1) : (D_8019A7E0 - 1); + } + D_8019A8C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80199580; +extern void *D_80199584; +extern void *D_80199588; +extern s32 D_801995B0; +extern s32 D_801995B4; +extern s32 D_801995B8; +extern s32 D_8019A834[]; + +extern u8 D_801812F4[]; +extern u8 D_8018139C[]; +extern u8 D_8018124C[]; +extern u8 D_80181348[]; +extern u8 D_801813C8[]; +extern u8 D_801812A0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801995B0 = param_2; + D_801995B4 = (param_2 >> 2) & 3; + D_801995B8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80199580 = D_801812F4; + D_80199584 = D_8018139C; + D_80199588 = D_8018124C; + } else { + D_80199580 = D_80181348; + D_80199584 = D_801813C8; + D_80199588 = D_801812A0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801995B8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801995B0 & 2) != 0) { + D_8019A834[0] = 0x140; + D_8019A834[3] = 0x80; + if (p[0x37] == 4) { + D_8019A834[0] = 0x140; + D_8019A834[3] = 0; + } + if (p[0x37] == 0) { + D_8019A834[0] = 0x140; + D_8019A834[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80199588)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80199588; +extern s16 *D_8019958C; +extern s32 D_8019959C; +extern s32 D_801995BC; +extern s32 D_801995C0; +extern s32 D_801995C4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019958C != 0) { + D_8019959C = 0; + p = (int *)(param_1 * 12 + (int)D_80199588); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801995BC != x) { + flag = 1; + if (D_801995BC < x) { + if (x - D_801995BC < 5) { + D_801995BC = x; + } else { + D_801995BC = D_801995BC + 4; + } + } else { + if (D_801995BC - x < 5) { + D_801995BC = x; + } else { + D_801995BC = D_801995BC - 4; + } + } + } + if (D_801995C0 != y) { + flag = 1; + if (D_801995C0 < y) { + if (y - D_801995C0 < 5) { + D_801995C0 = y; + } else { + D_801995C0 = D_801995C0 + 4; + } + } else { + if (D_801995C0 - y < 5) { + D_801995C0 = y; + } else { + D_801995C0 = D_801995C0 - 4; + } + } + } + if (D_801995C4 != z) { + flag = 1; + if (D_801995C4 < z) { + if (z - D_801995C4 < 5) { + D_801995C4 = z; + } else { + D_801995C4 = D_801995C4 + 4; + } + } else { + if (D_801995C4 - z < 5) { + D_801995C4 = z; + } else { + D_801995C4 = D_801995C4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019959C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80181458[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019958C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801995BC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801995C0); + uVar5 = (*(int*)&D_801995C4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80181458); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801995A4; + +s32 func_8013E054(void) { + return D_801995A4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80181E54; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80181E2C; +extern s16 D_80181E2E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80181E54; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80181E2C = 2; + D_80181E2E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80181E2E = 0; + D_80181E2C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801995D8; + extern void * D_801995DC; + extern unsigned char D_80181ACC; + extern unsigned char D_80181AE4; + extern unsigned char D_80181B58; + extern unsigned char D_80181B60; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801995D8 = &D_80181ACC; + D_801995DC = &D_80181B58; + } else { + D_801995D8 = &D_80181AE4; + D_801995DC = &D_80181B60; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80181E54/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80181E54 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80181E54)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80181E30; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181E30)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181E30)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80181E2C; +extern s16 D_80181E2E; +extern unsigned char D_80181E30; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181E2E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80181E2C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80181E2E; + if (*r < 3) { + *r = *r + 1; + } + D_80181E2C = (u16)D_80181E2C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181E30); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80181E30; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181E30); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_096/nonmatchings/ov_SC03_096_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_097/ov_SC03_097_jr_8012ACE0.c b/src/ov_SC03_097/ov_SC03_097_jr_8012ACE0.c index b8fae4d52..6aff3d833 100644 --- a/src/ov_SC03_097/ov_SC03_097_jr_8012ACE0.c +++ b/src/ov_SC03_097/ov_SC03_097_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186498[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186498[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801864DC; -extern u8 D_80186520; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801864DC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80186520 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80186564[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801865A0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801865A0; - if (((s16)a1) < 0xC00) { - tbl = D_80186564; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801865DC, D_801865DE, D_801865E0, D_801865E2, D_801865E4, D_801865E6; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801865DE < ang)) goto outer_else; - if (!(ang < D_801865E4)) goto inner_else; - if (ang < D_801865E0) { *(s16 *)L = D_801865E0; goto done; } - if (D_801865E2 < ang) { *(s16 *)L = D_801865E2; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801865DC) { *(s16 *)L = D_801865DC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801865E6 < ang) { *(s16 *)L = D_801865E6; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A9600; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A9600, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A9600; -extern s8 D_801A9604; -extern s8 D_801A9605; - -void func_8013C9C4(void * arg0) -{ - D_801A9600 = arg0; - D_801A9604 = 0; - D_801A9605 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A9600; -extern s8 D_801A9604; -extern s8 D_801A9605; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A9600; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A9605; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A9604)) * 2) + D_801A9600); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A9605 = (unsigned char) p[1]; - D_801A9604 = D_801A9604 + 1; - if (D_801A9605 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A9604 = 0; - *base = 0; - } - } - else - { - D_801A9605 = c - 1; - } - } - return; -} - - - -extern s32 D_801A9624; -extern s32 D_801A9618; -extern s32 D_801A961C; -extern s32 D_801A9628; - -void func_8013CABC(void) { - D_801A9624 = 1; - D_801A9618 = 1; - D_801A961C = 0; - D_801A9628 = 1; -} - - - -extern s32 D_801A9618; -extern s32 D_801A961C; -extern s32 D_801A9620; -extern s32 D_801A9624; -extern s32 D_801A9628; - -void func_8013CAE8(void) { - D_801A9618 = 1; - D_801A9624 = 0; - D_801A961C = 0; - D_801A9620 = -1; - D_801A9628 = 0; -} - - - -extern s32 D_801A9624; -extern s32 D_801A9628; -extern s32 D_801A9650; -extern s32 D_801A9654; - -void func_8013CB20(void) -{ - D_801A9650 = D_801A9628; - D_801A9654 = D_801A9624; - D_801A9628 = 1; - D_801A9624 = 0; -} - - - -extern s32 D_801A9650; -extern s32 D_801A9654; -extern s32 D_801A9628; -extern s32 D_801A9624; - -void func_8013CB5C(void) { - D_801A9628 = D_801A9650; - D_801A9624 = D_801A9654; -} - - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AAD78; - extern u8 D_801AAD79; - extern u8 D_801AAD7A; - extern u8 D_801AAD7B; - extern u8 D_801AAD7C; - extern u8 D_801AAD7D; - extern u8 D_801AAD7E; - extern u8 D_801AAD7F; - extern u8 D_801AAD80; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AAD78; t1 = D_801AAD79; t2 = D_801AAD7A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AAD7B; t1 = D_801AAD7C; t2 = D_801AAD7D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AAD7E; t1 = D_801AAD7F; t2 = D_801AAD80; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A9630; -extern s32 D_801A9618; -extern s32 D_801A9634; -extern s32 D_801A9624; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A9630 != 0) { - if (D_801A9630 != 2) { - if (((D_801A9630 < 3) && (D_801A9630 == 1)) && - (D_801A9634 = D_801A9634 + 1, 0x23a < D_801A9634)) { - D_801A9618 = D_801A9630; - D_801A9630 = 2; - } - } else { - D_801A9618 = D_801A9618 + -1; - if (D_801A9618 == 0) { - D_801A9618 = D_801A9630; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A9624 == 0) { - D_801A9630 = D_801A9630 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A9624; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A9624; -} - - - -extern s32 D_801A9630; - -void func_8013D164(void) { - D_801A9630 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AAE5A; -extern u8 D_801AAECE; -extern u8 D_801AAD82; -extern u8 D_801AAE3C; -extern u8 D_801AAD60; -extern u8 D_801AAD81; -extern s32 D_801AAE40; - -void func_8013D330(void) { - if ((D_801AAE5A & 0xff) != D_801AAECE) { - D_801AAE5A = ((D_801AAE5A & 0xff) < D_801AAECE) ? (D_801AAE5A + 1) : (D_801AAE5A - 1); - } - if ((D_801AAD82 & 0xff) != D_801AAE3C) { - D_801AAD82 = ((D_801AAD82 & 0xff) < D_801AAE3C) ? (D_801AAD82 + 1) : (D_801AAD82 - 1); - } - if ((D_801AAD60 & 0xff) != D_801AAD81) { - D_801AAD60 = ((D_801AAD60 & 0xff) < D_801AAD81) ? (D_801AAD60 + 1) : (D_801AAD60 - 1); - } - D_801AAE40 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A9608; -extern void *D_801A960C; -extern void *D_801A9610; -extern s32 D_801A9638; -extern s32 D_801A963C; -extern s32 D_801A9640; -extern s32 D_801AADB4[]; - -extern u8 D_801866D4[]; -extern u8 D_8018677C[]; -extern u8 D_8018662C[]; -extern u8 D_80186728[]; -extern u8 D_801867A8[]; -extern u8 D_80186680[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A9638 = param_2; - D_801A963C = (param_2 >> 2) & 3; - D_801A9640 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A9608 = D_801866D4; - D_801A960C = D_8018677C; - D_801A9610 = D_8018662C; - } else { - D_801A9608 = D_80186728; - D_801A960C = D_801867A8; - D_801A9610 = D_80186680; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A9640 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A9638 & 2) != 0) { - D_801AADB4[0] = 0x140; - D_801AADB4[3] = 0x80; - if (p[0x37] == 4) { - D_801AADB4[0] = 0x140; - D_801AADB4[3] = 0; - } - if (p[0x37] == 0) { - D_801AADB4[0] = 0x140; - D_801AADB4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A9610)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A9610; -extern s16 *D_801A9614; -extern s32 D_801A9624; -extern s32 D_801A9644; -extern s32 D_801A9648; -extern s32 D_801A964C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A9614 != 0) { - D_801A9624 = 0; - p = (int *)(param_1 * 12 + (int)D_801A9610); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A9644 != x) { - flag = 1; - if (D_801A9644 < x) { - if (x - D_801A9644 < 5) { - D_801A9644 = x; - } else { - D_801A9644 = D_801A9644 + 4; - } - } else { - if (D_801A9644 - x < 5) { - D_801A9644 = x; - } else { - D_801A9644 = D_801A9644 - 4; - } - } - } - if (D_801A9648 != y) { - flag = 1; - if (D_801A9648 < y) { - if (y - D_801A9648 < 5) { - D_801A9648 = y; - } else { - D_801A9648 = D_801A9648 + 4; - } - } else { - if (D_801A9648 - y < 5) { - D_801A9648 = y; - } else { - D_801A9648 = D_801A9648 - 4; - } - } - } - if (D_801A964C != z) { - flag = 1; - if (D_801A964C < z) { - if (z - D_801A964C < 5) { - D_801A964C = z; - } else { - D_801A964C = D_801A964C + 4; - } - } else { - if (D_801A964C - z < 5) { - D_801A964C = z; - } else { - D_801A964C = D_801A964C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A9624 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80186838[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A9614); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A9644); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A9648); - uVar5 = (*(int*)&D_801A964C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80186838); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A962C; - -s32 func_8013E054(void) { - return D_801A962C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187234; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018720C; -extern s16 D_8018720E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187234; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018720C = 2; - D_8018720E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018720E = 0; - D_8018720C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A9660; - extern void * D_801A9664; - extern unsigned char D_80186EAC; - extern unsigned char D_80186EC4; - extern unsigned char D_80186F38; - extern unsigned char D_80186F40; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A9660 = &D_80186EAC; - D_801A9664 = &D_80186F38; - } else { - D_801A9660 = &D_80186EC4; - D_801A9664 = &D_80186F40; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187234/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187234 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187234)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187210; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187210)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187210)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018720C; -extern s16 D_8018720E; -extern unsigned char D_80187210; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018720E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018720C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018720E; - if (*r < 3) { - *r = *r + 1; - } - D_8018720C = (u16)D_8018720C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187210); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187210; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187210); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_097/ov_SC03_097_jr_801380E0.c b/src/ov_SC03_097/ov_SC03_097_jr_801380E0.c new file mode 100644 index 000000000..bbe060592 --- /dev/null +++ b/src/ov_SC03_097/ov_SC03_097_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A835C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018612C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A951C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AAE60; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A835C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80185E68)(); +extern s16 (*D_80185E6C)(); +extern M2C_UNK (*D_80185E74)(); +extern s32 (*D_80185E78)(); +extern s32 D_801A9518; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A8360; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801861C0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801896A4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801861D8; +extern M2C_UNK D_801861E0; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801861E8; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186204[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186210[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186224[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186274[]; +extern s16 D_801862A4[]; +extern s16 D_80186304[]; +extern s16 D_8018630C[]; +extern s16 D_8018632C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80186364[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801863BC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80186404[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018640C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186414[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018641C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801863C4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801863E4; +extern void func_801321B0(int param_1); +extern int D_801863F4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A9588; +extern s32 D_801A958C[]; +extern int D_801A9590; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186428; +extern u8 D_80186424; +extern s16 *D_8018642C; +extern u8 D_80186430; +extern int D_801A9588; +extern u16 D_801A9598; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018642C; /* holds a pointer value (*(u16**)&D_8018642C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186440[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186494; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186498[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186498[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801864DC; +extern u8 D_80186520; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801864DC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80186520 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80186564[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801865A0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801865A0; + if (((s16)a1) < 0xC00) { + tbl = D_80186564; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801865DC, D_801865DE, D_801865E0, D_801865E2, D_801865E4, D_801865E6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801865DE < ang)) goto outer_else; + if (!(ang < D_801865E4)) goto inner_else; + if (ang < D_801865E0) { *(s16 *)L = D_801865E0; goto done; } + if (D_801865E2 < ang) { *(s16 *)L = D_801865E2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801865DC) { *(s16 *)L = D_801865DC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801865E6 < ang) { *(s16 *)L = D_801865E6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A9600; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A9600, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A9600; +extern s8 D_801A9604; +extern s8 D_801A9605; + +void func_8013C9C4(void * arg0) +{ + D_801A9600 = arg0; + D_801A9604 = 0; + D_801A9605 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A9600; +extern s8 D_801A9604; +extern s8 D_801A9605; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A9600; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A9605; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A9604)) * 2) + D_801A9600); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A9605 = (unsigned char) p[1]; + D_801A9604 = D_801A9604 + 1; + if (D_801A9605 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A9604 = 0; + *base = 0; + } + } + else + { + D_801A9605 = c - 1; + } + } + return; +} + + + +extern s32 D_801A9624; +extern s32 D_801A9618; +extern s32 D_801A961C; +extern s32 D_801A9628; + +void func_8013CABC(void) { + D_801A9624 = 1; + D_801A9618 = 1; + D_801A961C = 0; + D_801A9628 = 1; +} + + + +extern s32 D_801A9618; +extern s32 D_801A961C; +extern s32 D_801A9620; +extern s32 D_801A9624; +extern s32 D_801A9628; + +void func_8013CAE8(void) { + D_801A9618 = 1; + D_801A9624 = 0; + D_801A961C = 0; + D_801A9620 = -1; + D_801A9628 = 0; +} + + + +extern s32 D_801A9624; +extern s32 D_801A9628; +extern s32 D_801A9650; +extern s32 D_801A9654; + +void func_8013CB20(void) +{ + D_801A9650 = D_801A9628; + D_801A9654 = D_801A9624; + D_801A9628 = 1; + D_801A9624 = 0; +} + + + +extern s32 D_801A9650; +extern s32 D_801A9654; +extern s32 D_801A9628; +extern s32 D_801A9624; + +void func_8013CB5C(void) { + D_801A9628 = D_801A9650; + D_801A9624 = D_801A9654; +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AAD78; + extern u8 D_801AAD79; + extern u8 D_801AAD7A; + extern u8 D_801AAD7B; + extern u8 D_801AAD7C; + extern u8 D_801AAD7D; + extern u8 D_801AAD7E; + extern u8 D_801AAD7F; + extern u8 D_801AAD80; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AAD78; t1 = D_801AAD79; t2 = D_801AAD7A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AAD7B; t1 = D_801AAD7C; t2 = D_801AAD7D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AAD7E; t1 = D_801AAD7F; t2 = D_801AAD80; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A9630; +extern s32 D_801A9618; +extern s32 D_801A9634; +extern s32 D_801A9624; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A9630 != 0) { + if (D_801A9630 != 2) { + if (((D_801A9630 < 3) && (D_801A9630 == 1)) && + (D_801A9634 = D_801A9634 + 1, 0x23a < D_801A9634)) { + D_801A9618 = D_801A9630; + D_801A9630 = 2; + } + } else { + D_801A9618 = D_801A9618 + -1; + if (D_801A9618 == 0) { + D_801A9618 = D_801A9630; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A9624 == 0) { + D_801A9630 = D_801A9630 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A9624; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A9624; +} + + + +extern s32 D_801A9630; + +void func_8013D164(void) { + D_801A9630 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AAE5A; +extern u8 D_801AAECE; +extern u8 D_801AAD82; +extern u8 D_801AAE3C; +extern u8 D_801AAD60; +extern u8 D_801AAD81; +extern s32 D_801AAE40; + +void func_8013D330(void) { + if ((D_801AAE5A & 0xff) != D_801AAECE) { + D_801AAE5A = ((D_801AAE5A & 0xff) < D_801AAECE) ? (D_801AAE5A + 1) : (D_801AAE5A - 1); + } + if ((D_801AAD82 & 0xff) != D_801AAE3C) { + D_801AAD82 = ((D_801AAD82 & 0xff) < D_801AAE3C) ? (D_801AAD82 + 1) : (D_801AAD82 - 1); + } + if ((D_801AAD60 & 0xff) != D_801AAD81) { + D_801AAD60 = ((D_801AAD60 & 0xff) < D_801AAD81) ? (D_801AAD60 + 1) : (D_801AAD60 - 1); + } + D_801AAE40 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A9608; +extern void *D_801A960C; +extern void *D_801A9610; +extern s32 D_801A9638; +extern s32 D_801A963C; +extern s32 D_801A9640; +extern s32 D_801AADB4[]; + +extern u8 D_801866D4[]; +extern u8 D_8018677C[]; +extern u8 D_8018662C[]; +extern u8 D_80186728[]; +extern u8 D_801867A8[]; +extern u8 D_80186680[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A9638 = param_2; + D_801A963C = (param_2 >> 2) & 3; + D_801A9640 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A9608 = D_801866D4; + D_801A960C = D_8018677C; + D_801A9610 = D_8018662C; + } else { + D_801A9608 = D_80186728; + D_801A960C = D_801867A8; + D_801A9610 = D_80186680; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A9640 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A9638 & 2) != 0) { + D_801AADB4[0] = 0x140; + D_801AADB4[3] = 0x80; + if (p[0x37] == 4) { + D_801AADB4[0] = 0x140; + D_801AADB4[3] = 0; + } + if (p[0x37] == 0) { + D_801AADB4[0] = 0x140; + D_801AADB4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A9610)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A9610; +extern s16 *D_801A9614; +extern s32 D_801A9624; +extern s32 D_801A9644; +extern s32 D_801A9648; +extern s32 D_801A964C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A9614 != 0) { + D_801A9624 = 0; + p = (int *)(param_1 * 12 + (int)D_801A9610); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A9644 != x) { + flag = 1; + if (D_801A9644 < x) { + if (x - D_801A9644 < 5) { + D_801A9644 = x; + } else { + D_801A9644 = D_801A9644 + 4; + } + } else { + if (D_801A9644 - x < 5) { + D_801A9644 = x; + } else { + D_801A9644 = D_801A9644 - 4; + } + } + } + if (D_801A9648 != y) { + flag = 1; + if (D_801A9648 < y) { + if (y - D_801A9648 < 5) { + D_801A9648 = y; + } else { + D_801A9648 = D_801A9648 + 4; + } + } else { + if (D_801A9648 - y < 5) { + D_801A9648 = y; + } else { + D_801A9648 = D_801A9648 - 4; + } + } + } + if (D_801A964C != z) { + flag = 1; + if (D_801A964C < z) { + if (z - D_801A964C < 5) { + D_801A964C = z; + } else { + D_801A964C = D_801A964C + 4; + } + } else { + if (D_801A964C - z < 5) { + D_801A964C = z; + } else { + D_801A964C = D_801A964C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A9624 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80186838[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A9614); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A9644); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A9648); + uVar5 = (*(int*)&D_801A964C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80186838); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A962C; + +s32 func_8013E054(void) { + return D_801A962C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187234; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018720C; +extern s16 D_8018720E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187234; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018720C = 2; + D_8018720E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018720E = 0; + D_8018720C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A9660; + extern void * D_801A9664; + extern unsigned char D_80186EAC; + extern unsigned char D_80186EC4; + extern unsigned char D_80186F38; + extern unsigned char D_80186F40; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A9660 = &D_80186EAC; + D_801A9664 = &D_80186F38; + } else { + D_801A9660 = &D_80186EC4; + D_801A9664 = &D_80186F40; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187234/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187234 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187234)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187210; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187210)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187210)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018720C; +extern s16 D_8018720E; +extern unsigned char D_80187210; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018720E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018720C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018720E; + if (*r < 3) { + *r = *r + 1; + } + D_8018720C = (u16)D_8018720C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187210); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187210; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187210); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_098/ov_SC03_098_jr_8012ACE0.c b/src/ov_SC03_098/ov_SC03_098_jr_8012ACE0.c index 105766af1..0d6263b99 100644 --- a/src/ov_SC03_098/ov_SC03_098_jr_8012ACE0.c +++ b/src/ov_SC03_098/ov_SC03_098_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185924[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185924[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80185968; -extern u8 D_801859AC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80185968; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801859AC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801859F0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80185A2C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80185A2C; - if (((s16)a1) < 0xC00) { - tbl = D_801859F0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185A68, D_80185A6A, D_80185A6C, D_80185A6E, D_80185A70, D_80185A72; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185A6A < ang)) goto outer_else; - if (!(ang < D_80185A70)) goto inner_else; - if (ang < D_80185A6C) { *(s16 *)L = D_80185A6C; goto done; } - if (D_80185A6E < ang) { *(s16 *)L = D_80185A6E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185A68) { *(s16 *)L = D_80185A68; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80185A72 < ang) { *(s16 *)L = D_80185A72; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C4270; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C4270, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C4270; -extern s8 D_801C4274; -extern s8 D_801C4275; - -void func_8013C9C4(void * arg0) -{ - D_801C4270 = arg0; - D_801C4274 = 0; - D_801C4275 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C4270; -extern s8 D_801C4274; -extern s8 D_801C4275; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C4270; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C4275; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C4274)) * 2) + D_801C4270); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C4275 = (unsigned char) p[1]; - D_801C4274 = D_801C4274 + 1; - if (D_801C4275 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C4274 = 0; - *base = 0; - } - } - else - { - D_801C4275 = c - 1; - } - } - return; -} - - - -extern s32 D_801C4294; -extern s32 D_801C4288; -extern s32 D_801C428C; -extern s32 D_801C4298; - -void func_8013CABC(void) { - D_801C4294 = 1; - D_801C4288 = 1; - D_801C428C = 0; - D_801C4298 = 1; -} - - - -extern s32 D_801C4288; -extern s32 D_801C428C; -extern s32 D_801C4290; -extern s32 D_801C4294; -extern s32 D_801C4298; - -void func_8013CAE8(void) { - D_801C4288 = 1; - D_801C4294 = 0; - D_801C428C = 0; - D_801C4290 = -1; - D_801C4298 = 0; -} - - - -extern s32 D_801C4294; -extern s32 D_801C4298; -extern s32 D_801C42C0; -extern s32 D_801C42C4; - -void func_8013CB20(void) -{ - D_801C42C0 = D_801C4298; - D_801C42C4 = D_801C4294; - D_801C4298 = 1; - D_801C4294 = 0; -} - - - -extern s32 D_801C42C0; -extern s32 D_801C42C4; -extern s32 D_801C4298; -extern s32 D_801C4294; - -void func_8013CB5C(void) { - D_801C4298 = D_801C42C0; - D_801C4294 = D_801C42C4; -} - - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C5760; - extern u8 D_801C5761; - extern u8 D_801C5762; - extern u8 D_801C5763; - extern u8 D_801C5764; - extern u8 D_801C5765; - extern u8 D_801C5766; - extern u8 D_801C5767; - extern u8 D_801C5768; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C5760; t1 = D_801C5761; t2 = D_801C5762; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C5763; t1 = D_801C5764; t2 = D_801C5765; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C5766; t1 = D_801C5767; t2 = D_801C5768; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C42A0; -extern s32 D_801C4288; -extern s32 D_801C42A4; -extern s32 D_801C4294; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C42A0 != 0) { - if (D_801C42A0 != 2) { - if (((D_801C42A0 < 3) && (D_801C42A0 == 1)) && - (D_801C42A4 = D_801C42A4 + 1, 0x23a < D_801C42A4)) { - D_801C4288 = D_801C42A0; - D_801C42A0 = 2; - } - } else { - D_801C4288 = D_801C4288 + -1; - if (D_801C4288 == 0) { - D_801C4288 = D_801C42A0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C4294 == 0) { - D_801C42A0 = D_801C42A0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C4294; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C4294; -} - - - -extern s32 D_801C42A0; - -void func_8013D164(void) { - D_801C42A0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C5842; -extern u8 D_801C58B6; -extern u8 D_801C576A; -extern u8 D_801C5824; -extern u8 D_801C5748; -extern u8 D_801C5769; -extern s32 D_801C5828; - -void func_8013D330(void) { - if ((D_801C5842 & 0xff) != D_801C58B6) { - D_801C5842 = ((D_801C5842 & 0xff) < D_801C58B6) ? (D_801C5842 + 1) : (D_801C5842 - 1); - } - if ((D_801C576A & 0xff) != D_801C5824) { - D_801C576A = ((D_801C576A & 0xff) < D_801C5824) ? (D_801C576A + 1) : (D_801C576A - 1); - } - if ((D_801C5748 & 0xff) != D_801C5769) { - D_801C5748 = ((D_801C5748 & 0xff) < D_801C5769) ? (D_801C5748 + 1) : (D_801C5748 - 1); - } - D_801C5828 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C4278; -extern void *D_801C427C; -extern void *D_801C4280; -extern s32 D_801C42A8; -extern s32 D_801C42AC; -extern s32 D_801C42B0; -extern s32 D_801C579C[]; - -extern u8 D_80185B60[]; -extern u8 D_80185C08[]; -extern u8 D_80185AB8[]; -extern u8 D_80185BB4[]; -extern u8 D_80185C34[]; -extern u8 D_80185B0C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C42A8 = param_2; - D_801C42AC = (param_2 >> 2) & 3; - D_801C42B0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C4278 = D_80185B60; - D_801C427C = D_80185C08; - D_801C4280 = D_80185AB8; - } else { - D_801C4278 = D_80185BB4; - D_801C427C = D_80185C34; - D_801C4280 = D_80185B0C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C42B0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C42A8 & 2) != 0) { - D_801C579C[0] = 0x140; - D_801C579C[3] = 0x80; - if (p[0x37] == 4) { - D_801C579C[0] = 0x140; - D_801C579C[3] = 0; - } - if (p[0x37] == 0) { - D_801C579C[0] = 0x140; - D_801C579C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C4280)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C4280; -extern s16 *D_801C4284; -extern s32 D_801C4294; -extern s32 D_801C42B4; -extern s32 D_801C42B8; -extern s32 D_801C42BC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C4284 != 0) { - D_801C4294 = 0; - p = (int *)(param_1 * 12 + (int)D_801C4280); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C42B4 != x) { - flag = 1; - if (D_801C42B4 < x) { - if (x - D_801C42B4 < 5) { - D_801C42B4 = x; - } else { - D_801C42B4 = D_801C42B4 + 4; - } - } else { - if (D_801C42B4 - x < 5) { - D_801C42B4 = x; - } else { - D_801C42B4 = D_801C42B4 - 4; - } - } - } - if (D_801C42B8 != y) { - flag = 1; - if (D_801C42B8 < y) { - if (y - D_801C42B8 < 5) { - D_801C42B8 = y; - } else { - D_801C42B8 = D_801C42B8 + 4; - } - } else { - if (D_801C42B8 - y < 5) { - D_801C42B8 = y; - } else { - D_801C42B8 = D_801C42B8 - 4; - } - } - } - if (D_801C42BC != z) { - flag = 1; - if (D_801C42BC < z) { - if (z - D_801C42BC < 5) { - D_801C42BC = z; - } else { - D_801C42BC = D_801C42BC + 4; - } - } else { - if (D_801C42BC - z < 5) { - D_801C42BC = z; - } else { - D_801C42BC = D_801C42BC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C4294 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185CC4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C4284); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C42B4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C42B8); - uVar5 = (*(int*)&D_801C42BC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185CC4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C429C; - -s32 func_8013E054(void) { - return D_801C429C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801866C0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186698; -extern s16 D_8018669A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801866C0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186698 = 2; - D_8018669A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018669A = 0; - D_80186698 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C42D0; - extern void * D_801C42D4; - extern unsigned char D_80186338; - extern unsigned char D_80186350; - extern unsigned char D_801863C4; - extern unsigned char D_801863CC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C42D0 = &D_80186338; - D_801C42D4 = &D_801863C4; - } else { - D_801C42D0 = &D_80186350; - D_801C42D4 = &D_801863CC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801866C0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801866C0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801866C0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018669C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018669C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018669C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186698; -extern s16 D_8018669A; -extern unsigned char D_8018669C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018669A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186698` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018669A; - if (*r < 3) { - *r = *r + 1; - } - D_80186698 = (u16)D_80186698 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018669C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018669C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018669C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_098/ov_SC03_098_jr_801380E0.c b/src/ov_SC03_098/ov_SC03_098_jr_801380E0.c new file mode 100644 index 000000000..8c691b27a --- /dev/null +++ b/src/ov_SC03_098/ov_SC03_098_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C2FE0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801855B8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C418C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C5848; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C2FE0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801852F4)(); +extern s16 (*D_801852F8)(); +extern M2C_UNK (*D_80185300)(); +extern s32 (*D_80185304)(); +extern s32 D_801C4188; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C2FE4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018564C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80188B30; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185664; +extern M2C_UNK D_8018566C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185674; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185690[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018569C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801856B0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185700[]; +extern s16 D_80185730[]; +extern s16 D_80185790[]; +extern s16 D_80185798[]; +extern s16 D_801857B8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801857F0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185848[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185890[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185898[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801858A0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801858A8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80185850; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80185870; +extern void func_801321B0(int param_1); +extern int D_80185880; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C41F8; +extern s32 D_801C41FC[]; +extern int D_801C4200; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801858B4; +extern u8 D_801858B0; +extern s16 *D_801858B8; +extern u8 D_801858BC; +extern int D_801C41F8; +extern u16 D_801C4208; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801858B8; /* holds a pointer value (*(u16**)&D_801858B8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801858CC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185920; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185924[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185924[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80185968; +extern u8 D_801859AC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80185968; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801859AC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801859F0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80185A2C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80185A2C; + if (((s16)a1) < 0xC00) { + tbl = D_801859F0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185A68, D_80185A6A, D_80185A6C, D_80185A6E, D_80185A70, D_80185A72; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185A6A < ang)) goto outer_else; + if (!(ang < D_80185A70)) goto inner_else; + if (ang < D_80185A6C) { *(s16 *)L = D_80185A6C; goto done; } + if (D_80185A6E < ang) { *(s16 *)L = D_80185A6E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185A68) { *(s16 *)L = D_80185A68; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185A72 < ang) { *(s16 *)L = D_80185A72; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C4270; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C4270, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C4270; +extern s8 D_801C4274; +extern s8 D_801C4275; + +void func_8013C9C4(void * arg0) +{ + D_801C4270 = arg0; + D_801C4274 = 0; + D_801C4275 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C4270; +extern s8 D_801C4274; +extern s8 D_801C4275; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C4270; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C4275; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C4274)) * 2) + D_801C4270); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C4275 = (unsigned char) p[1]; + D_801C4274 = D_801C4274 + 1; + if (D_801C4275 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C4274 = 0; + *base = 0; + } + } + else + { + D_801C4275 = c - 1; + } + } + return; +} + + + +extern s32 D_801C4294; +extern s32 D_801C4288; +extern s32 D_801C428C; +extern s32 D_801C4298; + +void func_8013CABC(void) { + D_801C4294 = 1; + D_801C4288 = 1; + D_801C428C = 0; + D_801C4298 = 1; +} + + + +extern s32 D_801C4288; +extern s32 D_801C428C; +extern s32 D_801C4290; +extern s32 D_801C4294; +extern s32 D_801C4298; + +void func_8013CAE8(void) { + D_801C4288 = 1; + D_801C4294 = 0; + D_801C428C = 0; + D_801C4290 = -1; + D_801C4298 = 0; +} + + + +extern s32 D_801C4294; +extern s32 D_801C4298; +extern s32 D_801C42C0; +extern s32 D_801C42C4; + +void func_8013CB20(void) +{ + D_801C42C0 = D_801C4298; + D_801C42C4 = D_801C4294; + D_801C4298 = 1; + D_801C4294 = 0; +} + + + +extern s32 D_801C42C0; +extern s32 D_801C42C4; +extern s32 D_801C4298; +extern s32 D_801C4294; + +void func_8013CB5C(void) { + D_801C4298 = D_801C42C0; + D_801C4294 = D_801C42C4; +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C5760; + extern u8 D_801C5761; + extern u8 D_801C5762; + extern u8 D_801C5763; + extern u8 D_801C5764; + extern u8 D_801C5765; + extern u8 D_801C5766; + extern u8 D_801C5767; + extern u8 D_801C5768; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C5760; t1 = D_801C5761; t2 = D_801C5762; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C5763; t1 = D_801C5764; t2 = D_801C5765; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C5766; t1 = D_801C5767; t2 = D_801C5768; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C42A0; +extern s32 D_801C4288; +extern s32 D_801C42A4; +extern s32 D_801C4294; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C42A0 != 0) { + if (D_801C42A0 != 2) { + if (((D_801C42A0 < 3) && (D_801C42A0 == 1)) && + (D_801C42A4 = D_801C42A4 + 1, 0x23a < D_801C42A4)) { + D_801C4288 = D_801C42A0; + D_801C42A0 = 2; + } + } else { + D_801C4288 = D_801C4288 + -1; + if (D_801C4288 == 0) { + D_801C4288 = D_801C42A0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C4294 == 0) { + D_801C42A0 = D_801C42A0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C4294; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C4294; +} + + + +extern s32 D_801C42A0; + +void func_8013D164(void) { + D_801C42A0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C5842; +extern u8 D_801C58B6; +extern u8 D_801C576A; +extern u8 D_801C5824; +extern u8 D_801C5748; +extern u8 D_801C5769; +extern s32 D_801C5828; + +void func_8013D330(void) { + if ((D_801C5842 & 0xff) != D_801C58B6) { + D_801C5842 = ((D_801C5842 & 0xff) < D_801C58B6) ? (D_801C5842 + 1) : (D_801C5842 - 1); + } + if ((D_801C576A & 0xff) != D_801C5824) { + D_801C576A = ((D_801C576A & 0xff) < D_801C5824) ? (D_801C576A + 1) : (D_801C576A - 1); + } + if ((D_801C5748 & 0xff) != D_801C5769) { + D_801C5748 = ((D_801C5748 & 0xff) < D_801C5769) ? (D_801C5748 + 1) : (D_801C5748 - 1); + } + D_801C5828 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C4278; +extern void *D_801C427C; +extern void *D_801C4280; +extern s32 D_801C42A8; +extern s32 D_801C42AC; +extern s32 D_801C42B0; +extern s32 D_801C579C[]; + +extern u8 D_80185B60[]; +extern u8 D_80185C08[]; +extern u8 D_80185AB8[]; +extern u8 D_80185BB4[]; +extern u8 D_80185C34[]; +extern u8 D_80185B0C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C42A8 = param_2; + D_801C42AC = (param_2 >> 2) & 3; + D_801C42B0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C4278 = D_80185B60; + D_801C427C = D_80185C08; + D_801C4280 = D_80185AB8; + } else { + D_801C4278 = D_80185BB4; + D_801C427C = D_80185C34; + D_801C4280 = D_80185B0C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C42B0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C42A8 & 2) != 0) { + D_801C579C[0] = 0x140; + D_801C579C[3] = 0x80; + if (p[0x37] == 4) { + D_801C579C[0] = 0x140; + D_801C579C[3] = 0; + } + if (p[0x37] == 0) { + D_801C579C[0] = 0x140; + D_801C579C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C4280)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C4280; +extern s16 *D_801C4284; +extern s32 D_801C4294; +extern s32 D_801C42B4; +extern s32 D_801C42B8; +extern s32 D_801C42BC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C4284 != 0) { + D_801C4294 = 0; + p = (int *)(param_1 * 12 + (int)D_801C4280); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C42B4 != x) { + flag = 1; + if (D_801C42B4 < x) { + if (x - D_801C42B4 < 5) { + D_801C42B4 = x; + } else { + D_801C42B4 = D_801C42B4 + 4; + } + } else { + if (D_801C42B4 - x < 5) { + D_801C42B4 = x; + } else { + D_801C42B4 = D_801C42B4 - 4; + } + } + } + if (D_801C42B8 != y) { + flag = 1; + if (D_801C42B8 < y) { + if (y - D_801C42B8 < 5) { + D_801C42B8 = y; + } else { + D_801C42B8 = D_801C42B8 + 4; + } + } else { + if (D_801C42B8 - y < 5) { + D_801C42B8 = y; + } else { + D_801C42B8 = D_801C42B8 - 4; + } + } + } + if (D_801C42BC != z) { + flag = 1; + if (D_801C42BC < z) { + if (z - D_801C42BC < 5) { + D_801C42BC = z; + } else { + D_801C42BC = D_801C42BC + 4; + } + } else { + if (D_801C42BC - z < 5) { + D_801C42BC = z; + } else { + D_801C42BC = D_801C42BC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C4294 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185CC4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C4284); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C42B4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C42B8); + uVar5 = (*(int*)&D_801C42BC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185CC4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C429C; + +s32 func_8013E054(void) { + return D_801C429C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801866C0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186698; +extern s16 D_8018669A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801866C0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186698 = 2; + D_8018669A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018669A = 0; + D_80186698 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C42D0; + extern void * D_801C42D4; + extern unsigned char D_80186338; + extern unsigned char D_80186350; + extern unsigned char D_801863C4; + extern unsigned char D_801863CC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C42D0 = &D_80186338; + D_801C42D4 = &D_801863C4; + } else { + D_801C42D0 = &D_80186350; + D_801C42D4 = &D_801863CC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801866C0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801866C0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801866C0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018669C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018669C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018669C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186698; +extern s16 D_8018669A; +extern unsigned char D_8018669C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018669A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186698` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018669A; + if (*r < 3) { + *r = *r + 1; + } + D_80186698 = (u16)D_80186698 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018669C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018669C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018669C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_099/ov_SC03_099_jr_8012ACE0.c b/src/ov_SC03_099/ov_SC03_099_jr_8012ACE0.c index 06f4549a1..77e82b0fd 100644 --- a/src/ov_SC03_099/ov_SC03_099_jr_8012ACE0.c +++ b/src/ov_SC03_099/ov_SC03_099_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80183A24[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80183A24[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80183A68; -extern u8 D_80183AAC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80183A68; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183AAC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183AF0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183B2C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183B2C; - if (((s16)a1) < 0xC00) { - tbl = D_80183AF0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80183B68, D_80183B6A, D_80183B6C, D_80183B6E, D_80183B70, D_80183B72; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80183B6A < ang)) goto outer_else; - if (!(ang < D_80183B70)) goto inner_else; - if (ang < D_80183B6C) { *(s16 *)L = D_80183B6C; goto done; } - if (D_80183B6E < ang) { *(s16 *)L = D_80183B6E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80183B68) { *(s16 *)L = D_80183B68; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80183B72 < ang) { *(s16 *)L = D_80183B72; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801BDF40; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801BDF40, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801BDF40; -extern s8 D_801BDF44; -extern s8 D_801BDF45; - -void func_8013C9C4(void * arg0) -{ - D_801BDF40 = arg0; - D_801BDF44 = 0; - D_801BDF45 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801BDF40; -extern s8 D_801BDF44; -extern s8 D_801BDF45; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801BDF40; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801BDF45; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801BDF44)) * 2) + D_801BDF40); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801BDF45 = (unsigned char) p[1]; - D_801BDF44 = D_801BDF44 + 1; - if (D_801BDF45 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801BDF44 = 0; - *base = 0; - } - } - else - { - D_801BDF45 = c - 1; - } - } - return; -} - - - -extern s32 D_801BDF64; -extern s32 D_801BDF58; -extern s32 D_801BDF5C; -extern s32 D_801BDF68; - -void func_8013CABC(void) { - D_801BDF64 = 1; - D_801BDF58 = 1; - D_801BDF5C = 0; - D_801BDF68 = 1; -} - - - -extern s32 D_801BDF58; -extern s32 D_801BDF5C; -extern s32 D_801BDF60; -extern s32 D_801BDF64; -extern s32 D_801BDF68; - -void func_8013CAE8(void) { - D_801BDF58 = 1; - D_801BDF64 = 0; - D_801BDF5C = 0; - D_801BDF60 = -1; - D_801BDF68 = 0; -} - - - -extern s32 D_801BDF64; -extern s32 D_801BDF68; -extern s32 D_801BDF90; -extern s32 D_801BDF94; - -void func_8013CB20(void) -{ - D_801BDF90 = D_801BDF68; - D_801BDF94 = D_801BDF64; - D_801BDF68 = 1; - D_801BDF64 = 0; -} - - - -extern s32 D_801BDF90; -extern s32 D_801BDF94; -extern s32 D_801BDF68; -extern s32 D_801BDF64; - -void func_8013CB5C(void) { - D_801BDF68 = D_801BDF90; - D_801BDF64 = D_801BDF94; -} - - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801BF308; - extern u8 D_801BF309; - extern u8 D_801BF30A; - extern u8 D_801BF30B; - extern u8 D_801BF30C; - extern u8 D_801BF30D; - extern u8 D_801BF30E; - extern u8 D_801BF30F; - extern u8 D_801BF310; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801BF308; t1 = D_801BF309; t2 = D_801BF30A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801BF30B; t1 = D_801BF30C; t2 = D_801BF30D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801BF30E; t1 = D_801BF30F; t2 = D_801BF310; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801BDF70; -extern s32 D_801BDF58; -extern s32 D_801BDF74; -extern s32 D_801BDF64; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801BDF70 != 0) { - if (D_801BDF70 != 2) { - if (((D_801BDF70 < 3) && (D_801BDF70 == 1)) && - (D_801BDF74 = D_801BDF74 + 1, 0x23a < D_801BDF74)) { - D_801BDF58 = D_801BDF70; - D_801BDF70 = 2; - } - } else { - D_801BDF58 = D_801BDF58 + -1; - if (D_801BDF58 == 0) { - D_801BDF58 = D_801BDF70; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801BDF64 == 0) { - D_801BDF70 = D_801BDF70 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801BDF64; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801BDF64; -} - - - -extern s32 D_801BDF70; - -void func_8013D164(void) { - D_801BDF70 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801BF3EA; -extern u8 D_801BF45E; -extern u8 D_801BF312; -extern u8 D_801BF3CC; -extern u8 D_801BF2F0; -extern u8 D_801BF311; -extern s32 D_801BF3D0; - -void func_8013D330(void) { - if ((D_801BF3EA & 0xff) != D_801BF45E) { - D_801BF3EA = ((D_801BF3EA & 0xff) < D_801BF45E) ? (D_801BF3EA + 1) : (D_801BF3EA - 1); - } - if ((D_801BF312 & 0xff) != D_801BF3CC) { - D_801BF312 = ((D_801BF312 & 0xff) < D_801BF3CC) ? (D_801BF312 + 1) : (D_801BF312 - 1); - } - if ((D_801BF2F0 & 0xff) != D_801BF311) { - D_801BF2F0 = ((D_801BF2F0 & 0xff) < D_801BF311) ? (D_801BF2F0 + 1) : (D_801BF2F0 - 1); - } - D_801BF3D0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801BDF48; -extern void *D_801BDF4C; -extern void *D_801BDF50; -extern s32 D_801BDF78; -extern s32 D_801BDF7C; -extern s32 D_801BDF80; -extern s32 D_801BF344[]; - -extern u8 D_80183C60[]; -extern u8 D_80183D08[]; -extern u8 D_80183BB8[]; -extern u8 D_80183CB4[]; -extern u8 D_80183D34[]; -extern u8 D_80183C0C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801BDF78 = param_2; - D_801BDF7C = (param_2 >> 2) & 3; - D_801BDF80 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801BDF48 = D_80183C60; - D_801BDF4C = D_80183D08; - D_801BDF50 = D_80183BB8; - } else { - D_801BDF48 = D_80183CB4; - D_801BDF4C = D_80183D34; - D_801BDF50 = D_80183C0C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801BDF80 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801BDF78 & 2) != 0) { - D_801BF344[0] = 0x140; - D_801BF344[3] = 0x80; - if (p[0x37] == 4) { - D_801BF344[0] = 0x140; - D_801BF344[3] = 0; - } - if (p[0x37] == 0) { - D_801BF344[0] = 0x140; - D_801BF344[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801BDF50)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801BDF50; -extern s16 *D_801BDF54; -extern s32 D_801BDF64; -extern s32 D_801BDF84; -extern s32 D_801BDF88; -extern s32 D_801BDF8C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801BDF54 != 0) { - D_801BDF64 = 0; - p = (int *)(param_1 * 12 + (int)D_801BDF50); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801BDF84 != x) { - flag = 1; - if (D_801BDF84 < x) { - if (x - D_801BDF84 < 5) { - D_801BDF84 = x; - } else { - D_801BDF84 = D_801BDF84 + 4; - } - } else { - if (D_801BDF84 - x < 5) { - D_801BDF84 = x; - } else { - D_801BDF84 = D_801BDF84 - 4; - } - } - } - if (D_801BDF88 != y) { - flag = 1; - if (D_801BDF88 < y) { - if (y - D_801BDF88 < 5) { - D_801BDF88 = y; - } else { - D_801BDF88 = D_801BDF88 + 4; - } - } else { - if (D_801BDF88 - y < 5) { - D_801BDF88 = y; - } else { - D_801BDF88 = D_801BDF88 - 4; - } - } - } - if (D_801BDF8C != z) { - flag = 1; - if (D_801BDF8C < z) { - if (z - D_801BDF8C < 5) { - D_801BDF8C = z; - } else { - D_801BDF8C = D_801BDF8C + 4; - } - } else { - if (D_801BDF8C - z < 5) { - D_801BDF8C = z; - } else { - D_801BDF8C = D_801BDF8C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801BDF64 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183DC4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801BDF54); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BDF84); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BDF88); - uVar5 = (*(int*)&D_801BDF8C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183DC4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801BDF6C; - -s32 func_8013E054(void) { - return D_801BDF6C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801847C0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80184798; -extern s16 D_8018479A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801847C0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80184798 = 2; - D_8018479A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018479A = 0; - D_80184798 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801BDFA0; - extern void * D_801BDFA4; - extern unsigned char D_80184438; - extern unsigned char D_80184450; - extern unsigned char D_801844C4; - extern unsigned char D_801844CC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801BDFA0 = &D_80184438; - D_801BDFA4 = &D_801844C4; - } else { - D_801BDFA0 = &D_80184450; - D_801BDFA4 = &D_801844CC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801847C0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801847C0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801847C0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018479C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018479C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018479C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80184798; -extern s16 D_8018479A; -extern unsigned char D_8018479C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018479A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80184798` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018479A; - if (*r < 3) { - *r = *r + 1; - } - D_80184798 = (u16)D_80184798 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018479C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018479C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018479C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_099/ov_SC03_099_jr_801380E0.c b/src/ov_SC03_099/ov_SC03_099_jr_801380E0.c new file mode 100644 index 000000000..05ca0ba77 --- /dev/null +++ b/src/ov_SC03_099/ov_SC03_099_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801BCCB4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801836B8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801BDE5C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801BF3F0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801BCCB4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801833F4)(); +extern s16 (*D_801833F8)(); +extern M2C_UNK (*D_80183400)(); +extern s32 (*D_80183404)(); +extern s32 D_801BDE58; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801BCCB8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018374C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80186C30; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80183764; +extern M2C_UNK D_8018376C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80183774; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80183790[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018379C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801837B0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183800[]; +extern s16 D_80183830[]; +extern s16 D_80183890[]; +extern s16 D_80183898[]; +extern s16 D_801838B8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801838F0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80183948[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80183990[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80183998[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801839A0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801839A8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80183950; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80183970; +extern void func_801321B0(int param_1); +extern int D_80183980; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801BDEC8; +extern s32 D_801BDECC[]; +extern int D_801BDED0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801839B4; +extern u8 D_801839B0; +extern s16 *D_801839B8; +extern u8 D_801839BC; +extern int D_801BDEC8; +extern u16 D_801BDED8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801839B8; /* holds a pointer value (*(u16**)&D_801839B8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801839CC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80183A20; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80183A24[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80183A24[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80183A68; +extern u8 D_80183AAC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80183A68; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183AAC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183AF0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183B2C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183B2C; + if (((s16)a1) < 0xC00) { + tbl = D_80183AF0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80183B68, D_80183B6A, D_80183B6C, D_80183B6E, D_80183B70, D_80183B72; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183B6A < ang)) goto outer_else; + if (!(ang < D_80183B70)) goto inner_else; + if (ang < D_80183B6C) { *(s16 *)L = D_80183B6C; goto done; } + if (D_80183B6E < ang) { *(s16 *)L = D_80183B6E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183B68) { *(s16 *)L = D_80183B68; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183B72 < ang) { *(s16 *)L = D_80183B72; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801BDF40; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801BDF40, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801BDF40; +extern s8 D_801BDF44; +extern s8 D_801BDF45; + +void func_8013C9C4(void * arg0) +{ + D_801BDF40 = arg0; + D_801BDF44 = 0; + D_801BDF45 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801BDF40; +extern s8 D_801BDF44; +extern s8 D_801BDF45; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801BDF40; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801BDF45; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801BDF44)) * 2) + D_801BDF40); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801BDF45 = (unsigned char) p[1]; + D_801BDF44 = D_801BDF44 + 1; + if (D_801BDF45 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801BDF44 = 0; + *base = 0; + } + } + else + { + D_801BDF45 = c - 1; + } + } + return; +} + + + +extern s32 D_801BDF64; +extern s32 D_801BDF58; +extern s32 D_801BDF5C; +extern s32 D_801BDF68; + +void func_8013CABC(void) { + D_801BDF64 = 1; + D_801BDF58 = 1; + D_801BDF5C = 0; + D_801BDF68 = 1; +} + + + +extern s32 D_801BDF58; +extern s32 D_801BDF5C; +extern s32 D_801BDF60; +extern s32 D_801BDF64; +extern s32 D_801BDF68; + +void func_8013CAE8(void) { + D_801BDF58 = 1; + D_801BDF64 = 0; + D_801BDF5C = 0; + D_801BDF60 = -1; + D_801BDF68 = 0; +} + + + +extern s32 D_801BDF64; +extern s32 D_801BDF68; +extern s32 D_801BDF90; +extern s32 D_801BDF94; + +void func_8013CB20(void) +{ + D_801BDF90 = D_801BDF68; + D_801BDF94 = D_801BDF64; + D_801BDF68 = 1; + D_801BDF64 = 0; +} + + + +extern s32 D_801BDF90; +extern s32 D_801BDF94; +extern s32 D_801BDF68; +extern s32 D_801BDF64; + +void func_8013CB5C(void) { + D_801BDF68 = D_801BDF90; + D_801BDF64 = D_801BDF94; +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801BF308; + extern u8 D_801BF309; + extern u8 D_801BF30A; + extern u8 D_801BF30B; + extern u8 D_801BF30C; + extern u8 D_801BF30D; + extern u8 D_801BF30E; + extern u8 D_801BF30F; + extern u8 D_801BF310; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801BF308; t1 = D_801BF309; t2 = D_801BF30A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801BF30B; t1 = D_801BF30C; t2 = D_801BF30D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801BF30E; t1 = D_801BF30F; t2 = D_801BF310; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801BDF70; +extern s32 D_801BDF58; +extern s32 D_801BDF74; +extern s32 D_801BDF64; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801BDF70 != 0) { + if (D_801BDF70 != 2) { + if (((D_801BDF70 < 3) && (D_801BDF70 == 1)) && + (D_801BDF74 = D_801BDF74 + 1, 0x23a < D_801BDF74)) { + D_801BDF58 = D_801BDF70; + D_801BDF70 = 2; + } + } else { + D_801BDF58 = D_801BDF58 + -1; + if (D_801BDF58 == 0) { + D_801BDF58 = D_801BDF70; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801BDF64 == 0) { + D_801BDF70 = D_801BDF70 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801BDF64; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801BDF64; +} + + + +extern s32 D_801BDF70; + +void func_8013D164(void) { + D_801BDF70 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801BF3EA; +extern u8 D_801BF45E; +extern u8 D_801BF312; +extern u8 D_801BF3CC; +extern u8 D_801BF2F0; +extern u8 D_801BF311; +extern s32 D_801BF3D0; + +void func_8013D330(void) { + if ((D_801BF3EA & 0xff) != D_801BF45E) { + D_801BF3EA = ((D_801BF3EA & 0xff) < D_801BF45E) ? (D_801BF3EA + 1) : (D_801BF3EA - 1); + } + if ((D_801BF312 & 0xff) != D_801BF3CC) { + D_801BF312 = ((D_801BF312 & 0xff) < D_801BF3CC) ? (D_801BF312 + 1) : (D_801BF312 - 1); + } + if ((D_801BF2F0 & 0xff) != D_801BF311) { + D_801BF2F0 = ((D_801BF2F0 & 0xff) < D_801BF311) ? (D_801BF2F0 + 1) : (D_801BF2F0 - 1); + } + D_801BF3D0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801BDF48; +extern void *D_801BDF4C; +extern void *D_801BDF50; +extern s32 D_801BDF78; +extern s32 D_801BDF7C; +extern s32 D_801BDF80; +extern s32 D_801BF344[]; + +extern u8 D_80183C60[]; +extern u8 D_80183D08[]; +extern u8 D_80183BB8[]; +extern u8 D_80183CB4[]; +extern u8 D_80183D34[]; +extern u8 D_80183C0C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801BDF78 = param_2; + D_801BDF7C = (param_2 >> 2) & 3; + D_801BDF80 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801BDF48 = D_80183C60; + D_801BDF4C = D_80183D08; + D_801BDF50 = D_80183BB8; + } else { + D_801BDF48 = D_80183CB4; + D_801BDF4C = D_80183D34; + D_801BDF50 = D_80183C0C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801BDF80 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801BDF78 & 2) != 0) { + D_801BF344[0] = 0x140; + D_801BF344[3] = 0x80; + if (p[0x37] == 4) { + D_801BF344[0] = 0x140; + D_801BF344[3] = 0; + } + if (p[0x37] == 0) { + D_801BF344[0] = 0x140; + D_801BF344[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801BDF50)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801BDF50; +extern s16 *D_801BDF54; +extern s32 D_801BDF64; +extern s32 D_801BDF84; +extern s32 D_801BDF88; +extern s32 D_801BDF8C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801BDF54 != 0) { + D_801BDF64 = 0; + p = (int *)(param_1 * 12 + (int)D_801BDF50); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801BDF84 != x) { + flag = 1; + if (D_801BDF84 < x) { + if (x - D_801BDF84 < 5) { + D_801BDF84 = x; + } else { + D_801BDF84 = D_801BDF84 + 4; + } + } else { + if (D_801BDF84 - x < 5) { + D_801BDF84 = x; + } else { + D_801BDF84 = D_801BDF84 - 4; + } + } + } + if (D_801BDF88 != y) { + flag = 1; + if (D_801BDF88 < y) { + if (y - D_801BDF88 < 5) { + D_801BDF88 = y; + } else { + D_801BDF88 = D_801BDF88 + 4; + } + } else { + if (D_801BDF88 - y < 5) { + D_801BDF88 = y; + } else { + D_801BDF88 = D_801BDF88 - 4; + } + } + } + if (D_801BDF8C != z) { + flag = 1; + if (D_801BDF8C < z) { + if (z - D_801BDF8C < 5) { + D_801BDF8C = z; + } else { + D_801BDF8C = D_801BDF8C + 4; + } + } else { + if (D_801BDF8C - z < 5) { + D_801BDF8C = z; + } else { + D_801BDF8C = D_801BDF8C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801BDF64 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183DC4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801BDF54); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BDF84); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BDF88); + uVar5 = (*(int*)&D_801BDF8C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183DC4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801BDF6C; + +s32 func_8013E054(void) { + return D_801BDF6C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801847C0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80184798; +extern s16 D_8018479A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801847C0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80184798 = 2; + D_8018479A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018479A = 0; + D_80184798 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801BDFA0; + extern void * D_801BDFA4; + extern unsigned char D_80184438; + extern unsigned char D_80184450; + extern unsigned char D_801844C4; + extern unsigned char D_801844CC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801BDFA0 = &D_80184438; + D_801BDFA4 = &D_801844C4; + } else { + D_801BDFA0 = &D_80184450; + D_801BDFA4 = &D_801844CC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801847C0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801847C0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801847C0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018479C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018479C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018479C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80184798; +extern s16 D_8018479A; +extern unsigned char D_8018479C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018479A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80184798` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018479A; + if (*r < 3) { + *r = *r + 1; + } + D_80184798 = (u16)D_80184798 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018479C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018479C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018479C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_099/nonmatchings/ov_SC03_099_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_100/ov_SC03_100_jr_8012ACE0.c b/src/ov_SC03_100/ov_SC03_100_jr_8012ACE0.c index bf885fa6a..f38398d36 100644 --- a/src/ov_SC03_100/ov_SC03_100_jr_8012ACE0.c +++ b/src/ov_SC03_100/ov_SC03_100_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184EF0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184EF0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184F34; -extern u8 D_80184F78; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184F34; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184F78 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184FBC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80184FF8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80184FF8; - if (((s16)a1) < 0xC00) { - tbl = D_80184FBC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185034, D_80185036, D_80185038, D_8018503A, D_8018503C, D_8018503E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185036 < ang)) goto outer_else; - if (!(ang < D_8018503C)) goto inner_else; - if (ang < D_80185038) { *(s16 *)L = D_80185038; goto done; } - if (D_8018503A < ang) { *(s16 *)L = D_8018503A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185034) { *(s16 *)L = D_80185034; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018503E < ang) { *(s16 *)L = D_8018503E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C71C8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C71C8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C71C8; -extern s8 D_801C71CC; -extern s8 D_801C71CD; - -void func_8013C9C4(void * arg0) -{ - D_801C71C8 = arg0; - D_801C71CC = 0; - D_801C71CD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C71C8; -extern s8 D_801C71CC; -extern s8 D_801C71CD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C71C8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C71CD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C71CC)) * 2) + D_801C71C8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C71CD = (unsigned char) p[1]; - D_801C71CC = D_801C71CC + 1; - if (D_801C71CD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C71CC = 0; - *base = 0; - } - } - else - { - D_801C71CD = c - 1; - } - } - return; -} - - - -extern s32 D_801C71EC; -extern s32 D_801C71E0; -extern s32 D_801C71E4; -extern s32 D_801C71F0; - -void func_8013CABC(void) { - D_801C71EC = 1; - D_801C71E0 = 1; - D_801C71E4 = 0; - D_801C71F0 = 1; -} - - - -extern s32 D_801C71E0; -extern s32 D_801C71E4; -extern s32 D_801C71E8; -extern s32 D_801C71EC; -extern s32 D_801C71F0; - -void func_8013CAE8(void) { - D_801C71E0 = 1; - D_801C71EC = 0; - D_801C71E4 = 0; - D_801C71E8 = -1; - D_801C71F0 = 0; -} - - - -extern s32 D_801C71EC; -extern s32 D_801C71F0; -extern s32 D_801C7218; -extern s32 D_801C721C; - -void func_8013CB20(void) -{ - D_801C7218 = D_801C71F0; - D_801C721C = D_801C71EC; - D_801C71F0 = 1; - D_801C71EC = 0; -} - - - -extern s32 D_801C7218; -extern s32 D_801C721C; -extern s32 D_801C71F0; -extern s32 D_801C71EC; - -void func_8013CB5C(void) { - D_801C71F0 = D_801C7218; - D_801C71EC = D_801C721C; -} - - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C8810; - extern u8 D_801C8811; - extern u8 D_801C8812; - extern u8 D_801C8813; - extern u8 D_801C8814; - extern u8 D_801C8815; - extern u8 D_801C8816; - extern u8 D_801C8817; - extern u8 D_801C8818; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C8810; t1 = D_801C8811; t2 = D_801C8812; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C8813; t1 = D_801C8814; t2 = D_801C8815; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C8816; t1 = D_801C8817; t2 = D_801C8818; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C71F8; -extern s32 D_801C71E0; -extern s32 D_801C71FC; -extern s32 D_801C71EC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C71F8 != 0) { - if (D_801C71F8 != 2) { - if (((D_801C71F8 < 3) && (D_801C71F8 == 1)) && - (D_801C71FC = D_801C71FC + 1, 0x23a < D_801C71FC)) { - D_801C71E0 = D_801C71F8; - D_801C71F8 = 2; - } - } else { - D_801C71E0 = D_801C71E0 + -1; - if (D_801C71E0 == 0) { - D_801C71E0 = D_801C71F8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C71EC == 0) { - D_801C71F8 = D_801C71F8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C71EC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C71EC; -} - - - -extern s32 D_801C71F8; - -void func_8013D164(void) { - D_801C71F8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C88F2; -extern u8 D_801C8966; -extern u8 D_801C881A; -extern u8 D_801C88D4; -extern u8 D_801C87F8; -extern u8 D_801C8819; -extern s32 D_801C88D8; - -void func_8013D330(void) { - if ((D_801C88F2 & 0xff) != D_801C8966) { - D_801C88F2 = ((D_801C88F2 & 0xff) < D_801C8966) ? (D_801C88F2 + 1) : (D_801C88F2 - 1); - } - if ((D_801C881A & 0xff) != D_801C88D4) { - D_801C881A = ((D_801C881A & 0xff) < D_801C88D4) ? (D_801C881A + 1) : (D_801C881A - 1); - } - if ((D_801C87F8 & 0xff) != D_801C8819) { - D_801C87F8 = ((D_801C87F8 & 0xff) < D_801C8819) ? (D_801C87F8 + 1) : (D_801C87F8 - 1); - } - D_801C88D8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C71D0; -extern void *D_801C71D4; -extern void *D_801C71D8; -extern s32 D_801C7200; -extern s32 D_801C7204; -extern s32 D_801C7208; -extern s32 D_801C884C[]; - -extern u8 D_8018512C[]; -extern u8 D_801851D4[]; -extern u8 D_80185084[]; -extern u8 D_80185180[]; -extern u8 D_80185200[]; -extern u8 D_801850D8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C7200 = param_2; - D_801C7204 = (param_2 >> 2) & 3; - D_801C7208 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C71D0 = D_8018512C; - D_801C71D4 = D_801851D4; - D_801C71D8 = D_80185084; - } else { - D_801C71D0 = D_80185180; - D_801C71D4 = D_80185200; - D_801C71D8 = D_801850D8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C7208 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C7200 & 2) != 0) { - D_801C884C[0] = 0x140; - D_801C884C[3] = 0x80; - if (p[0x37] == 4) { - D_801C884C[0] = 0x140; - D_801C884C[3] = 0; - } - if (p[0x37] == 0) { - D_801C884C[0] = 0x140; - D_801C884C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C71D8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C71D8; -extern s16 *D_801C71DC; -extern s32 D_801C71EC; -extern s32 D_801C720C; -extern s32 D_801C7210; -extern s32 D_801C7214; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C71DC != 0) { - D_801C71EC = 0; - p = (int *)(param_1 * 12 + (int)D_801C71D8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C720C != x) { - flag = 1; - if (D_801C720C < x) { - if (x - D_801C720C < 5) { - D_801C720C = x; - } else { - D_801C720C = D_801C720C + 4; - } - } else { - if (D_801C720C - x < 5) { - D_801C720C = x; - } else { - D_801C720C = D_801C720C - 4; - } - } - } - if (D_801C7210 != y) { - flag = 1; - if (D_801C7210 < y) { - if (y - D_801C7210 < 5) { - D_801C7210 = y; - } else { - D_801C7210 = D_801C7210 + 4; - } - } else { - if (D_801C7210 - y < 5) { - D_801C7210 = y; - } else { - D_801C7210 = D_801C7210 - 4; - } - } - } - if (D_801C7214 != z) { - flag = 1; - if (D_801C7214 < z) { - if (z - D_801C7214 < 5) { - D_801C7214 = z; - } else { - D_801C7214 = D_801C7214 + 4; - } - } else { - if (D_801C7214 - z < 5) { - D_801C7214 = z; - } else { - D_801C7214 = D_801C7214 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C71EC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185290[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C71DC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C720C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C7210); - uVar5 = (*(int*)&D_801C7214); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185290); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C71F4; - -s32 func_8013E054(void) { - return D_801C71F4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80185C8C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80185C64; -extern s16 D_80185C66; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80185C8C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80185C64 = 2; - D_80185C66 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80185C66 = 0; - D_80185C64 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C7228; - extern void * D_801C722C; - extern unsigned char D_80185904; - extern unsigned char D_8018591C; - extern unsigned char D_80185990; - extern unsigned char D_80185998; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C7228 = &D_80185904; - D_801C722C = &D_80185990; - } else { - D_801C7228 = &D_8018591C; - D_801C722C = &D_80185998; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80185C8C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185C8C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80185C8C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80185C68; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185C68)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185C68)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80185C64; -extern s16 D_80185C66; -extern unsigned char D_80185C68; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185C66` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80185C64` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80185C66; - if (*r < 3) { - *r = *r + 1; - } - D_80185C64 = (u16)D_80185C64 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C68); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80185C68; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C68); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_100/ov_SC03_100_jr_801380E0.c b/src/ov_SC03_100/ov_SC03_100_jr_801380E0.c new file mode 100644 index 000000000..c3dd3abf9 --- /dev/null +++ b/src/ov_SC03_100/ov_SC03_100_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C5F38; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184B84[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C70E4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C88F8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C5F38; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801848C0)(); +extern s16 (*D_801848C4)(); +extern M2C_UNK (*D_801848CC)(); +extern s32 (*D_801848D0)(); +extern s32 D_801C70E0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C5F3C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80184C18; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801880FC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184C30; +extern M2C_UNK D_80184C38; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184C40; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80184C5C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80184C68[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80184C7C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184CCC[]; +extern s16 D_80184CFC[]; +extern s16 D_80184D5C[]; +extern s16 D_80184D64[]; +extern s16 D_80184D84[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184DBC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80184E14[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80184E5C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80184E64[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184E6C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184E74[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184E1C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184E3C; +extern void func_801321B0(int param_1); +extern int D_80184E4C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C7150; +extern s32 D_801C7154[]; +extern int D_801C7158; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184E80; +extern u8 D_80184E7C; +extern s16 *D_80184E84; +extern u8 D_80184E88; +extern int D_801C7150; +extern u16 D_801C7160; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184E84; /* holds a pointer value (*(u16**)&D_80184E84) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184E98[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184EEC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184EF0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184EF0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184F34; +extern u8 D_80184F78; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184F34; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184F78 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184FBC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80184FF8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80184FF8; + if (((s16)a1) < 0xC00) { + tbl = D_80184FBC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185034, D_80185036, D_80185038, D_8018503A, D_8018503C, D_8018503E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185036 < ang)) goto outer_else; + if (!(ang < D_8018503C)) goto inner_else; + if (ang < D_80185038) { *(s16 *)L = D_80185038; goto done; } + if (D_8018503A < ang) { *(s16 *)L = D_8018503A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185034) { *(s16 *)L = D_80185034; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018503E < ang) { *(s16 *)L = D_8018503E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C71C8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C71C8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C71C8; +extern s8 D_801C71CC; +extern s8 D_801C71CD; + +void func_8013C9C4(void * arg0) +{ + D_801C71C8 = arg0; + D_801C71CC = 0; + D_801C71CD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C71C8; +extern s8 D_801C71CC; +extern s8 D_801C71CD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C71C8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C71CD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C71CC)) * 2) + D_801C71C8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C71CD = (unsigned char) p[1]; + D_801C71CC = D_801C71CC + 1; + if (D_801C71CD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C71CC = 0; + *base = 0; + } + } + else + { + D_801C71CD = c - 1; + } + } + return; +} + + + +extern s32 D_801C71EC; +extern s32 D_801C71E0; +extern s32 D_801C71E4; +extern s32 D_801C71F0; + +void func_8013CABC(void) { + D_801C71EC = 1; + D_801C71E0 = 1; + D_801C71E4 = 0; + D_801C71F0 = 1; +} + + + +extern s32 D_801C71E0; +extern s32 D_801C71E4; +extern s32 D_801C71E8; +extern s32 D_801C71EC; +extern s32 D_801C71F0; + +void func_8013CAE8(void) { + D_801C71E0 = 1; + D_801C71EC = 0; + D_801C71E4 = 0; + D_801C71E8 = -1; + D_801C71F0 = 0; +} + + + +extern s32 D_801C71EC; +extern s32 D_801C71F0; +extern s32 D_801C7218; +extern s32 D_801C721C; + +void func_8013CB20(void) +{ + D_801C7218 = D_801C71F0; + D_801C721C = D_801C71EC; + D_801C71F0 = 1; + D_801C71EC = 0; +} + + + +extern s32 D_801C7218; +extern s32 D_801C721C; +extern s32 D_801C71F0; +extern s32 D_801C71EC; + +void func_8013CB5C(void) { + D_801C71F0 = D_801C7218; + D_801C71EC = D_801C721C; +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C8810; + extern u8 D_801C8811; + extern u8 D_801C8812; + extern u8 D_801C8813; + extern u8 D_801C8814; + extern u8 D_801C8815; + extern u8 D_801C8816; + extern u8 D_801C8817; + extern u8 D_801C8818; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C8810; t1 = D_801C8811; t2 = D_801C8812; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C8813; t1 = D_801C8814; t2 = D_801C8815; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C8816; t1 = D_801C8817; t2 = D_801C8818; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C71F8; +extern s32 D_801C71E0; +extern s32 D_801C71FC; +extern s32 D_801C71EC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C71F8 != 0) { + if (D_801C71F8 != 2) { + if (((D_801C71F8 < 3) && (D_801C71F8 == 1)) && + (D_801C71FC = D_801C71FC + 1, 0x23a < D_801C71FC)) { + D_801C71E0 = D_801C71F8; + D_801C71F8 = 2; + } + } else { + D_801C71E0 = D_801C71E0 + -1; + if (D_801C71E0 == 0) { + D_801C71E0 = D_801C71F8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C71EC == 0) { + D_801C71F8 = D_801C71F8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C71EC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C71EC; +} + + + +extern s32 D_801C71F8; + +void func_8013D164(void) { + D_801C71F8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C88F2; +extern u8 D_801C8966; +extern u8 D_801C881A; +extern u8 D_801C88D4; +extern u8 D_801C87F8; +extern u8 D_801C8819; +extern s32 D_801C88D8; + +void func_8013D330(void) { + if ((D_801C88F2 & 0xff) != D_801C8966) { + D_801C88F2 = ((D_801C88F2 & 0xff) < D_801C8966) ? (D_801C88F2 + 1) : (D_801C88F2 - 1); + } + if ((D_801C881A & 0xff) != D_801C88D4) { + D_801C881A = ((D_801C881A & 0xff) < D_801C88D4) ? (D_801C881A + 1) : (D_801C881A - 1); + } + if ((D_801C87F8 & 0xff) != D_801C8819) { + D_801C87F8 = ((D_801C87F8 & 0xff) < D_801C8819) ? (D_801C87F8 + 1) : (D_801C87F8 - 1); + } + D_801C88D8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C71D0; +extern void *D_801C71D4; +extern void *D_801C71D8; +extern s32 D_801C7200; +extern s32 D_801C7204; +extern s32 D_801C7208; +extern s32 D_801C884C[]; + +extern u8 D_8018512C[]; +extern u8 D_801851D4[]; +extern u8 D_80185084[]; +extern u8 D_80185180[]; +extern u8 D_80185200[]; +extern u8 D_801850D8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C7200 = param_2; + D_801C7204 = (param_2 >> 2) & 3; + D_801C7208 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C71D0 = D_8018512C; + D_801C71D4 = D_801851D4; + D_801C71D8 = D_80185084; + } else { + D_801C71D0 = D_80185180; + D_801C71D4 = D_80185200; + D_801C71D8 = D_801850D8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C7208 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C7200 & 2) != 0) { + D_801C884C[0] = 0x140; + D_801C884C[3] = 0x80; + if (p[0x37] == 4) { + D_801C884C[0] = 0x140; + D_801C884C[3] = 0; + } + if (p[0x37] == 0) { + D_801C884C[0] = 0x140; + D_801C884C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C71D8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C71D8; +extern s16 *D_801C71DC; +extern s32 D_801C71EC; +extern s32 D_801C720C; +extern s32 D_801C7210; +extern s32 D_801C7214; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C71DC != 0) { + D_801C71EC = 0; + p = (int *)(param_1 * 12 + (int)D_801C71D8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C720C != x) { + flag = 1; + if (D_801C720C < x) { + if (x - D_801C720C < 5) { + D_801C720C = x; + } else { + D_801C720C = D_801C720C + 4; + } + } else { + if (D_801C720C - x < 5) { + D_801C720C = x; + } else { + D_801C720C = D_801C720C - 4; + } + } + } + if (D_801C7210 != y) { + flag = 1; + if (D_801C7210 < y) { + if (y - D_801C7210 < 5) { + D_801C7210 = y; + } else { + D_801C7210 = D_801C7210 + 4; + } + } else { + if (D_801C7210 - y < 5) { + D_801C7210 = y; + } else { + D_801C7210 = D_801C7210 - 4; + } + } + } + if (D_801C7214 != z) { + flag = 1; + if (D_801C7214 < z) { + if (z - D_801C7214 < 5) { + D_801C7214 = z; + } else { + D_801C7214 = D_801C7214 + 4; + } + } else { + if (D_801C7214 - z < 5) { + D_801C7214 = z; + } else { + D_801C7214 = D_801C7214 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C71EC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185290[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C71DC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C720C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C7210); + uVar5 = (*(int*)&D_801C7214); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185290); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C71F4; + +s32 func_8013E054(void) { + return D_801C71F4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80185C8C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80185C64; +extern s16 D_80185C66; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80185C8C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80185C64 = 2; + D_80185C66 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80185C66 = 0; + D_80185C64 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C7228; + extern void * D_801C722C; + extern unsigned char D_80185904; + extern unsigned char D_8018591C; + extern unsigned char D_80185990; + extern unsigned char D_80185998; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C7228 = &D_80185904; + D_801C722C = &D_80185990; + } else { + D_801C7228 = &D_8018591C; + D_801C722C = &D_80185998; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80185C8C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185C8C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80185C8C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80185C68; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185C68)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185C68)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80185C64; +extern s16 D_80185C66; +extern unsigned char D_80185C68; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185C66` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80185C64` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80185C66; + if (*r < 3) { + *r = *r + 1; + } + D_80185C64 = (u16)D_80185C64 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C68); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80185C68; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C68); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_100/nonmatchings/ov_SC03_100_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_101/ov_SC03_101_jr_8012ACE0.c b/src/ov_SC03_101/ov_SC03_101_jr_8012ACE0.c index bf680eaea..04335d995 100644 --- a/src/ov_SC03_101/ov_SC03_101_jr_8012ACE0.c +++ b/src/ov_SC03_101/ov_SC03_101_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80183ECC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80183ECC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80183F10; -extern u8 D_80183F54; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80183F10; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183F54 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183F98[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183FD4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183FD4; - if (((s16)a1) < 0xC00) { - tbl = D_80183F98; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80184010, D_80184012, D_80184014, D_80184016, D_80184018, D_8018401A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80184012 < ang)) goto outer_else; - if (!(ang < D_80184018)) goto inner_else; - if (ang < D_80184014) { *(s16 *)L = D_80184014; goto done; } - if (D_80184016 < ang) { *(s16 *)L = D_80184016; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80184010) { *(s16 *)L = D_80184010; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018401A < ang) { *(s16 *)L = D_8018401A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019CA90; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019CA90, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019CA90; -extern s8 D_8019CA94; -extern s8 D_8019CA95; - -void func_8013C9C4(void * arg0) -{ - D_8019CA90 = arg0; - D_8019CA94 = 0; - D_8019CA95 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019CA90; -extern s8 D_8019CA94; -extern s8 D_8019CA95; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019CA90; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019CA95; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019CA94)) * 2) + D_8019CA90); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019CA95 = (unsigned char) p[1]; - D_8019CA94 = D_8019CA94 + 1; - if (D_8019CA95 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019CA94 = 0; - *base = 0; - } - } - else - { - D_8019CA95 = c - 1; - } - } - return; -} - - - -extern s32 D_8019CAB4; -extern s32 D_8019CAA8; -extern s32 D_8019CAAC; -extern s32 D_8019CAB8; - -void func_8013CABC(void) { - D_8019CAB4 = 1; - D_8019CAA8 = 1; - D_8019CAAC = 0; - D_8019CAB8 = 1; -} - - - -extern s32 D_8019CAA8; -extern s32 D_8019CAAC; -extern s32 D_8019CAB0; -extern s32 D_8019CAB4; -extern s32 D_8019CAB8; - -void func_8013CAE8(void) { - D_8019CAA8 = 1; - D_8019CAB4 = 0; - D_8019CAAC = 0; - D_8019CAB0 = -1; - D_8019CAB8 = 0; -} - - - -extern s32 D_8019CAB4; -extern s32 D_8019CAB8; -extern s32 D_8019CAE0; -extern s32 D_8019CAE4; - -void func_8013CB20(void) -{ - D_8019CAE0 = D_8019CAB8; - D_8019CAE4 = D_8019CAB4; - D_8019CAB8 = 1; - D_8019CAB4 = 0; -} - - - -extern s32 D_8019CAE0; -extern s32 D_8019CAE4; -extern s32 D_8019CAB8; -extern s32 D_8019CAB4; - -void func_8013CB5C(void) { - D_8019CAB8 = D_8019CAE0; - D_8019CAB4 = D_8019CAE4; -} - - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019E0D0; - extern u8 D_8019E0D1; - extern u8 D_8019E0D2; - extern u8 D_8019E0D3; - extern u8 D_8019E0D4; - extern u8 D_8019E0D5; - extern u8 D_8019E0D6; - extern u8 D_8019E0D7; - extern u8 D_8019E0D8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019E0D0; t1 = D_8019E0D1; t2 = D_8019E0D2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019E0D3; t1 = D_8019E0D4; t2 = D_8019E0D5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019E0D6; t1 = D_8019E0D7; t2 = D_8019E0D8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019CAC0; -extern s32 D_8019CAA8; -extern s32 D_8019CAC4; -extern s32 D_8019CAB4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019CAC0 != 0) { - if (D_8019CAC0 != 2) { - if (((D_8019CAC0 < 3) && (D_8019CAC0 == 1)) && - (D_8019CAC4 = D_8019CAC4 + 1, 0x23a < D_8019CAC4)) { - D_8019CAA8 = D_8019CAC0; - D_8019CAC0 = 2; - } - } else { - D_8019CAA8 = D_8019CAA8 + -1; - if (D_8019CAA8 == 0) { - D_8019CAA8 = D_8019CAC0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019CAB4 == 0) { - D_8019CAC0 = D_8019CAC0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019CAB4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019CAB4; -} - - - -extern s32 D_8019CAC0; - -void func_8013D164(void) { - D_8019CAC0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019E1B2; -extern u8 D_8019E226; -extern u8 D_8019E0DA; -extern u8 D_8019E194; -extern u8 D_8019E0B8; -extern u8 D_8019E0D9; -extern s32 D_8019E198; - -void func_8013D330(void) { - if ((D_8019E1B2 & 0xff) != D_8019E226) { - D_8019E1B2 = ((D_8019E1B2 & 0xff) < D_8019E226) ? (D_8019E1B2 + 1) : (D_8019E1B2 - 1); - } - if ((D_8019E0DA & 0xff) != D_8019E194) { - D_8019E0DA = ((D_8019E0DA & 0xff) < D_8019E194) ? (D_8019E0DA + 1) : (D_8019E0DA - 1); - } - if ((D_8019E0B8 & 0xff) != D_8019E0D9) { - D_8019E0B8 = ((D_8019E0B8 & 0xff) < D_8019E0D9) ? (D_8019E0B8 + 1) : (D_8019E0B8 - 1); - } - D_8019E198 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019CA98; -extern void *D_8019CA9C; -extern void *D_8019CAA0; -extern s32 D_8019CAC8; -extern s32 D_8019CACC; -extern s32 D_8019CAD0; -extern s32 D_8019E10C[]; - -extern u8 D_80184108[]; -extern u8 D_801841B0[]; -extern u8 D_80184060[]; -extern u8 D_8018415C[]; -extern u8 D_801841DC[]; -extern u8 D_801840B4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019CAC8 = param_2; - D_8019CACC = (param_2 >> 2) & 3; - D_8019CAD0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019CA98 = D_80184108; - D_8019CA9C = D_801841B0; - D_8019CAA0 = D_80184060; - } else { - D_8019CA98 = D_8018415C; - D_8019CA9C = D_801841DC; - D_8019CAA0 = D_801840B4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019CAD0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019CAC8 & 2) != 0) { - D_8019E10C[0] = 0x140; - D_8019E10C[3] = 0x80; - if (p[0x37] == 4) { - D_8019E10C[0] = 0x140; - D_8019E10C[3] = 0; - } - if (p[0x37] == 0) { - D_8019E10C[0] = 0x140; - D_8019E10C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019CAA0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019CAA0; -extern s16 *D_8019CAA4; -extern s32 D_8019CAB4; -extern s32 D_8019CAD4; -extern s32 D_8019CAD8; -extern s32 D_8019CADC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019CAA4 != 0) { - D_8019CAB4 = 0; - p = (int *)(param_1 * 12 + (int)D_8019CAA0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019CAD4 != x) { - flag = 1; - if (D_8019CAD4 < x) { - if (x - D_8019CAD4 < 5) { - D_8019CAD4 = x; - } else { - D_8019CAD4 = D_8019CAD4 + 4; - } - } else { - if (D_8019CAD4 - x < 5) { - D_8019CAD4 = x; - } else { - D_8019CAD4 = D_8019CAD4 - 4; - } - } - } - if (D_8019CAD8 != y) { - flag = 1; - if (D_8019CAD8 < y) { - if (y - D_8019CAD8 < 5) { - D_8019CAD8 = y; - } else { - D_8019CAD8 = D_8019CAD8 + 4; - } - } else { - if (D_8019CAD8 - y < 5) { - D_8019CAD8 = y; - } else { - D_8019CAD8 = D_8019CAD8 - 4; - } - } - } - if (D_8019CADC != z) { - flag = 1; - if (D_8019CADC < z) { - if (z - D_8019CADC < 5) { - D_8019CADC = z; - } else { - D_8019CADC = D_8019CADC + 4; - } - } else { - if (D_8019CADC - z < 5) { - D_8019CADC = z; - } else { - D_8019CADC = D_8019CADC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019CAB4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018426C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019CAA4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019CAD4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019CAD8); - uVar5 = (*(int*)&D_8019CADC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018426C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019CABC; - -s32 func_8013E054(void) { - return D_8019CABC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80184C68; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80184C40; -extern s16 D_80184C42; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80184C68; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80184C40 = 2; - D_80184C42 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80184C42 = 0; - D_80184C40 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019CAF0; - extern void * D_8019CAF4; - extern unsigned char D_801848E0; - extern unsigned char D_801848F8; - extern unsigned char D_8018496C; - extern unsigned char D_80184974; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019CAF0 = &D_801848E0; - D_8019CAF4 = &D_8018496C; - } else { - D_8019CAF0 = &D_801848F8; - D_8019CAF4 = &D_80184974; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80184C68/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184C68 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80184C68)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80184C44; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184C44)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184C44)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80184C40; -extern s16 D_80184C42; -extern unsigned char D_80184C44; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80184C42` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80184C40` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80184C42; - if (*r < 3) { - *r = *r + 1; - } - D_80184C40 = (u16)D_80184C40 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184C44); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80184C44; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184C44); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_101/ov_SC03_101_jr_801380E0.c b/src/ov_SC03_101/ov_SC03_101_jr_801380E0.c new file mode 100644 index 000000000..2a3841903 --- /dev/null +++ b/src/ov_SC03_101/ov_SC03_101_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019B800; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80183B60[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019C9AC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019E1B8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019B800; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018389C)(); +extern s16 (*D_801838A0)(); +extern M2C_UNK (*D_801838A8)(); +extern s32 (*D_801838AC)(); +extern s32 D_8019C9A8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019B804; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80183BF4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801870D8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80183C0C; +extern M2C_UNK D_80183C14; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80183C1C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80183C38[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80183C44[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80183C58[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183CA8[]; +extern s16 D_80183CD8[]; +extern s16 D_80183D38[]; +extern s16 D_80183D40[]; +extern s16 D_80183D60[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80183D98[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80183DF0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80183E38[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80183E40[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80183E48[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80183E50[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80183DF8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80183E18; +extern void func_801321B0(int param_1); +extern int D_80183E28; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019CA18; +extern s32 D_8019CA1C[]; +extern int D_8019CA20; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80183E5C; +extern u8 D_80183E58; +extern s16 *D_80183E60; +extern u8 D_80183E64; +extern int D_8019CA18; +extern u16 D_8019CA28; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80183E60; /* holds a pointer value (*(u16**)&D_80183E60) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80183E74[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80183EC8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80183ECC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80183ECC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80183F10; +extern u8 D_80183F54; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80183F10; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183F54 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183F98[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183FD4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183FD4; + if (((s16)a1) < 0xC00) { + tbl = D_80183F98; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80184010, D_80184012, D_80184014, D_80184016, D_80184018, D_8018401A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184012 < ang)) goto outer_else; + if (!(ang < D_80184018)) goto inner_else; + if (ang < D_80184014) { *(s16 *)L = D_80184014; goto done; } + if (D_80184016 < ang) { *(s16 *)L = D_80184016; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184010) { *(s16 *)L = D_80184010; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018401A < ang) { *(s16 *)L = D_8018401A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019CA90; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019CA90, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019CA90; +extern s8 D_8019CA94; +extern s8 D_8019CA95; + +void func_8013C9C4(void * arg0) +{ + D_8019CA90 = arg0; + D_8019CA94 = 0; + D_8019CA95 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019CA90; +extern s8 D_8019CA94; +extern s8 D_8019CA95; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019CA90; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019CA95; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019CA94)) * 2) + D_8019CA90); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019CA95 = (unsigned char) p[1]; + D_8019CA94 = D_8019CA94 + 1; + if (D_8019CA95 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019CA94 = 0; + *base = 0; + } + } + else + { + D_8019CA95 = c - 1; + } + } + return; +} + + + +extern s32 D_8019CAB4; +extern s32 D_8019CAA8; +extern s32 D_8019CAAC; +extern s32 D_8019CAB8; + +void func_8013CABC(void) { + D_8019CAB4 = 1; + D_8019CAA8 = 1; + D_8019CAAC = 0; + D_8019CAB8 = 1; +} + + + +extern s32 D_8019CAA8; +extern s32 D_8019CAAC; +extern s32 D_8019CAB0; +extern s32 D_8019CAB4; +extern s32 D_8019CAB8; + +void func_8013CAE8(void) { + D_8019CAA8 = 1; + D_8019CAB4 = 0; + D_8019CAAC = 0; + D_8019CAB0 = -1; + D_8019CAB8 = 0; +} + + + +extern s32 D_8019CAB4; +extern s32 D_8019CAB8; +extern s32 D_8019CAE0; +extern s32 D_8019CAE4; + +void func_8013CB20(void) +{ + D_8019CAE0 = D_8019CAB8; + D_8019CAE4 = D_8019CAB4; + D_8019CAB8 = 1; + D_8019CAB4 = 0; +} + + + +extern s32 D_8019CAE0; +extern s32 D_8019CAE4; +extern s32 D_8019CAB8; +extern s32 D_8019CAB4; + +void func_8013CB5C(void) { + D_8019CAB8 = D_8019CAE0; + D_8019CAB4 = D_8019CAE4; +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019E0D0; + extern u8 D_8019E0D1; + extern u8 D_8019E0D2; + extern u8 D_8019E0D3; + extern u8 D_8019E0D4; + extern u8 D_8019E0D5; + extern u8 D_8019E0D6; + extern u8 D_8019E0D7; + extern u8 D_8019E0D8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019E0D0; t1 = D_8019E0D1; t2 = D_8019E0D2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019E0D3; t1 = D_8019E0D4; t2 = D_8019E0D5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019E0D6; t1 = D_8019E0D7; t2 = D_8019E0D8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019CAC0; +extern s32 D_8019CAA8; +extern s32 D_8019CAC4; +extern s32 D_8019CAB4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019CAC0 != 0) { + if (D_8019CAC0 != 2) { + if (((D_8019CAC0 < 3) && (D_8019CAC0 == 1)) && + (D_8019CAC4 = D_8019CAC4 + 1, 0x23a < D_8019CAC4)) { + D_8019CAA8 = D_8019CAC0; + D_8019CAC0 = 2; + } + } else { + D_8019CAA8 = D_8019CAA8 + -1; + if (D_8019CAA8 == 0) { + D_8019CAA8 = D_8019CAC0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019CAB4 == 0) { + D_8019CAC0 = D_8019CAC0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019CAB4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019CAB4; +} + + + +extern s32 D_8019CAC0; + +void func_8013D164(void) { + D_8019CAC0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019E1B2; +extern u8 D_8019E226; +extern u8 D_8019E0DA; +extern u8 D_8019E194; +extern u8 D_8019E0B8; +extern u8 D_8019E0D9; +extern s32 D_8019E198; + +void func_8013D330(void) { + if ((D_8019E1B2 & 0xff) != D_8019E226) { + D_8019E1B2 = ((D_8019E1B2 & 0xff) < D_8019E226) ? (D_8019E1B2 + 1) : (D_8019E1B2 - 1); + } + if ((D_8019E0DA & 0xff) != D_8019E194) { + D_8019E0DA = ((D_8019E0DA & 0xff) < D_8019E194) ? (D_8019E0DA + 1) : (D_8019E0DA - 1); + } + if ((D_8019E0B8 & 0xff) != D_8019E0D9) { + D_8019E0B8 = ((D_8019E0B8 & 0xff) < D_8019E0D9) ? (D_8019E0B8 + 1) : (D_8019E0B8 - 1); + } + D_8019E198 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019CA98; +extern void *D_8019CA9C; +extern void *D_8019CAA0; +extern s32 D_8019CAC8; +extern s32 D_8019CACC; +extern s32 D_8019CAD0; +extern s32 D_8019E10C[]; + +extern u8 D_80184108[]; +extern u8 D_801841B0[]; +extern u8 D_80184060[]; +extern u8 D_8018415C[]; +extern u8 D_801841DC[]; +extern u8 D_801840B4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019CAC8 = param_2; + D_8019CACC = (param_2 >> 2) & 3; + D_8019CAD0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019CA98 = D_80184108; + D_8019CA9C = D_801841B0; + D_8019CAA0 = D_80184060; + } else { + D_8019CA98 = D_8018415C; + D_8019CA9C = D_801841DC; + D_8019CAA0 = D_801840B4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019CAD0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019CAC8 & 2) != 0) { + D_8019E10C[0] = 0x140; + D_8019E10C[3] = 0x80; + if (p[0x37] == 4) { + D_8019E10C[0] = 0x140; + D_8019E10C[3] = 0; + } + if (p[0x37] == 0) { + D_8019E10C[0] = 0x140; + D_8019E10C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019CAA0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019CAA0; +extern s16 *D_8019CAA4; +extern s32 D_8019CAB4; +extern s32 D_8019CAD4; +extern s32 D_8019CAD8; +extern s32 D_8019CADC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019CAA4 != 0) { + D_8019CAB4 = 0; + p = (int *)(param_1 * 12 + (int)D_8019CAA0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019CAD4 != x) { + flag = 1; + if (D_8019CAD4 < x) { + if (x - D_8019CAD4 < 5) { + D_8019CAD4 = x; + } else { + D_8019CAD4 = D_8019CAD4 + 4; + } + } else { + if (D_8019CAD4 - x < 5) { + D_8019CAD4 = x; + } else { + D_8019CAD4 = D_8019CAD4 - 4; + } + } + } + if (D_8019CAD8 != y) { + flag = 1; + if (D_8019CAD8 < y) { + if (y - D_8019CAD8 < 5) { + D_8019CAD8 = y; + } else { + D_8019CAD8 = D_8019CAD8 + 4; + } + } else { + if (D_8019CAD8 - y < 5) { + D_8019CAD8 = y; + } else { + D_8019CAD8 = D_8019CAD8 - 4; + } + } + } + if (D_8019CADC != z) { + flag = 1; + if (D_8019CADC < z) { + if (z - D_8019CADC < 5) { + D_8019CADC = z; + } else { + D_8019CADC = D_8019CADC + 4; + } + } else { + if (D_8019CADC - z < 5) { + D_8019CADC = z; + } else { + D_8019CADC = D_8019CADC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019CAB4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018426C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019CAA4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019CAD4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019CAD8); + uVar5 = (*(int*)&D_8019CADC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018426C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019CABC; + +s32 func_8013E054(void) { + return D_8019CABC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80184C68; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80184C40; +extern s16 D_80184C42; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80184C68; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80184C40 = 2; + D_80184C42 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80184C42 = 0; + D_80184C40 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019CAF0; + extern void * D_8019CAF4; + extern unsigned char D_801848E0; + extern unsigned char D_801848F8; + extern unsigned char D_8018496C; + extern unsigned char D_80184974; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019CAF0 = &D_801848E0; + D_8019CAF4 = &D_8018496C; + } else { + D_8019CAF0 = &D_801848F8; + D_8019CAF4 = &D_80184974; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80184C68/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184C68 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80184C68)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80184C44; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184C44)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184C44)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80184C40; +extern s16 D_80184C42; +extern unsigned char D_80184C44; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80184C42` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80184C40` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80184C42; + if (*r < 3) { + *r = *r + 1; + } + D_80184C40 = (u16)D_80184C40 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184C44); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80184C44; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184C44); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_102/ov_SC03_102_jr_8012ACE0.c b/src/ov_SC03_102/ov_SC03_102_jr_8012ACE0.c index 378bf261f..443202b7e 100644 --- a/src/ov_SC03_102/ov_SC03_102_jr_8012ACE0.c +++ b/src/ov_SC03_102/ov_SC03_102_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186784[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186784[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801867C8; -extern u8 D_8018680C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801867C8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018680C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80186850[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018688C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018688C; - if (((s16)a1) < 0xC00) { - tbl = D_80186850; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801868C8, D_801868CA, D_801868CC, D_801868CE, D_801868D0, D_801868D2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801868CA < ang)) goto outer_else; - if (!(ang < D_801868D0)) goto inner_else; - if (ang < D_801868CC) { *(s16 *)L = D_801868CC; goto done; } - if (D_801868CE < ang) { *(s16 *)L = D_801868CE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801868C8) { *(s16 *)L = D_801868C8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801868D2 < ang) { *(s16 *)L = D_801868D2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B8708; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B8708, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B8708; -extern s8 D_801B870C; -extern s8 D_801B870D; - -void func_8013C9C4(void * arg0) -{ - D_801B8708 = arg0; - D_801B870C = 0; - D_801B870D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B8708; -extern s8 D_801B870C; -extern s8 D_801B870D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B8708; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B870D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B870C)) * 2) + D_801B8708); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B870D = (unsigned char) p[1]; - D_801B870C = D_801B870C + 1; - if (D_801B870D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B870C = 0; - *base = 0; - } - } - else - { - D_801B870D = c - 1; - } - } - return; -} - - - -extern s32 D_801B872C; -extern s32 D_801B8720; -extern s32 D_801B8724; -extern s32 D_801B8730; - -void func_8013CABC(void) { - D_801B872C = 1; - D_801B8720 = 1; - D_801B8724 = 0; - D_801B8730 = 1; -} - - - -extern s32 D_801B8720; -extern s32 D_801B8724; -extern s32 D_801B8728; -extern s32 D_801B872C; -extern s32 D_801B8730; - -void func_8013CAE8(void) { - D_801B8720 = 1; - D_801B872C = 0; - D_801B8724 = 0; - D_801B8728 = -1; - D_801B8730 = 0; -} - - - -extern s32 D_801B872C; -extern s32 D_801B8730; -extern s32 D_801B8758; -extern s32 D_801B875C; - -void func_8013CB20(void) -{ - D_801B8758 = D_801B8730; - D_801B875C = D_801B872C; - D_801B8730 = 1; - D_801B872C = 0; -} - - - -extern s32 D_801B8758; -extern s32 D_801B875C; -extern s32 D_801B8730; -extern s32 D_801B872C; - -void func_8013CB5C(void) { - D_801B8730 = D_801B8758; - D_801B872C = D_801B875C; -} - - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B9AD0; - extern u8 D_801B9AD1; - extern u8 D_801B9AD2; - extern u8 D_801B9AD3; - extern u8 D_801B9AD4; - extern u8 D_801B9AD5; - extern u8 D_801B9AD6; - extern u8 D_801B9AD7; - extern u8 D_801B9AD8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B9AD0; t1 = D_801B9AD1; t2 = D_801B9AD2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B9AD3; t1 = D_801B9AD4; t2 = D_801B9AD5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B9AD6; t1 = D_801B9AD7; t2 = D_801B9AD8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B8738; -extern s32 D_801B8720; -extern s32 D_801B873C; -extern s32 D_801B872C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B8738 != 0) { - if (D_801B8738 != 2) { - if (((D_801B8738 < 3) && (D_801B8738 == 1)) && - (D_801B873C = D_801B873C + 1, 0x23a < D_801B873C)) { - D_801B8720 = D_801B8738; - D_801B8738 = 2; - } - } else { - D_801B8720 = D_801B8720 + -1; - if (D_801B8720 == 0) { - D_801B8720 = D_801B8738; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B872C == 0) { - D_801B8738 = D_801B8738 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B872C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B872C; -} - - - -extern s32 D_801B8738; - -void func_8013D164(void) { - D_801B8738 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B9BB2; -extern u8 D_801B9C26; -extern u8 D_801B9ADA; -extern u8 D_801B9B94; -extern u8 D_801B9AB8; -extern u8 D_801B9AD9; -extern s32 D_801B9B98; - -void func_8013D330(void) { - if ((D_801B9BB2 & 0xff) != D_801B9C26) { - D_801B9BB2 = ((D_801B9BB2 & 0xff) < D_801B9C26) ? (D_801B9BB2 + 1) : (D_801B9BB2 - 1); - } - if ((D_801B9ADA & 0xff) != D_801B9B94) { - D_801B9ADA = ((D_801B9ADA & 0xff) < D_801B9B94) ? (D_801B9ADA + 1) : (D_801B9ADA - 1); - } - if ((D_801B9AB8 & 0xff) != D_801B9AD9) { - D_801B9AB8 = ((D_801B9AB8 & 0xff) < D_801B9AD9) ? (D_801B9AB8 + 1) : (D_801B9AB8 - 1); - } - D_801B9B98 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B8710; -extern void *D_801B8714; -extern void *D_801B8718; -extern s32 D_801B8740; -extern s32 D_801B8744; -extern s32 D_801B8748; -extern s32 D_801B9B0C[]; - -extern u8 D_801869C0[]; -extern u8 D_80186A68[]; -extern u8 D_80186918[]; -extern u8 D_80186A14[]; -extern u8 D_80186A94[]; -extern u8 D_8018696C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B8740 = param_2; - D_801B8744 = (param_2 >> 2) & 3; - D_801B8748 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B8710 = D_801869C0; - D_801B8714 = D_80186A68; - D_801B8718 = D_80186918; - } else { - D_801B8710 = D_80186A14; - D_801B8714 = D_80186A94; - D_801B8718 = D_8018696C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B8748 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B8740 & 2) != 0) { - D_801B9B0C[0] = 0x140; - D_801B9B0C[3] = 0x80; - if (p[0x37] == 4) { - D_801B9B0C[0] = 0x140; - D_801B9B0C[3] = 0; - } - if (p[0x37] == 0) { - D_801B9B0C[0] = 0x140; - D_801B9B0C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B8718)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B8718; -extern s16 *D_801B871C; -extern s32 D_801B872C; -extern s32 D_801B874C; -extern s32 D_801B8750; -extern s32 D_801B8754; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B871C != 0) { - D_801B872C = 0; - p = (int *)(param_1 * 12 + (int)D_801B8718); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B874C != x) { - flag = 1; - if (D_801B874C < x) { - if (x - D_801B874C < 5) { - D_801B874C = x; - } else { - D_801B874C = D_801B874C + 4; - } - } else { - if (D_801B874C - x < 5) { - D_801B874C = x; - } else { - D_801B874C = D_801B874C - 4; - } - } - } - if (D_801B8750 != y) { - flag = 1; - if (D_801B8750 < y) { - if (y - D_801B8750 < 5) { - D_801B8750 = y; - } else { - D_801B8750 = D_801B8750 + 4; - } - } else { - if (D_801B8750 - y < 5) { - D_801B8750 = y; - } else { - D_801B8750 = D_801B8750 - 4; - } - } - } - if (D_801B8754 != z) { - flag = 1; - if (D_801B8754 < z) { - if (z - D_801B8754 < 5) { - D_801B8754 = z; - } else { - D_801B8754 = D_801B8754 + 4; - } - } else { - if (D_801B8754 - z < 5) { - D_801B8754 = z; - } else { - D_801B8754 = D_801B8754 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B872C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80186B24[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B871C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B874C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B8750); - uVar5 = (*(int*)&D_801B8754); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80186B24); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B8734; - -s32 func_8013E054(void) { - return D_801B8734; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187520; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801874F8; -extern s16 D_801874FA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187520; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801874F8 = 2; - D_801874FA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801874FA = 0; - D_801874F8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B8768; - extern void * D_801B876C; - extern unsigned char D_80187198; - extern unsigned char D_801871B0; - extern unsigned char D_80187224; - extern unsigned char D_8018722C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B8768 = &D_80187198; - D_801B876C = &D_80187224; - } else { - D_801B8768 = &D_801871B0; - D_801B876C = &D_8018722C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187520/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187520 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187520)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801874FC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801874FC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801874FC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801874F8; -extern s16 D_801874FA; -extern unsigned char D_801874FC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801874FA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801874F8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801874FA; - if (*r < 3) { - *r = *r + 1; - } - D_801874F8 = (u16)D_801874F8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801874FC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801874FC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801874FC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_102/ov_SC03_102_jr_801380E0.c b/src/ov_SC03_102/ov_SC03_102_jr_801380E0.c new file mode 100644 index 000000000..a26628af7 --- /dev/null +++ b/src/ov_SC03_102/ov_SC03_102_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B747C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186418[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B8624; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B9BB8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B747C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80186154)(); +extern s16 (*D_80186158)(); +extern M2C_UNK (*D_80186160)(); +extern s32 (*D_80186164)(); +extern s32 D_801B8620; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B7480; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801864AC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80189990; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801864C4; +extern M2C_UNK D_801864CC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801864D4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801864F0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801864FC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186510[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186560[]; +extern s16 D_80186590[]; +extern s16 D_801865F0[]; +extern s16 D_801865F8[]; +extern s16 D_80186618[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80186650[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801866A8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801866F0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801866F8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186700[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186708[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801866B0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801866D0; +extern void func_801321B0(int param_1); +extern int D_801866E0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B8690; +extern s32 D_801B8694[]; +extern int D_801B8698; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186714; +extern u8 D_80186710; +extern s16 *D_80186718; +extern u8 D_8018671C; +extern int D_801B8690; +extern u16 D_801B86A0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186718; /* holds a pointer value (*(u16**)&D_80186718) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018672C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186780; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186784[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186784[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801867C8; +extern u8 D_8018680C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801867C8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018680C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80186850[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018688C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018688C; + if (((s16)a1) < 0xC00) { + tbl = D_80186850; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801868C8, D_801868CA, D_801868CC, D_801868CE, D_801868D0, D_801868D2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801868CA < ang)) goto outer_else; + if (!(ang < D_801868D0)) goto inner_else; + if (ang < D_801868CC) { *(s16 *)L = D_801868CC; goto done; } + if (D_801868CE < ang) { *(s16 *)L = D_801868CE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801868C8) { *(s16 *)L = D_801868C8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801868D2 < ang) { *(s16 *)L = D_801868D2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B8708; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B8708, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B8708; +extern s8 D_801B870C; +extern s8 D_801B870D; + +void func_8013C9C4(void * arg0) +{ + D_801B8708 = arg0; + D_801B870C = 0; + D_801B870D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B8708; +extern s8 D_801B870C; +extern s8 D_801B870D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B8708; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B870D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B870C)) * 2) + D_801B8708); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B870D = (unsigned char) p[1]; + D_801B870C = D_801B870C + 1; + if (D_801B870D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B870C = 0; + *base = 0; + } + } + else + { + D_801B870D = c - 1; + } + } + return; +} + + + +extern s32 D_801B872C; +extern s32 D_801B8720; +extern s32 D_801B8724; +extern s32 D_801B8730; + +void func_8013CABC(void) { + D_801B872C = 1; + D_801B8720 = 1; + D_801B8724 = 0; + D_801B8730 = 1; +} + + + +extern s32 D_801B8720; +extern s32 D_801B8724; +extern s32 D_801B8728; +extern s32 D_801B872C; +extern s32 D_801B8730; + +void func_8013CAE8(void) { + D_801B8720 = 1; + D_801B872C = 0; + D_801B8724 = 0; + D_801B8728 = -1; + D_801B8730 = 0; +} + + + +extern s32 D_801B872C; +extern s32 D_801B8730; +extern s32 D_801B8758; +extern s32 D_801B875C; + +void func_8013CB20(void) +{ + D_801B8758 = D_801B8730; + D_801B875C = D_801B872C; + D_801B8730 = 1; + D_801B872C = 0; +} + + + +extern s32 D_801B8758; +extern s32 D_801B875C; +extern s32 D_801B8730; +extern s32 D_801B872C; + +void func_8013CB5C(void) { + D_801B8730 = D_801B8758; + D_801B872C = D_801B875C; +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B9AD0; + extern u8 D_801B9AD1; + extern u8 D_801B9AD2; + extern u8 D_801B9AD3; + extern u8 D_801B9AD4; + extern u8 D_801B9AD5; + extern u8 D_801B9AD6; + extern u8 D_801B9AD7; + extern u8 D_801B9AD8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B9AD0; t1 = D_801B9AD1; t2 = D_801B9AD2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B9AD3; t1 = D_801B9AD4; t2 = D_801B9AD5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B9AD6; t1 = D_801B9AD7; t2 = D_801B9AD8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B8738; +extern s32 D_801B8720; +extern s32 D_801B873C; +extern s32 D_801B872C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B8738 != 0) { + if (D_801B8738 != 2) { + if (((D_801B8738 < 3) && (D_801B8738 == 1)) && + (D_801B873C = D_801B873C + 1, 0x23a < D_801B873C)) { + D_801B8720 = D_801B8738; + D_801B8738 = 2; + } + } else { + D_801B8720 = D_801B8720 + -1; + if (D_801B8720 == 0) { + D_801B8720 = D_801B8738; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B872C == 0) { + D_801B8738 = D_801B8738 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B872C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B872C; +} + + + +extern s32 D_801B8738; + +void func_8013D164(void) { + D_801B8738 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B9BB2; +extern u8 D_801B9C26; +extern u8 D_801B9ADA; +extern u8 D_801B9B94; +extern u8 D_801B9AB8; +extern u8 D_801B9AD9; +extern s32 D_801B9B98; + +void func_8013D330(void) { + if ((D_801B9BB2 & 0xff) != D_801B9C26) { + D_801B9BB2 = ((D_801B9BB2 & 0xff) < D_801B9C26) ? (D_801B9BB2 + 1) : (D_801B9BB2 - 1); + } + if ((D_801B9ADA & 0xff) != D_801B9B94) { + D_801B9ADA = ((D_801B9ADA & 0xff) < D_801B9B94) ? (D_801B9ADA + 1) : (D_801B9ADA - 1); + } + if ((D_801B9AB8 & 0xff) != D_801B9AD9) { + D_801B9AB8 = ((D_801B9AB8 & 0xff) < D_801B9AD9) ? (D_801B9AB8 + 1) : (D_801B9AB8 - 1); + } + D_801B9B98 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B8710; +extern void *D_801B8714; +extern void *D_801B8718; +extern s32 D_801B8740; +extern s32 D_801B8744; +extern s32 D_801B8748; +extern s32 D_801B9B0C[]; + +extern u8 D_801869C0[]; +extern u8 D_80186A68[]; +extern u8 D_80186918[]; +extern u8 D_80186A14[]; +extern u8 D_80186A94[]; +extern u8 D_8018696C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B8740 = param_2; + D_801B8744 = (param_2 >> 2) & 3; + D_801B8748 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B8710 = D_801869C0; + D_801B8714 = D_80186A68; + D_801B8718 = D_80186918; + } else { + D_801B8710 = D_80186A14; + D_801B8714 = D_80186A94; + D_801B8718 = D_8018696C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B8748 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B8740 & 2) != 0) { + D_801B9B0C[0] = 0x140; + D_801B9B0C[3] = 0x80; + if (p[0x37] == 4) { + D_801B9B0C[0] = 0x140; + D_801B9B0C[3] = 0; + } + if (p[0x37] == 0) { + D_801B9B0C[0] = 0x140; + D_801B9B0C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B8718)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B8718; +extern s16 *D_801B871C; +extern s32 D_801B872C; +extern s32 D_801B874C; +extern s32 D_801B8750; +extern s32 D_801B8754; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B871C != 0) { + D_801B872C = 0; + p = (int *)(param_1 * 12 + (int)D_801B8718); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B874C != x) { + flag = 1; + if (D_801B874C < x) { + if (x - D_801B874C < 5) { + D_801B874C = x; + } else { + D_801B874C = D_801B874C + 4; + } + } else { + if (D_801B874C - x < 5) { + D_801B874C = x; + } else { + D_801B874C = D_801B874C - 4; + } + } + } + if (D_801B8750 != y) { + flag = 1; + if (D_801B8750 < y) { + if (y - D_801B8750 < 5) { + D_801B8750 = y; + } else { + D_801B8750 = D_801B8750 + 4; + } + } else { + if (D_801B8750 - y < 5) { + D_801B8750 = y; + } else { + D_801B8750 = D_801B8750 - 4; + } + } + } + if (D_801B8754 != z) { + flag = 1; + if (D_801B8754 < z) { + if (z - D_801B8754 < 5) { + D_801B8754 = z; + } else { + D_801B8754 = D_801B8754 + 4; + } + } else { + if (D_801B8754 - z < 5) { + D_801B8754 = z; + } else { + D_801B8754 = D_801B8754 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B872C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80186B24[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B871C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B874C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B8750); + uVar5 = (*(int*)&D_801B8754); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80186B24); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B8734; + +s32 func_8013E054(void) { + return D_801B8734; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187520; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801874F8; +extern s16 D_801874FA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187520; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801874F8 = 2; + D_801874FA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801874FA = 0; + D_801874F8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B8768; + extern void * D_801B876C; + extern unsigned char D_80187198; + extern unsigned char D_801871B0; + extern unsigned char D_80187224; + extern unsigned char D_8018722C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B8768 = &D_80187198; + D_801B876C = &D_80187224; + } else { + D_801B8768 = &D_801871B0; + D_801B876C = &D_8018722C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187520/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187520 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187520)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801874FC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801874FC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801874FC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801874F8; +extern s16 D_801874FA; +extern unsigned char D_801874FC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801874FA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801874F8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801874FA; + if (*r < 3) { + *r = *r + 1; + } + D_801874F8 = (u16)D_801874F8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801874FC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801874FC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801874FC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_102/nonmatchings/ov_SC03_102_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_103/ov_SC03_103.c b/src/ov_SC03_103/ov_SC03_103.c index c699607ec..504037e99 100644 --- a/src/ov_SC03_103/ov_SC03_103.c +++ b/src/ov_SC03_103/ov_SC03_103.c @@ -521,4843 +521,3 @@ void func_8012ACA0(void *arg0) { M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); func_8012AAAC(); } - - - - -// @class: iv-combine -// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). -typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ -typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ - -s32 func_8012ACE0(void *o) { - int i; - for (i = 0; ; i++) { - switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { - case -2: - case -1: - case 0: - return i; - case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ - default: - break; - } - } -} - -DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ - -DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ - - - -void func_8012AD64(s32 *a0, s16 a1) { - *(s16*)((s32)a0 + 0x34) = a1; -} - - -DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ - -DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ - -DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ - -DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ - -DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ - -DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ - -DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ - -DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ - -DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ - -DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ - -DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ - -DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ - -DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ - -DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ - -DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ - -DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ - -DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012B4B8); - -DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ - -DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ - -DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ - -DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012B77C); - -DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ - -DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ - -DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ - -DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ - -DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ - -DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ - -DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ - -DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ - -DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ - -DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ - -DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ - -DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ - -DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ - -DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ - - -void func_8012BF4C(s32 *a0, s32 a1) { - *(s32*)((s32)a0 + 0x1C) = a1; -} - - -DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ - -DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ - -DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ - -DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ - -DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012C098); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012C0EC); - -DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ - -DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ - -DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ - -DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ - -DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ - -DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ - -DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ - -DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ - -DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ - -DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ - -DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012C658); - -DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012C750); - -DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to -// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS -// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via -// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store -// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. -// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). - -extern s32 D_80187940; -extern s16 D_801270C4; -extern u16 D_801274E4[]; -extern s32 D_8011DB08; -extern void func_80016714(void *a0, s32 a1); - -s32 func_8012C890(s32 a0, s32 a1, s32 a2) { - u8 *src = (u8 *)a0; - u8 *dst = (u8 *)a1; - u16 *d; - s16 count; - u16 v2, v4; - s32 v10; - void *obj; - - *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); - v2 = *(u16 *)(src + 0x0); - *(u16 *)(dst + 0x6) = v2; - *(u16 *)(dst + 0x88) = v2; - v2 = *(u16 *)(src + 0x2); - *(u16 *)(dst + 0xA) = v2; - *(u16 *)(dst + 0x8A) = v2; - v4 = *(u16 *)(src + 0x4); - *(u16 *)(dst + 0xC) = 0; - *(u16 *)(dst + 0x8) = 0; - *(u16 *)(dst + 0x4) = 0; - *(u16 *)(dst + 0xE) = v4; - *(u16 *)(dst + 0x8C) = v4; - *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); - *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; - *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); - v10 = *(s32 *)(src + 0x10); - *(s32 *)(dst + 0x78) = (s32)&D_80187940; - *(s32 *)(dst + 0xDC) = v10; - - { - register u16 *pc __asm__("$3"); - pc = &(*(u16 *)&D_801270C4); - *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; - count = *(volatile u16 *)pc + 1; - *pc = count; - if (count == 0) { - *pc = 1; - } - } - - if (a2 != 0) { - *(s32 *)(dst + 0x64) = a2; - *(s32 *)(dst + 0x68) = 0; - } else { - *(s32 *)(dst + 0x64) = 0; - *(s32 *)(dst + 0x68) = (s32)src; - } - - *(u16 *)(src + 0xA) |= 0x8000; - *(u16 *)(dst + 0x2) = 0; - d = D_801274E4; - *d &= 0xFFFE; - (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); - - if (*d & 1) { - s32 a1v; - obj = *(void **)(dst + 0x20); - if (obj != 0) { - s32 t = *(u16 *)obj; - if (t != 1) { - if (t != 2) { - goto done; - } - a1v = 0x38; - } else { - a1v = 0x84; - } - func_80016714(obj, a1v); - done:; - } - func_80016714(dst, 0x10C); - *(u16 *)(src + 0xA) &= 0x7FFF; - return 0; - } - - if (*(s32 *)(dst + 0x64) == 0) { - void *o = *(void **)(dst + 0x20); - if (o == 0) { - return (s32)dst; - } - if (*(u16 *)o == 1) { - s16 c = *(s16 *)(src + 0xC); - if (c != 0x7FFF) { - *(s16 *)((u8 *)o + 0x12) = c; - } - } - } - if (*(s32 *)(dst + 0x20) != 0) { - *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); - } - return (s32)dst; -} - - -DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ - -DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ - -DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ - -DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ - -DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ - -DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ - -DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ - -DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012CC88); - -DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ - -DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ - -DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ - -DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ - -DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ - -DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ - -DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ - -DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ - -DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ - -DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ - -DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH - - -struct S8012D664_8012D664 { short a, b, c; }; - -int func_8012D664(int arg0, int arg1, int arg2) { - extern int func_8012F568(); - extern int D_8018446C; - - struct S8012D664_8012D664 s; - int ret; - int t; - - s.a = (*(unsigned short*)&D_80126B5E); - s.b = (*(unsigned short*)&D_80126B62) - 0x40; - s.c = (*(unsigned short*)&D_80126B66); - ret = ((int(*)())func_800132BC)(arg0, &s); - t = arg1 + 0x20; - if (ret < t * t) { - func_8012F568(1, 1, 0, arg2, arg0, &D_8018446C); - return 1; - } - return 0; -} - - - -DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ - - - -extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -extern void func_8014C978(void); -extern M2C_UNK D_80184474; -extern M2C_UNK D_8018447C; - -s32 func_8012DB84(void) -{ - func_8014C978(); - func_8012F568(1, 0xC001, 0, 0x3E8, &D_80184474, &D_8018447C); -} - - -DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH - - -typedef struct Entry_8012DDA4 { - u16 active; - unsigned char pad[0x10C - 2]; -} Entry_8012DDA4; - - -s32 func_8012DDA4() -{ - extern Entry_8012DDA4 * D_801C37FC; - extern Entry_8012DDA4 * D_801C37F8; - - Entry_8012DDA4 *p; - Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); - - while (D_801C37FC != end) { - p = D_801C37FC; - if (p->active != 0 && p != D_801C37F8) { - D_801C37FC = p + 1; - return p; - } - D_801C37FC++; - } - D_801C37FC = 0; - return 0; -} - - - -// @class: plumbing -// @stuck: none — MATCH (35/35 ins, relocation-masked) - - -s32 func_8012DE2C(s32 a0) { - extern u8 * D_801C37FC; - extern u8 * D_801C37F8; - - u8 *base; - u8 *end; - u8 *p; - - base = D_801202A0; - end = base + 0x6480; - D_801C37FC = base; - D_801C37F8 = ((u8 *)a0); - - while (D_801C37FC != end) { - p = D_801C37FC; - if (*(u16 *)p != 0 && p != ((u8 *)a0)) { - D_801C37FC = p + 0x10C; - return p; - } - D_801C37FC += 0x10C; - } - D_801C37FC = 0; - return 0; -} - - - -DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ - -DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ - -DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ - -DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ - -DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012E014); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012E138); - - -s32 func_8012E27C(void) { - return 1; -} - - -DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ - -DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ - -DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012E364); - -DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ - -DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ - -DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ - -DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ - -DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH -extern u8 D_800AF648; -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) -{ - struct { short xy[2]; int sp14; int flag; } f; - register void *p __asm__("$4"); - p = &D_800AF648; - func_8004914C(p); - func_800491AC(&D_800AF648); - RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); - if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { - func_8002D4C8(param_2, param_3); - } -} - - -DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012E778); - -DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ - -DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ - -DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ - -DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ - - - -// @class: other -// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) - -extern void func_8016AA50(int, int); -extern void func_8016B428(int); -extern void func_80019064(void *); -extern int D_80184484; - -void func_8012E9C0(int param_1) -{ - int iVar1; - - if (*(short *)(param_1 + 0x60) != 0) { - if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { - *(short *)(param_1 + 0x82) = 0; - *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); - *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); - *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); - } - if (*(int *)(param_1 + 0x78) != 0) { - iVar1 = *(short *)(param_1 + 0x60) * - *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; - if (iVar1 < 1) { - iVar1 = 1; - } - } else { - iVar1 = *(short *)(param_1 + 0x60); - } - func_8016AA50(param_1, iVar1); - if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { - func_8016B428(param_1); - func_80019064(&D_80184484); - } - } - return; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012EA90); - -DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ - -DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ - -DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ - -DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012EFB8); - - -// @class: other -// @stuck: none — MATCH (33 ins, match_one verified) - -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); - -void func_8012F038(int param_1, short *param_2, short *param_3) { - int in[3]; - int out[3]; - - in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); - in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); - in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); - ApplyTransposeMatrixLV((void *)param_1, in, out); - param_3[0] = out[0]; - param_3[1] = out[1]; - param_3[2] = out[2]; -} - - -DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern void RotTransSV(s32 a0, s32 a1, void *a2); - -void func_8012F14C(s32 a0, s32 a1, s32 a2) -{ - s32 buf[2]; - func_8004914C((void *)a0); - func_800491AC((void *)a0); - RotTransSV(a1, a2, buf); -} - - -DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ - -DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012F274); - -DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ - -DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012F40C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8012F49C); - -DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ - -DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ - -DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ - -DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ - -DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) -extern void func_80131170(); -extern void func_80131CA8(); -extern unsigned char D_801844A0[]; - -void func_8012F828(int param_1) -{ - *(unsigned char *)(param_1 + 0xC1) = 4; - if (*(unsigned int *)(param_1 + 0xB4) & 8) { - func_80131170(param_1, D_801844A0, 0xB); - } - func_80131CA8(param_1, 9); -} - - -DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ - - -extern void func_80131170(s32 a0, s32 a1, s32 a2); -extern void func_80131CA8(int a0, int a1); -extern u8 D_801844AC[]; - -void func_8012F8C8(u8* arg0) { - *(u8*)(arg0 + 0xC1) = 7; - if (*(u32*)(arg0 + 0xB4) & 0x80) { - ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801844AC, 0xB); - } - ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); -} - - -DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ - -DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ - -DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ - -DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ - -DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. -// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for -// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be -// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an -// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). -// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: -// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. -// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which -// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because -// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. -// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out -// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, -// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what -// blocks reorg from sharing a downstream constant into a branch delay slot.) - - -s32 func_8012FCC4(s32 param_1) { - extern int D_801844B8; - - int v1 = *(int *)(((int)param_1) + 0xC4); - *(char *)(((int)param_1) + 0xC1) = 8; - if (v1 & 2) { - *(char *)(((int)param_1) + 0xC1) = 1; - func_80131CA8(((int)param_1), 3); - return; - } - if (v1 & 1) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 1); - return; - } - if (*(int *)(((int)param_1) + 0xB4) & 0x100) { - ((void (*)(int))func_80131B14)(((int)param_1)); - if (*(short *)(((int)param_1) + 0x76) <= 0) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); - return; - } - if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { - *(char *)(((int)param_1) + 0xC2) = 0; - } else { - *(short *)(((int)param_1) + 0x98) = 0; - *(char *)(((int)param_1) + 0xC2) = 1; - } - ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801844B8); - *(int *)(((int)param_1) + 0x1C) = 0; - func_80131CA8(((int)param_1), 0x1C); - return; - } - func_80131CA8(((int)param_1), 0x1C); -} - - - -DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ - -DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ - -DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ - -DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ - -DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ - -DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ - -DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ - -DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ - -DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ - -DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ - -DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ - -DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ - -DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ - -DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ - -DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ - -DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ - -DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80130650); - -DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ - -DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ - -DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ - -DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ - -DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ - -DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80130A18); - -DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ - -DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80130C08); - - -extern void (*D_801844C0[])(void); - -void func_80130D0C(void *a0) { - D_801844C0[*(u8 *)((s32)a0 + 0xC1)](); -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). -extern s32 rand(void); -extern u8 D_80078E78[]; -extern u16 D_80078EB2; -extern u16 D_80078EB4; -extern s16 D_80184510[]; -extern s16 D_80184540[]; -extern s16 D_801845A0[]; -extern s16 D_801845A8[]; -extern s16 D_801845C8[]; - -void func_80130D48(s32 arg0) -{ - register s16 *tbl __asm__("$16"); - register s32 pa __asm__("$18") = arg0; - register u8 *p __asm__("$19") = D_80078E78; - s32 s1v; - s32 call_a0; - s32 call_a1; - s32 cnt; - s32 r; - void *ret; - - s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); - if (s1v == 0) { - return; - } - - if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - } - - switch (s1v & 0xFFFF0000) { - case 0x10000: { - u32 x = D_80078EB4; - u32 y = D_80078EB2; - u32 b; - u32 a; - - s1v = 0; - if (x == y) { - s1v = 0xC; - } else if ((y >> 1) >= x) { - s1v = 3; - } - - b = *(u16 *)(p + 0x40); - a = *(u16 *)(p + 0x3E); - if (b == a) { - s1v += 0x18; - } else if ((a >> 1) >= b) { - s1v += 6; - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184540; tbl = (s16 *)(bp + v1); } - - r = rand() % 100; - cnt = 0; - loop27: - if (r >= *tbl) { - cnt += 1; - tbl += 1; - if (cnt < 3) { - goto loop27; - } - } - - s1v = 0; - switch (cnt) { - case 0: - tbl = D_801845A0; - s1v = 0x31; - break; - case 1: { - s32 mx = *(u16 *)(p + 0x3A); - s32 cur = *(u16 *)(p + 0x3C); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801845A8; tbl = (s16 *)(bp + v1); } - s1v = 0x32; - break; - } - case 2: { - s32 mx = *(u16 *)(p + 0x3E); - s32 cur = *(u16 *)(p + 0x40); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801845C8; tbl = (s16 *)(bp + v1); } - s1v = 0x33; - break; - } - } - - r = rand() % 100; - call_a1 = 0; - loop50: - if (r >= *tbl) { - call_a1 += 1; - tbl += 1; - if (call_a1 < 4) { - goto loop50; - } - } - call_a0 = s1v; - goto do_call; - } - case 0x20000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x30000: - call_a0 = 0x31; - call_a1 = 0; - goto do_call; - case 0x40000: - call_a0 = 0x32; - call_a1 = 0; - goto do_call; - case 0x50000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x60000: { - s32 rr = rand() & 0xFF; - tbl = D_80184510; - if (rr >= *tbl) { - do { - tbl += 3; - } while (rr >= *tbl); - } - call_a0 = tbl[1]; - if (*(u16 *)(p + 0x40) < 4U) { - call_a0 = 0x33; - } - call_a1 = tbl[2]; - goto do_call; - } - case 0x70000: - call_a0 = 0x27B; - call_a1 = 0; - goto do_call; - default: - return; - } - -do_call: - ret = func_8012C658(call_a0, call_a1, pa); - if (ret != 0) { - *(u16 *)((s8 *)ret + 0xA) -= 0x20; - } -} - - -// @class: loop-guard -// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps -// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` -// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); -// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's -// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC -// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). - - -void func_80131170(s32 p, s32 b, s32 c) { - extern u8 D_80184494[]; - - func_80131B14(); - *(u8 *)(((u8 *)p) + 0xC2) = 0; - *(u8 *)(((u8 *)p) + 0xC3) = 0; - *(s16 *)(((u8 *)p) + 0x98) = 0; - if (((u8 *)b) == 0) { - ((u8 *)b) = D_80184494; - } - func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); - *(s32 *)(((u8 *)p) + 0x1C) = 0; - if (c != 0) { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } else { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } -tail: - if (*(s16 *)(((u8 *)p) + 0x76) > 0) { - return; - } - if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); - } else { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); - } -} - - - -// @class: struct -// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) - -typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ - - -s32 func_801312D0(s32 param_1, void *param_2) -{ - extern int func_80131CF4(int, int); - extern M8_801312D0 D_801845E8; - - int iVar5; - - iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); - if (iVar5 != 0) { - ((short *)param_2)[2] = 0; - ((short *)param_2)[0] = 0; - ((short *)param_2)[1] = (short)iVar5; - } else { - *(M8_801312D0 *)((short *)param_2) = D_801845E8; - } -} - - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80131340); - -DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80131A34); - -DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` -// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be -// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a -// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). -// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; -// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the -// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); -// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. - -void func_80131B14() { - extern void func_8002A520(void *); - extern void func_8002A790(void *); - extern u8 D_801845F0; - - register u8 *a0v __asm__("$4"); - u8 *p = a0v; - - - s32 e = *(u8 *)(p + 0x5E); - - if (*(s16 *)(p + 0x60) != 0) { - if (e == 0x1D) { - *(s16 *)(p + 0x82) = 0; - *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); - *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); - *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); - } - { - s32 dec; - s32 q = *(s32 *)(p + 0x78); - if (q != 0) { - dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; - if (dec <= 0) dec = 1; - } - *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; - } - ((void (*)(void *))func_8016AA50)(p); - if (*(u16 *)(p + 0x82) & 1) { - ((void (*)(void *))func_8016B428)(p); - ((void(*)(void *))func_80019064)(&D_801845F0); - } - } - - *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; - - if (e != 0x1D) { - if (*(u8 *)(p + 0xC8)) func_8002A520(p); - if (*(u8 *)(p + 0xC9)) func_8002A790(p); - } - - if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; - - { - s32 r = *(s32 *)(p + 0x20); - *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; - { - s32 r2 = *(s32 *)(p + 0x20); - *(s16 *)(r2 + 0x14) = 0; - *(s16 *)(r2 + 0x10) = 0; - } - } - - ((void (*)(void *))func_8012B2CC)(p); - ((void (*)(void *))func_8012B23C)(p); -} - - - -DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80131CA8); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80131CF4); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80131D68); - - -extern void (*D_80184600[])(struct S80131E00 *a0); - -void func_80131E00(struct S80131E00 *a0, s32 a1) { - a0->field_B0 = a1; - D_80184600[a1](a0); -} - - -DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ - -DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ - -DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ - - -extern void (*D_80184658[])(void); - -void func_80131EEC(void *a0) { - D_80184658[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801846A0[])(void); - -void func_80131F28(void *a0) { - D_801846A0[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801846A8[])(void); - -void func_80131F64(void *a0) { - D_801846A8[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801846B0[])(void); - -void func_80131FA0(void *a0) { - D_801846B0[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801846B8[])(void); - -void func_80131FDC(void *a0) { - D_801846B8[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80132018); - -DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80184660; - -void func_801320D8(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80184660; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -s32 func_80132144(s32 param_1) -{ - extern int D_80184670; - - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(((int)param_1) + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(((int)param_1)); - } else { - ((void(*)(int, int))func_8001C214)(v0, 0); - *(int *)(((int)param_1) + 0x58) = (int)&D_80184670; - *(short *)(((int)param_1) + 0x5c) = 0x80; - *(unsigned short *)(((int)param_1) + 2) += 1; - } -} - - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80184680; - -void func_801321B0(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80184680; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80184690; - -void func_8013221C(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80184690; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - -DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ - -DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801325B8); - -DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ - -DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ - -DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ - -DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ - -DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ - -DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80132F40); - -DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801330E0); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80133298); - -DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ - -DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH - -extern s32 D_801C3848; -extern s32 D_801C384C[]; -extern int D_801C3850; -extern void func_80136BC4(s32 a0); - -void func_801336E8(void *a0, int a1, int a2) { - if (a0 != 0) { - (*(void * *)&D_801C3848) = a0; - ((void (*)(void))func_80136BC4)(); - } - (*(int *)&D_801C384C) = a1; - D_801C3850 = a2; -} - - - - -extern s32 D_801C384C[]; -extern s32 D_801C3848; -extern void func_80136BC4(s32); - -void func_8013373C(s16 arg0) { - s32 temp = D_801C384C[arg0]; - if (temp != 0) { - D_801C3848 = temp; - func_80136BC4(temp); - } -} - - -// @class: regalloc-order -#include "common.h" - -typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; - - -s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { - extern s32 func_80047D3C(s32); - extern s32 func_80133AB0(s16, s16, s16, s32); - extern Box_80133784 * D_801846C0; - extern Box_80133784 * D_801846C4; - extern s16 D_801C3854; - extern u16 D_801C3858; - - register s32 s1 __asm__("$17"); - s32 s2; - register s16 s3 __asm__("$19"); - register s32 s4 __asm__("$20"); - register s16 a0v __asm__("$4"); - register s16 arg0s __asm__("$21"); - s32 dx, dy, dz; - s32 r, ret; - - a0v = ((s16)arg0); - s1 = 0; - s3 = 0; - s4 = 0; - s2 = 0; - arg0s = a0v; - D_801846C0->f6 = -0x7FFF; - D_801846C4->f6 = 0x7FFF; - D_801846C0->f0 = ((Box_80133784 *)arg1)->f0; - D_801846C0->f4 = ((Box_80133784 *)arg1)->f4; - D_801846C4->f0 = ((Box_80133784 *)arg2)->f0; - D_801846C4->f4 = ((Box_80133784 *)arg2)->f4; - D_801C3858 = 0; - D_801C3854 = 0; - - if ((s16)a0v == 0) { - s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; - s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; - s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; - if (sx == 0 && sy == 0) { - s32 zt = (sz == 0); - __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); - } - D_801846C0->f2 = ((Box_80133784 *)arg1)->f2 - 4; - r = func_80047D3C(sx * sx + sz * sz); - if (r < 3) { - r = 4; - } else if (r < 5) { - r += 1; - } - D_801846C4->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; - } else { - D_801846C0->f2 = ((Box_80133784 *)arg1)->f2; - if ((s16)a0v == 2) { - D_801846C4->f0 = D_801846C0->f0; - D_801846C4->f2 = D_801846C0->f2 + 6; - s2 = 1; - D_801846C4->f4 = D_801846C0->f4; - } else { - D_801846C4->f2 = ((Box_80133784 *)arg2)->f2; - } - } - - while (1) { - s32 ret0; - register s32 retc __asm__("$3"); - __asm__ __volatile__(""); - ret0 = func_80133AB0(arg0s, (s16)D_801846C0->f0, (s16)D_801846C0->f4, (*(s32*)&D_801C3848)); - __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); - ret = retc; - if (ret == 0) goto after; - s4 |= ret; - if (s2 != 0) goto after; - { - s16 oldc = s3; - s3 = s3 + 1; - if (oldc >= 5) break; - } - } - - D_801846C4->f0 = D_801846C0->f0; - D_801846C4->f2 = D_801846C0->f2; - s1 = 0x2000; - D_801846C4->f4 = D_801846C0->f4; - goto store_out; - -after: - if ((s16)s4 != 0 || D_801C3854 != 0) { - s16 t; - __asm__ __volatile__("" :: "r"(s4)); - t = D_801846C0->f6; - if (t >= -0xBCB) { - if (t < -0x578) { - s1 |= 0x4000; - } else { - s1 |= 0x8000; - } - } - if ((s16)D_801846C4->f6 < -0xBCB) { - s1 |= 0x2000; - } - store_out: - ((Box_80133784 *)arg2)->f0 = D_801846C4->f0; - ((Box_80133784 *)arg2)->f2 = D_801846C4->f2; - ((Box_80133784 *)arg2)->f4 = D_801846C4->f4; - ((Box_80133784 *)arg2)->f6 = D_801C3858; - return s1 & 0xFFFF; - } - ((Box_80133784 *)arg2)->f6 = D_801C3858; - return 0; -} - - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80133AB0); - - -s32 func_80133CD4(arg0, cmd, base, arr) - s16 arg0; - s16 *cmd; - s16 *base; - s32 *arr; -{ - typedef struct { s16 e[4]; } ElemK; - - extern u16 *D_801846C4; - extern u16 *D_801846C0; - extern s16 *D_801846CC; - extern s16 *D_801846C8; - extern s32 *D_801846D4; - extern s32 *D_801846D8; - extern u16 D_801C3858; - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern u16 D_801152AE; - extern u8 D_801152B0; - extern s32 func_80134310(); - extern s32 func_8013435C(); - - s16 *s3 = ((ElemK *)base)[cmd[1]].e; - s32 s6 = arr[cmd[2]]; - s32 s0var, s1var; - s32 s2a; - s16 y; - - if (func_80134310(s3, D_801846C4, s6) >= 0) - return 0; - - s1var = func_80134310(s3, D_801846C0, s6); - if (s1var < 0) - return 0; - - s0var = func_80134310(s3, D_801846CC, 0); - { - u16 *pac = D_801846C0; - s16 *pb8 = D_801846CC; - s16 *pb4 = D_801846C8; - s32 neg = -s1var; - pb4[0] = pac[0] + neg * pb8[0] / s0var; - pb4[1] = pac[1] + neg * pb8[1] / s0var; - pb4[2] = pac[2] + neg * pb8[2] / s0var; - if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) - return 0; - } - if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_801846C8, arr[cmd[6]], s3)) - return 0; - if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_801846C8, arr[cmd[8]], s3)) - return 0; - if (arg0 < 0) { - if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_801846C8, arr[cmd[10]], s3)) - return 0; - } - if (arg0 & 0x10) { - if (*(u16 *)cmd & 0x100) - return 0; - } - if (*(u16 *)cmd & 0x200) { - D_801C3858 = *(u16 *)cmd; - return 0; - } - - { - s32 ret = func_80134310(s3, D_801846C4, s6); - s32 *pc0; - s32 *pc4; - u16 *pb0; - s32 t, o2; - s32 q3v; - - { - s32 *pw = D_801846D4; - ((struct { s32 w; } *)pw)->w = s3[0]; - pw[1] = s3[1]; - pw[2] = s3[2]; - } - s1var = -ret; - - __asm__ __volatile__( - "lwc2 $9, 0(%0)\n" - "lwc2 $10, 4(%0)\n" - "lwc2 $11, 8(%0)\n" - "nop\n" - "nop\n" - "sqr 0\n" - : : "r"(D_801846D4) : "$9", "$10", "$11", "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"(D_801846D8) : "memory"); - - pc0 = D_801846D4; - pc4 = D_801846D8; - s0var = pc4[0] + pc4[1] + pc4[2]; - pb0 = D_801846C4; - pb0[0] += s1var * pc0[0] / s0var; - pb0[1] += s1var * pc0[1] / s0var; - q3v = s1var * pc0[2] / s0var; - - { - s32 h; - h = ((s16 *)pb0)[0]; - s1var = h << 16; - __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); - s0var = h << 16; - } - pb0[2] += q3v; - s2a = (s16)pb0[2] << 16; - - t = pc0[0] << 4; - pc0[0] = t; - if (t < 0) s1var |= 0xFFFF; - t = pc0[1] << 4; - pc0[1] = t; - if (t < 0) s0var |= 0xFFFF; - o2 = pc0[2]; - t = o2 << 4; - pc0[2] = t; - if (t < 0) s2a |= 0xFFFF; - s2a += o2 << 5; - s1var += pc0[0] << 1; - s0var += pc0[1] << 1; - - do { - s32 *pl = D_801846D4; - u16 *pb; - s1var += pl[0]; - s0var += pl[1]; - s2a += pl[2]; - pb = D_801846C4; - pb[0] = s1var >> 16; - pb[1] = s0var >> 16; - pb[2] = s2a >> 16; - ret = func_80134310(s3, pb, s6); - } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); - } - - y = s3[1]; - if (y >= -0xBCB) { - D_801846C0[3] = y; - { - typedef struct { s8 c[8]; } Blk8; - *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; - } - if (*(u8 *)cmd != 0) - goto ret1; - return -1; - } - { - typedef struct { u16 h; } H16; - u16 *s3u = (u16 *)s3; - u16 *bp = D_801846C4; - u16 w; - ((H16 *)D_801152A8)->h = s3u[0]; - w = s3u[1]; - bp[3] = w; - ((H16 *)&D_801152AA)->h = w; - ((H16 *)&D_801152AC)->h = s3u[2]; - ((H16 *)&D_801152AE)->h = s3u[3]; - } -ret1: - return 1; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80134310); - -DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (83 ins, relocation-masked) - - - -s32 func_801343C4(s32 angle, s32 p1, s32 p2) -{ - extern int func_80133AB0(int, s16, s16, int); - extern s16 * D_801846C0; - extern s16 * D_801846C4; - extern u16 D_801C3858; - extern u16 D_801C3854; - - s16 *pac; - s16 *pb0; - s16 *pacs, *pb0s; - u16 *pb0u; - int a1v, a2v, d94, b0; - int sangle = ((s16)angle); - - pac = D_801846C0; - d94 = D_801C3848; - pb0 = D_801846C4; - pac[0] = ((u16 *)p1)[0]; - pac[1] = ((u16 *)p1)[1]; - pac[2] = ((u16 *)p1)[2]; - pb0[0] = ((u16 *)p2)[0]; - pb0[1] = ((u16 *)p2)[1]; - pb0[2] = ((u16 *)p2)[2]; - - a1v = pac[0]; a2v = pac[2]; - __asm__ __volatile__("" ::: "memory"); - D_801C3858 = 0; - D_801C3854 = 0; - if (func_80133AB0(sangle, a1v, a2v, d94)) { - setdst: - pb0u = (u16 *)D_801846C4; - ((u16 *)p2)[0] = pb0u[0]; - ((u16 *)p2)[1] = pb0u[1]; - ((u16 *)p2)[2] = pb0u[2]; - ((u16 *)p2)[3] = D_801C3858; - return 1; - } - - pacs = D_801846C0; - pb0s = D_801846C4; - b0 = pb0s[0]; - if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && - (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { - return 0; - } - if (func_80133AB0(sangle, b0, pb0s[2], D_801C3848)) { - goto setdst; - } - return 0; -} - - - -// @class: schedule -typedef struct { - u16 f0; /* 0x0 */ - u16 f2; /* 0x2 */ - u16 f4; /* 0x4 */ - s16 f6; /* 0x6 */ -} Foo_80134510_80134510; - - -s32 func_80134510(s32 param) { - extern s32 func_801345F8(s32); - extern Foo_80134510_80134510 * D_801846C0; - extern Foo_80134510_80134510 * D_801846C4; - extern Foo_80134510_80134510 * D_801846C8; - extern u16 D_801C3858; - - - s32 ret = 0; - Foo_80134510_80134510 *b0 = D_801846C4; - Foo_80134510_80134510 *ac = D_801846C0; - u16 t0 = ((Foo_80134510_80134510 *)param)->f0; - u16 t2, t4; - - ((Foo_80134510_80134510 *)param)->f6 = 0; - ac->f0 = t0; - b0->f0 = t0; - t2 = ((Foo_80134510_80134510 *)param)->f2; - ac->f2 = t2 - 4; - b0->f2 = t2 + 0x2FC; - t4 = ((Foo_80134510_80134510 *)param)->f4; - ac->f4 = t4; - b0->f4 = t4; - - if (func_801345F8((*(s32*)&D_801C3848)) != 0) { - s16 x; - ((Foo_80134510_80134510 *)param)->f2 = D_801846C8->f2 - 2; - x = D_801846C0->f6; - if (x >= -3019) { - if (x < -1400) { - ret = 0x4000; - } else { - ret = 0x8000; - } - } else { - ret = 0x2000; - } - D_801846C0->f6 = D_801C3858; - } - return ret; -} - - - -// @class: regalloc-order -// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. - - -s32 func_801345F8(s32 arg) -{ - extern int func_801347A0(short, u16 *, int, int); - extern u16 * D_801846C0; - extern u16 D_801C3858; - - register u16 *param_1 __asm__("$5") = ((u16 *)arg); - register u16 *cc __asm__("$4") = D_801846C0; - int c8000 = 0x8000; - register int zr __asm__("$0"); - u32 c1, c2, uVar6, uVar2, cnt, v14; - u16 *ptmp, *puVar4, *puVar7, uVar1; - int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; - - c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; - uVar6 = c1 + zr; - if ((c1 & 0xffff) < (u32)param_1[2]) { - c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; - uVar2 = c2 + zr; - if ((c2 & 0xffff) < (u32)param_1[3]) - goto do_mult; - return 0; - found: - D_801C3858 = *puVar7; - return 1; - do_mult: - tbl = *(int *)(param_1 + 4); - uVar10 = *(int *)(param_1 + 6); - uVar3 = *(int *)(param_1 + 8); - iVar9 = *(int *)(param_1 + 0xc); - iVar8 = *(int *)(param_1 + 0xe); - ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); - cnt = (u32)ptmp[1]; - v14 = *(int *)(param_1 + 10); - puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; - while (((cnt-- + zr) & 0xffff) != 0) { - uVar1 = *puVar4; - hi = uVar1 & 0x8000; - harg = hi + zr; - if (hi == 0) - puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); - else - puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); - if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) - goto found; - puVar4 = puVar4 - 1; - } - } - return 0; -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. -#include "common.h" - -typedef struct { - /* 0x00 */ u16 f0; - /* 0x02 */ s16 f2; - /* 0x04 */ s16 f4; - /* 0x06 */ s16 f6; - /* 0x08 */ s16 f8; - /* 0x0A */ s16 fa; - /* 0x0C */ s16 fc; - /* 0x0E */ s16 fe; - /* 0x10 */ s16 f10; - /* 0x12 */ s16 f12; - /* 0x14 */ s16 f14; -} S0_801347A0; - -typedef struct { - /* 0x0 */ s16 f0; - /* 0x2 */ s16 f2; - /* 0x4 */ s16 f4; - /* 0x6 */ s16 f6; -} Elem_801347A0; - -typedef struct { - /* 0x0 */ u16 f0; - /* 0x2 */ u16 f2; - /* 0x4 */ u16 f4; - /* 0x6 */ u16 f6; -} SVec_801347A0; - - - -s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); - extern s16 * D_801846C4; - extern SVec_801347A0 * D_801846C0; - extern SVec_801347A0 * D_801846C8; - - Elem_801347A0 *pElem; - s32 val; - register s32 iv __asm__("$4"); - s32 q; - s32 dvsr; - - pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; - val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; - if (func_80134A28((s32)pElem, (s32)D_801846C4, val) >= 0) { - return 0; - } - iv = func_80134A28((s32)pElem, (s32)D_801846C0, val); - if (iv < 0) { - return 0; - } - iv = -iv; - dvsr = pElem->f2 * 48; - q = (iv * 48) / dvsr; - D_801846C8->f0 = D_801846C0->f0; - D_801846C8->f2 = D_801846C0->f2 + q; - D_801846C8->f4 = D_801846C0->f4; - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { - return 0; - } - if ((s16)arg0) { - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { - return 0; - } - } - if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { - return 0; - } - D_801846C8->f0 = D_801846C0->f0; - D_801846C8->f4 = D_801846C0->f4; - (*(Elem_801347A0*)D_801152A8) = *pElem; - D_801846C0->f6 = pElem->f2; - return 1; -} - - - -DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80134A74); - -// @class: regalloc-order -// @try: variant B — direct pins m=$s5($21), c=$s6($22) - - -s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); - extern void * D_801846C0; - extern void * D_801846C4; - extern void * D_801846C8; - extern void * D_801846CC; - extern u16 D_801C3858; - - s32 temp_a3; - s32 temp_s1; - s32 temp_v0; - s32 temp_v0_2; - s32 var_v0; - u16 temp_a1; - s32 temp_s4; - s32 c = arg0; - __asm__ __volatile__("" : "=r"(c) : "0"(c)); - __asm__ __volatile__("" : : "r"(arg0)); - - temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); - temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); - var_v0 = 0; - if (func_80134FB8(temp_s4, (s32) D_801846C4, temp_s1) >= 0) { - return var_v0; - } - temp_v0 = func_80134FB8(temp_s4, (s32) D_801846C0, temp_s1); - if (temp_v0 < 0) { - goto block_13; - } - temp_v0_2 = func_80134FB8(temp_s4, (s32) D_801846CC, 0); - temp_a3 = -temp_v0; - { - u16 *pB4 = (u16 *)D_801846C8; - u16 *pAC = (u16 *)D_801846C0; - s16 *pB8 = (s16 *)D_801846CC; - pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; - pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; - pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { - return var_v0; - } - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_801846C8, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { - return var_v0; - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_801846C8, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { - return var_v0; - } - if ((arg0 << 16) < 0) { - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_801846C8, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { - return var_v0; - } - } - if (c & 1) { - if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { - goto block_14; - } - return 0; - } - temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); - if (!(temp_a1 & 0x200)) { - goto block_14; - } - D_801C3858 = temp_a1; -block_13: - return 0; -block_14: - __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); - VectorNormalSS(D_801846CC, D_801846CC); - { - u16 *pB8 = (u16 *)D_801846CC; - u16 *pB4b = (u16 *)D_801846C8; - pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); - var_v0 = 1; - pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); - pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); - } - return var_v0; -} - - - -DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ - -// @class: plumbing -// @stuck: MATCH (89 ins). To BANK: retype D_801846C4 + D_801846C0 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). - - - - -s32 func_80135004(s32 arg0, s32 p1, s32 p2) -{ - extern int func_80134A74(int, s16, s16, int); - extern s16 * D_801846C4; - extern s16 * D_801846C0; - extern u8 D_801846CC; - extern s16 *D_801846C8; - extern u16 D_801C3858; - - register s16 *pb0 __asm__("$9"); /* D_801846C4 -> $t1 */ - register s16 *pac __asm__("$6"); /* D_801846C0 -> $a2 */ - register s16 *pb8 __asm__("$8"); /* D_801846CC -> $t0 */ - u16 *pb4; - u16 a, b; - int id; - int a1v, a2v, d94; - - pb0 = D_801846C4; - __asm__ __volatile__("" : : "r"(pb0)); - - a = ((u16 *)p2)[0]; pac = D_801846C0; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_801846CC); pac[0] = b; pb8[0] = a - b; - a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; - a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; - - id = ((int)arg0) & 0xFFFF; - a1v = pac[0]; a2v = pac[2]; d94 = D_801C3848; - __asm__ __volatile__("" ::: "memory"); - D_801C3858 = 0; - - if (func_80134A74(id, a1v, a2v, d94)) { - found: - pb4 = (*(u16 * *)&D_801846C8); - ((u16 *)p2)[0] = pb4[0]; - ((u16 *)p2)[1] = pb4[1]; - ((u16 *)p2)[2] = pb4[2]; - ((u16 *)p2)[3] = D_801C3858; - return 1; - } - { - register u16 *qb __asm__("$4"); /* D_801846C0 -> $a0 (reloaded) */ - register int qa0 __asm__("$5"); /* D_801846C4[0], kept in $a1 for the 2nd-call arg */ - register u16 *qa __asm__("$6"); /* D_801846C4 -> $a2 (reloaded) */ - qb = (u16 *)D_801846C0; - qa = (u16 *)D_801846C4; - qa0 = qa[0]; - if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && - ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) - return 0; - if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801C3848)) - goto found; - return 0; - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (62 ins, relocation-masked) - - -extern u8 D_801846C4; -extern u8 D_801846C0; -extern s16 *D_801846C8; -extern u8 D_801846CC; -extern int D_801C3848; -extern u16 D_801C3858; - -extern int func_80134A74(int, s16, s16, int); - -int func_80135168(u16 arg0, u16 *p1, u16 *p2) -{ - register s16 *pb0 __asm__("$8"); - register s16 *pac __asm__("$6"); - register s16 *pb8 __asm__("$7"); - u16 *pb4; - u16 a, b; - int a1v, a2v, d94; - - pb0 = (*(s16 * *)&D_801846C4); - __asm__ __volatile__("" : : "r"(pb0)); - - a = p2[0]; pac = (*(s16 * *)&D_801846C0); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_801846CC); pac[0] = b; pb8[0] = a - b; - a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; - a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; - - a1v = pac[0]; a2v = pac[2]; d94 = D_801C3848; - __asm__ __volatile__("" ::: "memory"); - D_801C3858 = 0; - if (func_80134A74(arg0, a1v, a2v, d94)) { - pb4 = (*(u16 * *)&D_801846C8); - p2[0] = pb4[0]; - p2[1] = pb4[1]; - p2[2] = pb4[2]; - p2[3] = D_801C3858; - return 1; - } - return 0; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80135260); - - -/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). - * - * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 - * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does - * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in - * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). - * - * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): - * the two output buffers D_801846C0 / D_801846C4 are written through a pointer in each of the two - * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a - * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also - * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each - * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks - * the lowest-free scratch over its OWN window: - * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) - * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) - * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail - * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. - * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades - * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the - * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. - * - * Zero file-scope footprint (block-scoped typedefs + externs; D_801846C0/B0 read via the ambient - * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for - * family_sweep --edit-remap with no cc1 crash. - * - * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. - */ -s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) -{ - typedef struct { s32 vx, vy, vz, pad; } Vec32; - typedef struct { s16 vx, vy, vz, pad; } Vec16; - typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; - extern void func_80048EAC(void *m0, void *m1); - extern void func_8004914C(void *m); - extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); - extern void ApplyRotMatrixLV(void *in, void *out); - extern void ApplyRotMatrix(void *in, void *out); - extern s32 D_801C385C, D_801C3860, D_801C3864, D_801C3868; - extern s16 D_801C386C; - extern s32 D_801C387C; - extern s16 D_801C3880, D_801C3882, D_801C3884, D_801C3886, D_801C3888, D_801C388A; - - Vec32 in0, in1, rotout; - Mat32 mat2; - Vec16 vecin; - s32 result; - s32 mode; - s32 q1, q2; - s32 p; - s32 t18, t1A, t1C; - s32 *m; - - in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); - in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); - if ((param_2 & 0x10000000) == 0) { - if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { - return 0; - } - } - mode = param_2 & 0x60000000; - if (mode != 0) { - result = 1; - if (param_2 >= 0) { - mode &= 0x40000000; - } - in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); - in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); - switch (mode) { - case 0x60000000: - m = &D_801C385C; - *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); - q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); - q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); - D_801C3860 = 0; - D_801C3868 = 0; - D_801C3864 = q1; - D_801C386C = q2; - func_80048EAC((void *)((s32)param_1 + 0x34), m); - ApplyTransposeMatrixLV(m, &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - /* fallthrough */ - case 0x20000000: - p = (param_2 & 0xFFFFFFF) | 0x80000000; - t18 = *(s16 *)((s32)param_1 + 0x18); - t1A = *(s16 *)((s32)param_1 + 0x1A); - t1C = *(u16 *)((s32)param_1 + 0x1C); - mat2.w4 = 0; - mat2.wC = 0; - mat2.w0 = t18; - mat2.w8 = t1A; - mat2.h10 = t1C; - func_8004914C(&mat2); - vecin.vx = *(u16 *)(p + 4); - vecin.vy = *(u16 *)(p + 8); - vecin.vz = *(u16 *)(p + 0xC); - ApplyRotMatrix(&vecin, &rotout); - D_801C3880 = rotout.vx; - D_801C3884 = rotout.vy; - D_801C3888 = rotout.vz; - vecin.vx = *(u16 *)(p + 6); - vecin.vy = *(u16 *)(p + 0xA); - vecin.vz = *(u16 *)(p + 0xE); - ApplyRotMatrix(&vecin, &rotout); - D_801C387C = 0; - D_801C3882 = rotout.vx; - D_801C3886 = rotout.vy; - D_801C388A = rotout.vz; - result += 2; - break; - case 0x40000000: - ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - break; - } - { - s16 *p = *(s16 **)&D_801846C0; - p[0] = in0.vx; - p[1] = in0.vy; - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_801846C4; - p[0] = in1.vx; - p[1] = in1.vy; - p[2] = in1.vz; - } - return result; - } - { - s16 *p = *(s16 **)&D_801846C0; - p[0] = in0.vx; - p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_801846C4; - p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); - p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); - } - return 1; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80135888); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80135A4C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80135D20); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80135EB0); - - -s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - register s32 a1v __asm__("$11"); - register s32 a2v __asm__("$12"); - register s32 n __asm__("$5"); - register s16 *b4 __asm__("$7"); - s32 d; - s32 dx; - s32 denom; - s32 result; - s32 frame_pad[2]; - (void)&frame_pad; - __asm__("" : "=r"(a1v) : "0"(arg1)); - a2v = arg2; - - if (!(arg1 & 1)) { - dx = (s16) arg2 - (*(s16 **)&D_801846C0)[2]; - d = dx; - denom = -(*(s16 **)&D_801846CC)[2]; - } else { - denom = (*(s16 **)&D_801846CC)[2]; - d = (*(s16 **)&D_801846C0)[2] - (s16) arg2; - dx = -d; - } - n = -d; - { - register s16 *b8 __asm__("$6") = *(s16 **)&D_801846CC; - u16 *ac = *(u16 **)&D_801846C0; - b4 = D_801846C8; - b4[0] = ac[0] + n * b8[0] / denom; - b4[1] = ac[1] + n * b8[1] / denom; - b4[2] = ac[2] + dx; - } - - if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; - if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; - if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; - if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; - if (a1v & 0x8000) { - u16 *b0 = *(u16 **)&D_801846C4; - b4[0] = b0[0]; - b4[1] = b0[1]; - } - D_801152AA = 0; - (*(s16 *)D_801152A8) = 0; - if (a1v & 1) { - D_801846C8[2] = a2v + 2; - __asm__ __volatile__(""); - D_801152AC = 0xFFF; - } else { - D_801152AC = -0xFFF; - D_801846C8[2] = a2v - 2; - } - __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); - (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; - D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; - result = 1; - D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; - return result; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801365B8); - - -// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) -// D_801846C0/B0/B8 are file-scope `extern u8`, D_801846C8 is `extern s32 []`; each HOLDS a -// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. -// D_801846C8 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the -// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar -// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the -// siblings read it once via *(u16**)&sym == direct lw either way). - -s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - - register u16 *ac __asm__("$4"); - register s16 *b8 __asm__("$6"); - register s16 *b4 __asm__("$9"); - register s32 r __asm__("$3"); - register s32 pos __asm__("$12"); - register s32 a1v __asm__("$5"); - s16 temp_v0; - s16 temp_v1; - s32 var_a3; - s16 var_v0_3; - s32 temp_a1; - s32 var_t0; - s32 var_v1; - s16 *b4b; - u16 *p; - - __asm__ ("" : "=r"(a1v) : "0"(arg1)); - pos = arg2; - if (!(a1v & 1)) { - var_t0 = (s16) arg2 - (*(s16 **)&D_801846C0)[1]; - var_v1 = var_t0; - var_a3 = -(*(s16 **)&D_801846CC)[1]; - } else { - var_a3 = (*(s16 **)&D_801846CC)[1]; - var_v1 = (*(s16 **)&D_801846C0)[1] - (s16) arg2; - var_t0 = -var_v1; - } - b8 = (*(s16 **)&D_801846CC); - ac = (*(u16 **)&D_801846C0); - b4 = D_801846C8; - temp_a1 = -var_v1; - r = (temp_a1 * b8[0]) / var_a3; - b4[0] = ac[0] + r; - b4[1] = ac[1] + var_t0; - r = (temp_a1 * b8[2]) / var_a3; - temp_v0 = ac[2] + r; - b4[2] = temp_v0; - temp_v1 = b4[0]; - if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { - return 0; - } - if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { - return 0; - } - if (arg1 & 0x8000) { - p = (*(u16 **)&D_801846C4); - b4[0] = (s16) p[0]; - b4[2] = (s16) p[2]; - } - D_801152AC = 0; - (*(s16 *)D_801152A8) = 0; - if (arg1 & 1) { - b4b = D_801846C8; - D_801152AA = 0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos + 2; - } else { - b4b = D_801846C8; - D_801152AA = -0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos - 2; - } - b4b[1] = var_v0_3; - __asm__ __volatile__("" :: "r"(pos)); - (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); - D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); - D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); - return 1; -} - - -// @class: schedule -// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a -// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE -// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses -// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] -// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the -// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; -// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits -// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the -// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). - - -extern s16 *D_801846C8; /* holds a pointer value (*(u16**)&D_801846C8) */ - -s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { - extern void ApplyMatrixSV(void *m, void *v0, void *v1); - extern void ApplyRotMatrix(void *v0, void *v1); - extern u16 D_80126722; - extern s16 D_80126724; - extern s16 D_801152AA; - extern s16 D_801152AC; - - s32 out[4]; - u16 *pb4; - - if (a0) { - ApplyMatrixSV((void *)a3, *(void **)&D_801846C8, *(void **)&D_801846C8); - ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); - ApplyRotMatrix((void *)D_801152A8, (void *)out); - *(s16 *)D_801152A8 = out[0]; - D_801152AA = out[1]; - D_801152AC = out[2]; - } - - pb4 = *(u16 **)&D_801846C8; - *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); - *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); - *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); - - *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); - D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); - D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); -} - - - -DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ - -DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ - -DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ - -DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ - -DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ - - -extern unsigned short D_800B99F0; -extern void (*D_801846DC[])(void); - -void func_80136C54(void) -{ - D_801846DC[D_800B99F0](); -} - - -// @class: struct -// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801C2884 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). - -typedef struct { char s[10]; } S10_80136C90; - -s32 func_80136C90() -{ - extern void func_8001534C(int, void *, int, int, int, int); - extern S10_80136C90 D_801C2884; - - S10_80136C90 buf = D_801C2884; - func_8001534C(0, &buf, 0x78, 0x10, 0, 0); -} - - - -DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ - -DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80136DFC); - -DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ - -DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80136F3C); - -DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80137178); - -DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ - -DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80137614); - -DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ - -DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801376E8); - -DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ - -DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801378F0); - -DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ - -DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801379FC); - - -// @class: remat -// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer -extern s32 D_80127548[]; -extern int D_80184730; -extern int D_801269F0; -extern void func_80138BE0(int p); - -void func_80137B80(void) { - int *p = &D_801269F0; - (*(int *)&D_80127548) = 0x24; - if (*p != 0) { - ((void (*)(int *))func_80138BE0)(p); - } - D_80184730 += 1; -} - - -DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. - -extern unsigned char D_80126A0E; -extern short D_80126A0A; -extern s16 D_801269F4; -extern int D_800A5E60; -extern int D_80184730; -extern int D_801269F0; - -extern void func_801392FC(); -extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); -extern void func_80139680(s32 a0, u8 *a1); - -int func_80137D08(int arg0, int arg1, short arg2) -{ - unsigned char buf[3]; - - D_800A5E60 = arg0; - D_80126A0A = arg2; - ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); - if ((*(short *)&D_801269F4) == 7) { - buf[0] = 0x39; - buf[1] = 0xFF; - buf[2] = 0x71; - ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); - } else if ((*(short *)&D_801269F4) == 3) { - if (D_80184730 & 4) { - ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); - } - } - return D_800A5E60; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80137DD4); - -DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184734[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184734[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184778; -extern u8 D_801847BC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184778; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801847BC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184800[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018483C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018483C; - if (((s16)a1) < 0xC00) { - tbl = D_80184800; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80184878, D_8018487A, D_8018487C, D_8018487E, D_80184880, D_80184882; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018487A < ang)) goto outer_else; - if (!(ang < D_80184880)) goto inner_else; - if (ang < D_8018487C) { *(s16 *)L = D_8018487C; goto done; } - if (D_8018487E < ang) { *(s16 *)L = D_8018487E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80184878) { *(s16 *)L = D_80184878; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80184882 < ang) { *(s16 *)L = D_80184882; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C38C0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C38C0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C38C0; -extern s8 D_801C38C4; -extern s8 D_801C38C5; - -void func_8013C9C4(void * arg0) -{ - D_801C38C0 = arg0; - D_801C38C4 = 0; - D_801C38C5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C38C0; -extern s8 D_801C38C4; -extern s8 D_801C38C5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C38C0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C38C5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C38C4)) * 2) + D_801C38C0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C38C5 = (unsigned char) p[1]; - D_801C38C4 = D_801C38C4 + 1; - if (D_801C38C5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C38C4 = 0; - *base = 0; - } - } - else - { - D_801C38C5 = c - 1; - } - } - return; -} - - - -extern s32 D_801C38E4; -extern s32 D_801C38D8; -extern s32 D_801C38DC; -extern s32 D_801C38E8; - -void func_8013CABC(void) { - D_801C38E4 = 1; - D_801C38D8 = 1; - D_801C38DC = 0; - D_801C38E8 = 1; -} - - - -extern s32 D_801C38D8; -extern s32 D_801C38DC; -extern s32 D_801C38E0; -extern s32 D_801C38E4; -extern s32 D_801C38E8; - -void func_8013CAE8(void) { - D_801C38D8 = 1; - D_801C38E4 = 0; - D_801C38DC = 0; - D_801C38E0 = -1; - D_801C38E8 = 0; -} - - - -extern s32 D_801C38E4; -extern s32 D_801C38E8; -extern s32 D_801C3910; -extern s32 D_801C3914; - -void func_8013CB20(void) -{ - D_801C3910 = D_801C38E8; - D_801C3914 = D_801C38E4; - D_801C38E8 = 1; - D_801C38E4 = 0; -} - - - -extern s32 D_801C3910; -extern s32 D_801C3914; -extern s32 D_801C38E8; -extern s32 D_801C38E4; - -void func_8013CB5C(void) { - D_801C38E8 = D_801C3910; - D_801C38E4 = D_801C3914; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C4C80; - extern u8 D_801C4C81; - extern u8 D_801C4C82; - extern u8 D_801C4C83; - extern u8 D_801C4C84; - extern u8 D_801C4C85; - extern u8 D_801C4C86; - extern u8 D_801C4C87; - extern u8 D_801C4C88; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C4C80; t1 = D_801C4C81; t2 = D_801C4C82; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C4C83; t1 = D_801C4C84; t2 = D_801C4C85; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C4C86; t1 = D_801C4C87; t2 = D_801C4C88; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C38F0; -extern s32 D_801C38D8; -extern s32 D_801C38F4; -extern s32 D_801C38E4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C38F0 != 0) { - if (D_801C38F0 != 2) { - if (((D_801C38F0 < 3) && (D_801C38F0 == 1)) && - (D_801C38F4 = D_801C38F4 + 1, 0x23a < D_801C38F4)) { - D_801C38D8 = D_801C38F0; - D_801C38F0 = 2; - } - } else { - D_801C38D8 = D_801C38D8 + -1; - if (D_801C38D8 == 0) { - D_801C38D8 = D_801C38F0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C38E4 == 0) { - D_801C38F0 = D_801C38F0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C38E4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C38E4; -} - - - -extern s32 D_801C38F0; - -void func_8013D164(void) { - D_801C38F0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C4D62; -extern u8 D_801C4DD6; -extern u8 D_801C4C8A; -extern u8 D_801C4D44; -extern u8 D_801C4C68; -extern u8 D_801C4C89; -extern s32 D_801C4D48; - -void func_8013D330(void) { - if ((D_801C4D62 & 0xff) != D_801C4DD6) { - D_801C4D62 = ((D_801C4D62 & 0xff) < D_801C4DD6) ? (D_801C4D62 + 1) : (D_801C4D62 - 1); - } - if ((D_801C4C8A & 0xff) != D_801C4D44) { - D_801C4C8A = ((D_801C4C8A & 0xff) < D_801C4D44) ? (D_801C4C8A + 1) : (D_801C4C8A - 1); - } - if ((D_801C4C68 & 0xff) != D_801C4C89) { - D_801C4C68 = ((D_801C4C68 & 0xff) < D_801C4C89) ? (D_801C4C68 + 1) : (D_801C4C68 - 1); - } - D_801C4D48 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C38C8; -extern void *D_801C38CC; -extern void *D_801C38D0; -extern s32 D_801C38F8; -extern s32 D_801C38FC; -extern s32 D_801C3900; -extern s32 D_801C4CBC[]; - -extern u8 D_80184970[]; -extern u8 D_80184A18[]; -extern u8 D_801848C8[]; -extern u8 D_801849C4[]; -extern u8 D_80184A44[]; -extern u8 D_8018491C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C38F8 = param_2; - D_801C38FC = (param_2 >> 2) & 3; - D_801C3900 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C38C8 = D_80184970; - D_801C38CC = D_80184A18; - D_801C38D0 = D_801848C8; - } else { - D_801C38C8 = D_801849C4; - D_801C38CC = D_80184A44; - D_801C38D0 = D_8018491C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C3900 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C38F8 & 2) != 0) { - D_801C4CBC[0] = 0x140; - D_801C4CBC[3] = 0x80; - if (p[0x37] == 4) { - D_801C4CBC[0] = 0x140; - D_801C4CBC[3] = 0; - } - if (p[0x37] == 0) { - D_801C4CBC[0] = 0x140; - D_801C4CBC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C38D0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C38D0; -extern s16 *D_801C38D4; -extern s32 D_801C38E4; -extern s32 D_801C3904; -extern s32 D_801C3908; -extern s32 D_801C390C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C38D4 != 0) { - D_801C38E4 = 0; - p = (int *)(param_1 * 12 + (int)D_801C38D0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C3904 != x) { - flag = 1; - if (D_801C3904 < x) { - if (x - D_801C3904 < 5) { - D_801C3904 = x; - } else { - D_801C3904 = D_801C3904 + 4; - } - } else { - if (D_801C3904 - x < 5) { - D_801C3904 = x; - } else { - D_801C3904 = D_801C3904 - 4; - } - } - } - if (D_801C3908 != y) { - flag = 1; - if (D_801C3908 < y) { - if (y - D_801C3908 < 5) { - D_801C3908 = y; - } else { - D_801C3908 = D_801C3908 + 4; - } - } else { - if (D_801C3908 - y < 5) { - D_801C3908 = y; - } else { - D_801C3908 = D_801C3908 - 4; - } - } - } - if (D_801C390C != z) { - flag = 1; - if (D_801C390C < z) { - if (z - D_801C390C < 5) { - D_801C390C = z; - } else { - D_801C390C = D_801C390C + 4; - } - } else { - if (D_801C390C - z < 5) { - D_801C390C = z; - } else { - D_801C390C = D_801C390C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C38E4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80184AD4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C38D4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C3904); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C3908); - uVar5 = (*(int*)&D_801C390C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80184AD4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C38EC; - -s32 func_8013E054(void) { - return D_801C38EC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801854D0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801854A8; -extern s16 D_801854AA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801854D0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801854A8 = 2; - D_801854AA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801854AA = 0; - D_801854A8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C3920; - extern void * D_801C3924; - extern unsigned char D_80185148; - extern unsigned char D_80185160; - extern unsigned char D_801851D4; - extern unsigned char D_801851DC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C3920 = &D_80185148; - D_801C3924 = &D_801851D4; - } else { - D_801C3920 = &D_80185160; - D_801C3924 = &D_801851DC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801854D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801854D0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801854D0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801854AC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801854AC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801854AC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801854A8; -extern s16 D_801854AA; -extern unsigned char D_801854AC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801854AA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801854A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801854AA; - if (*r < 3) { - *r = *r + 1; - } - D_801854A8 = (u16)D_801854A8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801854AC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801854AC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801854AC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013FAF8); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8013FFD8); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8014032C); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80140608); - - -// @class: iv-combine -// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source -// pointer compile to fixed offsets when written base[0..n]; the target advances -// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead -// final increment, yielding the "increment N-2 then offset 0/2" tail). - -extern u8 *D_80185188; -extern u8 *D_8018518C; -extern u8 *D_80185190; -extern u8 *D_80185194; -extern u8 *D_80185198; -extern u16 *D_8018519C[]; -extern u16 *D_801851A4[]; -extern u16 *D_801851C4[]; - -extern s32 func_80028D58(void); -extern s32 func_80028DE0(void); -extern s32 func_80028FBC(void); -extern s32 func_80029000(void); -extern s32 func_80028D9C(void); - -void func_801407F4(void) -{ - u8 *puVar1; - s32 iVar2; - u16 *puVar3; - - puVar1 = D_80185188; - iVar2 = func_80028D58(); - puVar3 = D_8018519C[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - puVar1 = D_8018518C; - iVar2 = func_80028DE0(); - puVar3 = D_8018519C[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - iVar2 = func_80028FBC(); - *(s16 *)(D_80185190 + 0x18) = *D_801851A4[iVar2]; - iVar2 = func_80029000(); - *(s16 *)(D_80185194 + 0x18) = *D_801851A4[iVar2]; - - puVar1 = D_80185198; - iVar2 = func_80028D9C(); - puVar3 = D_801851C4[iVar2]; - *(s16 *)(puVar1 + 0x12) = *puVar3++; - *(s16 *)(puVar1 + 0x14) = *puVar3++; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - *(s16 *)(puVar1 + 0x1c) = *puVar3++; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80140958); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80140D68); - - -// @class: struct -// @stuck: none — MATCH - -extern unsigned char D_80078E7F; -extern unsigned char D_80078E7E; -extern unsigned char D_80078E7D; -extern M2C_UNK D_801850C4; - -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); - -void func_80140E6C(void) { - void *puVar1; - unsigned int uVar2; - unsigned int uVar3; - unsigned int uVar4; - - puVar1 = (*(void * *)&D_801850C4); - uVar2 = func_800D2CA8(D_80078E7F, 0x18); - uVar3 = func_800D2CA8(D_80078E7E, 0xc); - uVar4 = func_800D2CA8(D_80078E7D, 0); - func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); -} - - - - -// @class: plumbing -// @stuck: none — MATCH (128/128 ins, match_one confirmed) - -extern short D_80115128; -extern u8 D_801850D4; -extern char *D_801850F4; -extern char *D_801850F8; -extern char *D_801850FC; -extern char *D_80185100; -extern char *D_80185104; - -extern int func_80029FE4(void); -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); -extern char *func_8002AAB4(void); -extern char *strcpy(char *, const char *); -extern int func_8002A26C(void); -extern int func_8002A2B0(void); -extern int func_8002A4B8(void); -extern s32 func_8002A4FC(s32 a0); -extern int func_8002A998(void); -extern int func_8002A9DC(void); -extern int func_8002A728(void); -extern int func_8002A76C(void); -extern int func_80029FD4(void); - -void func_80140F00(void) { - char *p; - int r; - - if (D_80115128 == 0) { - p = (*(char * *)&D_801850D4); - r = func_800D2CA8(func_80029FE4() + 1, 0x18); - func_800D2D10(r, 2, p + 4, 1); - strcpy(p + 0xA, func_8002AAB4()); - - p = D_801850F4; - r = func_800D2CA8(func_8002A26C() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A2B0(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_801850F8; - r = func_800D2CA8(func_8002A4B8() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_801850FC; - r = func_800D2CA8(func_8002A998() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A9DC(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80185100; - r = func_800D2CA8(func_8002A728() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A76C(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80185104; - r = func_800D2CA8(func_80029FD4(), 4); - func_800D2D10(r, 7, p + 0x18, -1); - } -} - - - -// @class: other -// @stuck: none — MATCH - -extern short D_80115128; -extern unsigned short D_80115172; -extern unsigned short D_80184F8E; -extern unsigned short D_80184F92; -extern unsigned short D_80184F96; -extern unsigned short D_80184F9A; - -extern s32 func_8002A1B4(void); -extern short func_8002A28C(void); -extern short func_8002A27C(void); -extern s32 func_8002A400(void); -extern short func_8002A4D8(void); -extern short func_8002A4C8(void); -extern s32 func_8002A8E0(void); -extern short func_8002A9B8(void); -extern short func_8002A9A8(void); -extern s32 func_8002A670(void); -extern short func_8002A748(void); -extern short func_8002A738(void); -extern int func_801412A8(int, int, int, int, int, int); - -int func_80141100(int param_1) -{ - short sVar1; - int iVar7; - - if (D_80115128 == 0) { - iVar7 = D_80115172 + 0x31; - sVar1 = D_80184F8E; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); - sVar1 = D_80184F92; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); - sVar1 = D_80184F96; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); - sVar1 = D_80184F9A; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); - } - return param_1; -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801412A8); - -DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ - -DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ - -DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ - - -extern unsigned short D_80115112; -extern void (*D_80185524[])(void); - -void func_80141788(void) -{ - D_80185524[D_80115112](); -} - - -DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ - -DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80141874); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801418F8); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80141A60); - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80141B90); - -DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) - -extern u16 D_80115110; -extern u8 D_80185484; -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80141C0C(s32 param_1) -{ - func_8002D4C8(*(u16 *)(&D_80185484 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); -} - - -DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ - -DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ - -DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ - -DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_801424E4); - - -extern void (*D_80185564[])(void); - -void func_801425CC(void *a0) { - D_80185564[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: schedule -// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail - -extern void func_8012C1B8(void); -extern s32 func_8012C1DC(s32 a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012CAE4(void *a0); -extern s32 func_8012AD50(void *a0); -extern s32 D_80185548; - -void func_80142608(s32 param_1) -{ - register s32 iVar1 __asm__("$16"); - - if (*(short *)(param_1 + 0x70) != 0) { - iVar1 = ((s32 (*)(void))func_8012C1B8)(); - } else { - iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); - } - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CA1C(iVar1, (s32)&D_80185548); - *(short *)(iVar1 + 0x1a) = 0x200; - *(short *)(iVar1 + 0x18) = 0x200; - *(short *)(param_1 + 0xfc) = 0x40; - if (*(short *)(param_1 + 0x70) != 0) { - goto ad50; - } - if (*(s32 *)(param_1 + 100) != 0) { - *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); - goto ad50; - } - } - ((void (*)(s32))func_8012CAE4)(param_1); - return; -ad50: - *(short *)(param_1 + 0x98) = 0; - *(s32 *)(param_1 + 0x90) = 0; - ((void (*)(s32))func_8012AD50)(param_1); -} - - -DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ - -DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ - -DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ - -DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ - -DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80185578[])(); - -void func_801427EC(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80185578[*(u16 *)(param_1 + 2)](); - } -} - - -DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ - -DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80185594[])(); - -void func_8014292C(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80185594[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80185764[])(); - -void func_80142978(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80185764[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_8018581C[])(); - -void func_801429C4(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_8018581C[*(u16 *)(param_1 + 2)](); - } -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80142A10); - - -// @class: struct -// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) - -extern u16 D_800B99D8; -extern struct packed_word D_801C2FC0; -extern u8 D_801C3928; -extern u8 D_801C3929; -extern u8 D_801C392A; - -void func_80142A80(void) -{ - u16 flags; - union word_bytes local; - s32 mul; - - flags = D_800B99D8; - local.pw = D_801C2FC0; - - if (flags & 0x10) { - mul = (s8)((flags & 0xf) >> 1) + 9; - } else { - mul = 0x10 - (s8)((flags & 0xf) >> 1); - } - - D_801C3928 = mul * (local.b[0] >> 4); - D_801C3929 = mul * (local.b[1] >> 4); - D_801C392A = mul * (local.b[2] >> 4); -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80142B2C); - -DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ - -DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ - -DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ - -DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ - -DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ - -DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern int D_8018556C; - -void func_80142DC4(int param_1) -{ - int v0; - - *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_8018556C); - *(short *)(v0 + 0x1a) = 0x1800; - *(short *)(v0 + 0x18) = 0x1800; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80185588[]; - -void func_80142E38(int param_1) -{ - short sVar1; - int iVar2; - - *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_80185588); - sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; - *(short *)(iVar2 + 0x1a) = sVar1; - *(short *)(iVar2 + 0x18) = sVar1; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80142EC0); - -DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ - -DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result -// survives across func_8001CA1C while $v0 serves the pre-call store/test; -// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80185774[]; -extern unsigned char D_801857D4[]; - -void func_8014305C(int param_1) -{ - register int s0_param __asm__("$16") = param_1; - register int s1_copy __asm__("$17"); - int iVar2; - short sVar1; - - iVar2 = ((int (*)(void))func_8012C1B8)(); - *(int *)(s0_param + 0x20) = iVar2; - s1_copy = iVar2; - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(s0_param); - } else { - ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80185774); - sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; - *(short *)(s1_copy + 0x1a) = sVar1; - *(short *)(s1_copy + 0x18) = sVar1; - *(short *)(s0_param + 0xfc) = 0; - func_8012A828(s0_param, D_801857D4); - ((void (*)(int))func_80142B2C)(s0_param); - } -} - - -DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ - -DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) - - -extern void *memcpy(void *, const void *, u32); - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern int func_8001CA88(int, void *); -extern s32 func_8012E504(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80142B2C(void *arg0); - -extern u8 D_801C2FBC; -extern u8 D_801C3928; -extern u8 D_801C392C; - -void func_801431E8(s32 param_1) { - u8 buf[8]; - s32 iVar5; - u16 uVar2; - s16 sVar4; - - register s32 d __asm__("$16"); - memcpy(buf, &D_801C2FBC, 4); - iVar5 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = iVar5; - d = iVar5; - if (iVar5 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, void *))func_8001CA88)(d, &D_801C3928); - uVar2 = *(u16 *)(param_1 + 0x70); - *(s16 *)(d + 0x76) = -0x10; - sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; - *(s16 *)(d + 0x1a) = sVar4; - *(s16 *)(d + 0x18) = sVar4; - *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; - if (func_8012E504(param_1, 0x33) == 0) { - *(s16 *)(param_1 + 0xfc) = 1; - func_800233CC(&D_801C3928, 0x10); - memcpy(&D_801C392C, buf, 4); - } else { - *(s16 *)(param_1 + 0xfc) = 0; - } - ((void (*)(s32))func_80142B2C)(param_1); - } -} - - -DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ - -DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ - -DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) - -extern u8 D_800D387C[]; -extern u32 D_8018592C[]; - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80143458(s32 param_1) -{ - s32 p; - u16 v; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - p = *(s32 *)(param_1 + 0x20); - if (*(s32 *)(p + 4) == 0) { - *(s32 *)(p + 4) = 0x50000000; - } - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - v = *(u16 *)(param_1 + 0x34) & 0x7fff; - if (v != 0) { - p = *(s32 *)(param_1 + 0x20); - *(u16 *)(p + 0x1a) = v; - *(u16 *)(p + 0x18) = v; - } - - func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, - D_8018592C[*(u16 *)(param_1 + 0x34) & 3]); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - -DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_8014358C); - -DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ - -DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ - -DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ - -DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ - -DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ - -DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ - - -extern void (*D_80185A54[])(void); - -void func_80143B30(void *a0) { - D_80185A54[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ - -DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ - - -extern void (*D_80185A60[])(void); - -void func_80143C38(void *a0) { - D_80185A60[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ - - -extern void (*D_80185A68[])(void); - -void func_80143C98(void *a0) { - D_80185A68[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80143D28); - - -extern void (*D_80185AB0[])(void); - -void func_80143E68(void *a0) { - D_80185AB0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ - -DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ - -DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ - -DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ - - -extern void (*D_80185AC4[])(void); - -void func_80144054(void *a0) { - D_80185AC4[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80144090); - -extern void func_8012C218(void *a0); - -// @class: struct -// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) - -extern void (*D_80185ACC[])(); - -void func_801442F8(int param_1) -{ - int iVar1; - - D_80185ACC[*(u16 *)(param_1 + 2)](); - iVar1 = *(int *)(param_1 + 0x1c) + 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (0x1d < iVar1) { - func_8012C218(param_1); - } -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); -extern u8 D_80185A48; - -void func_80144364(int param_1) { - int iVar3; - u16 uVar2; - s16 sVar1; - - iVar3 = ((s32 (*)(void))func_8012C194)(); - if (iVar3 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); - *(int *)(param_1 + 0xCC) = iVar3; - *(u16 *)(param_1 + 0xFC) = uVar2; - func_8001CB6C((u8 *)iVar3, (s32)&D_80185A48, 0x250, 0x1A0); - *(s32 *)(iVar3 + 4) = 0x60000000; - *(u8 *)(iVar3 + 0x27) = 0x14; - *(u16 *)(iVar3 + 0x10) = 0x400; - *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); - *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); - *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); - sVar1 = *(s16 *)(param_1 + 0x70); - if (sVar1 != 0) { - *(s16 *)(iVar3 + 0x1A) = sVar1; - *(s16 *)(iVar3 + 0x18) = sVar1; - } else { - *(u16 *)(iVar3 + 0x1A) = 0x2000; - *(u16 *)(iVar3 + 0x18) = 0x2000; - } - *(u16 *)(param_1 + 2) = 1; - } -} - - - - -extern void func_80016714(void *a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_8012AD80(s32 a0); -extern void func_8012C218(void *a0); -extern s32 D_80185A5C; - -void func_80144458(void *arg0) { - s32 temp_s0; - void *temp_s2; - void *temp_v0; - - temp_s2 = M2C_FIELD(arg0, void **, 0xCC); - if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { - temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); - if (temp_v0 != NULL) { - temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; - M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80185A5C * 0x10); - M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80185A5C * 0x10); - func_8012AD80(arg0); - } - } - M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); - M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); - M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); - if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { - func_80016714(temp_s2, 0x38); - func_8012C218(arg0); - } -} - - -DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ - -DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ - -DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern u8 D_80185A70; -extern u8 D_80185A7C; - -void func_8014477C(void *param_1) { - s32 v0; - s32 v1; - register s32 uVar2 __asm__("$2"); - register s32 addr __asm__("$3"); - s32 gv; - s32 fv; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)((s32)param_1 + 0x20) = v0; - if (v0 == 0) { - func_8012CAE4(param_1); - return; - } - ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80185A70); - if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { - *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); - uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); - if (uVar2 != 0) { - addr = uVar2 & 0xFFFFFFF; - gv = *(u16 *)((addr | 0x80000000) + 8); - fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; - *(u16 *)((s32)param_1 + 0xA) = gv + fv; - } else { - *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; - } - } - ((void (*)(void *, void *))func_8012A828)(param_1, &D_80185A7C); - v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; - *(s16 *)((s32)param_1 + 0x2) = 1; - *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; - *(s32 *)((s32)param_1 + 0x1C) = 0x78; -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); - -extern u8 D_80185A48; -extern u8 D_80185AB8; - -void func_80144880(s32 param_1) -{ - register s32 obj __asm__("$16"); /* $s0 */ - register s32 self __asm__("$17") = param_1; /* $s1 */ - register s32 b __asm__("$2"); /* $v0 */ - s32 e; - - obj = ((s32 (*)(void))func_8012C194)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(self); - } else { - *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); - *(s32 *)(self + 0xCC) = obj; - if (*(s16 *)(self + 0x70) == 1) { - func_8001CB6C((u8 *)obj, (s32)&D_80185A48, 0x250, 0x1A0); - b = 0x14; - } else { - func_8001CB6C((u8 *)obj, (s32)&D_80185AB8, 0x300, 0x1D0); - b = 0x6A; - } - *(u8 *)(obj + 0x27) = (u8)b; - *(s32 *)(obj + 4) = 0x60000000; - *(u16 *)(obj + 0x10) = 0x400; - *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); - *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); - e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); - *(u16 *)(obj + 0x1A) = 0x4000; - *(u16 *)(obj + 0x18) = 0x4000; - *(u16 *)(obj + 0xC) = (u16)e; - *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; - } -} - - -DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ - - -extern void (*D_80185AD4[])(void); - -void func_801449C8(void *a0) { - D_80185AD4[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ - - -extern void (*D_80185ADC[])(void); - -void func_80144A2C(void *a0) { - D_80185ADC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ - -DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ - -DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ - -DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103", func_80144B14); diff --git a/src/ov_SC03_103/ov_SC03_103_jr_8012ACE0.c b/src/ov_SC03_103/ov_SC03_103_jr_8012ACE0.c new file mode 100644 index 000000000..978efd4b5 --- /dev/null +++ b/src/ov_SC03_103/ov_SC03_103_jr_8012ACE0.c @@ -0,0 +1,2827 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C2630; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801843C8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C37DC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C4D68; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C2630; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184104)(); +extern s16 (*D_80184108)(); +extern M2C_UNK (*D_80184110)(); +extern s32 (*D_80184114)(); +extern s32 D_801C37D8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C2634; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018445C; +extern void func_8012ACA0(void *arg0); +/* ==== end §8b carried decl layer ==== */ + + + + +// @class: iv-combine +// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ + +s32 func_8012ACE0(void *o) { + int i; + for (i = 0; ; i++) { + switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { + case -2: + case -1: + case 0: + return i; + case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ + default: + break; + } + } +} + +DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ + +DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ + + + +void func_8012AD64(s32 *a0, s16 a1) { + *(s16*)((s32)a0 + 0x34) = a1; +} + + +DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ + +DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ + +DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ + +DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ + +DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ + +DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ + +DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ + +DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ + +DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ + +DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ + +DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ + +DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ + +DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ + +DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ + +DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ + +DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ + +DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012B4B8); + +DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ + +DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ + +DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ + +DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012B77C); + +DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ + +DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ + +DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ + +DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ + +DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ + +DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ + +DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ + +DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ + +DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ + +DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ + +DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ + +DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ + +DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ + +DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ + + +void func_8012BF4C(s32 *a0, s32 a1) { + *(s32*)((s32)a0 + 0x1C) = a1; +} + + +DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ + +DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ + +DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ + +DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ + +DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012C098); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012C0EC); + +DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ + +DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ + +DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ + +DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ + +DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ + +DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ + +DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ + +DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ + +DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ + +DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ + +DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012C658); + +DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012C750); + +DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to +// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS +// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via +// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store +// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. +// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). + +extern s32 D_80187940; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern void func_80016714(void *a0, s32 a1); + +s32 func_8012C890(s32 a0, s32 a1, s32 a2) { + u8 *src = (u8 *)a0; + u8 *dst = (u8 *)a1; + u16 *d; + s16 count; + u16 v2, v4; + s32 v10; + void *obj; + + *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); + v2 = *(u16 *)(src + 0x0); + *(u16 *)(dst + 0x6) = v2; + *(u16 *)(dst + 0x88) = v2; + v2 = *(u16 *)(src + 0x2); + *(u16 *)(dst + 0xA) = v2; + *(u16 *)(dst + 0x8A) = v2; + v4 = *(u16 *)(src + 0x4); + *(u16 *)(dst + 0xC) = 0; + *(u16 *)(dst + 0x8) = 0; + *(u16 *)(dst + 0x4) = 0; + *(u16 *)(dst + 0xE) = v4; + *(u16 *)(dst + 0x8C) = v4; + *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); + *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; + *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); + v10 = *(s32 *)(src + 0x10); + *(s32 *)(dst + 0x78) = (s32)&D_80187940; + *(s32 *)(dst + 0xDC) = v10; + + { + register u16 *pc __asm__("$3"); + pc = &(*(u16 *)&D_801270C4); + *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; + count = *(volatile u16 *)pc + 1; + *pc = count; + if (count == 0) { + *pc = 1; + } + } + + if (a2 != 0) { + *(s32 *)(dst + 0x64) = a2; + *(s32 *)(dst + 0x68) = 0; + } else { + *(s32 *)(dst + 0x64) = 0; + *(s32 *)(dst + 0x68) = (s32)src; + } + + *(u16 *)(src + 0xA) |= 0x8000; + *(u16 *)(dst + 0x2) = 0; + d = D_801274E4; + *d &= 0xFFFE; + (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); + + if (*d & 1) { + s32 a1v; + obj = *(void **)(dst + 0x20); + if (obj != 0) { + s32 t = *(u16 *)obj; + if (t != 1) { + if (t != 2) { + goto done; + } + a1v = 0x38; + } else { + a1v = 0x84; + } + func_80016714(obj, a1v); + done:; + } + func_80016714(dst, 0x10C); + *(u16 *)(src + 0xA) &= 0x7FFF; + return 0; + } + + if (*(s32 *)(dst + 0x64) == 0) { + void *o = *(void **)(dst + 0x20); + if (o == 0) { + return (s32)dst; + } + if (*(u16 *)o == 1) { + s16 c = *(s16 *)(src + 0xC); + if (c != 0x7FFF) { + *(s16 *)((u8 *)o + 0x12) = c; + } + } + } + if (*(s32 *)(dst + 0x20) != 0) { + *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); + } + return (s32)dst; +} + + +DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ + +DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ + +DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ + +DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ + +DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ + +DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ + +DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ + +DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012CC88); + +DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ + +DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ + +DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ + +DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ + +DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ + +DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ + +DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ + +DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ + +DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ + +DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ + +DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH + + +struct S8012D664_8012D664 { short a, b, c; }; + +int func_8012D664(int arg0, int arg1, int arg2) { + extern int func_8012F568(); + extern int D_8018446C; + + struct S8012D664_8012D664 s; + int ret; + int t; + + s.a = (*(unsigned short*)&D_80126B5E); + s.b = (*(unsigned short*)&D_80126B62) - 0x40; + s.c = (*(unsigned short*)&D_80126B66); + ret = ((int(*)())func_800132BC)(arg0, &s); + t = arg1 + 0x20; + if (ret < t * t) { + func_8012F568(1, 1, 0, arg2, arg0, &D_8018446C); + return 1; + } + return 0; +} + + + +DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ + + + +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184474; +extern M2C_UNK D_8018447C; + +s32 func_8012DB84(void) +{ + func_8014C978(); + func_8012F568(1, 0xC001, 0, 0x3E8, &D_80184474, &D_8018447C); +} + + +DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH + + +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; + + +s32 func_8012DDA4() +{ + extern Entry_8012DDA4 * D_801C37FC; + extern Entry_8012DDA4 * D_801C37F8; + + Entry_8012DDA4 *p; + Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); + + while (D_801C37FC != end) { + p = D_801C37FC; + if (p->active != 0 && p != D_801C37F8) { + D_801C37FC = p + 1; + return p; + } + D_801C37FC++; + } + D_801C37FC = 0; + return 0; +} + + + +// @class: plumbing +// @stuck: none — MATCH (35/35 ins, relocation-masked) + + +s32 func_8012DE2C(s32 a0) { + extern u8 * D_801C37FC; + extern u8 * D_801C37F8; + + u8 *base; + u8 *end; + u8 *p; + + base = D_801202A0; + end = base + 0x6480; + D_801C37FC = base; + D_801C37F8 = ((u8 *)a0); + + while (D_801C37FC != end) { + p = D_801C37FC; + if (*(u16 *)p != 0 && p != ((u8 *)a0)) { + D_801C37FC = p + 0x10C; + return p; + } + D_801C37FC += 0x10C; + } + D_801C37FC = 0; + return 0; +} + + + +DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ + +DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ + +DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ + +DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ + +DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012E014); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012E138); + + +s32 func_8012E27C(void) { + return 1; +} + + +DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ + +DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ + +DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012E364); + +DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ + +DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ + +DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ + +DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ + +DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH +extern u8 D_800AF648; +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) +{ + struct { short xy[2]; int sp14; int flag; } f; + register void *p __asm__("$4"); + p = &D_800AF648; + func_8004914C(p); + func_800491AC(&D_800AF648); + RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); + if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { + func_8002D4C8(param_2, param_3); + } +} + + +DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012E778); + +DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ + +DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ + +DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ + +DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ + + + +// @class: other +// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) + +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184484; + +void func_8012E9C0(int param_1) +{ + int iVar1; + + if (*(short *)(param_1 + 0x60) != 0) { + if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { + *(short *)(param_1 + 0x82) = 0; + *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); + *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); + *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); + } + if (*(int *)(param_1 + 0x78) != 0) { + iVar1 = *(short *)(param_1 + 0x60) * + *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; + if (iVar1 < 1) { + iVar1 = 1; + } + } else { + iVar1 = *(short *)(param_1 + 0x60); + } + func_8016AA50(param_1, iVar1); + if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { + func_8016B428(param_1); + func_80019064(&D_80184484); + } + } + return; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012EA90); + +DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ + +DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ + +DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ + +DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012EFB8); + + +// @class: other +// @stuck: none — MATCH (33 ins, match_one verified) + +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); + +void func_8012F038(int param_1, short *param_2, short *param_3) { + int in[3]; + int out[3]; + + in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); + in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); + in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); + ApplyTransposeMatrixLV((void *)param_1, in, out); + param_3[0] = out[0]; + param_3[1] = out[1]; + param_3[2] = out[2]; +} + + +DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(s32 a0, s32 a1, void *a2); + +void func_8012F14C(s32 a0, s32 a1, s32 a2) +{ + s32 buf[2]; + func_8004914C((void *)a0); + func_800491AC((void *)a0); + RotTransSV(a1, a2, buf); +} + + +DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ + +DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012F274); + +DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ + +DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012F40C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_8012F49C); + +DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ + +DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ + +DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ + +DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ + +DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801844A0[]; + +void func_8012F828(int param_1) +{ + *(unsigned char *)(param_1 + 0xC1) = 4; + if (*(unsigned int *)(param_1 + 0xB4) & 8) { + func_80131170(param_1, D_801844A0, 0xB); + } + func_80131CA8(param_1, 9); +} + + +DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ + + +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern void func_80131CA8(int a0, int a1); +extern u8 D_801844AC[]; + +void func_8012F8C8(u8* arg0) { + *(u8*)(arg0 + 0xC1) = 7; + if (*(u32*)(arg0 + 0xB4) & 0x80) { + ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801844AC, 0xB); + } + ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); +} + + +DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ + +DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ + +DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ + +DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ + +DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. +// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for +// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be +// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an +// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). +// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: +// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. +// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which +// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because +// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. +// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out +// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, +// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what +// blocks reorg from sharing a downstream constant into a branch delay slot.) + + +s32 func_8012FCC4(s32 param_1) { + extern int D_801844B8; + + int v1 = *(int *)(((int)param_1) + 0xC4); + *(char *)(((int)param_1) + 0xC1) = 8; + if (v1 & 2) { + *(char *)(((int)param_1) + 0xC1) = 1; + func_80131CA8(((int)param_1), 3); + return; + } + if (v1 & 1) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 1); + return; + } + if (*(int *)(((int)param_1) + 0xB4) & 0x100) { + ((void (*)(int))func_80131B14)(((int)param_1)); + if (*(short *)(((int)param_1) + 0x76) <= 0) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); + return; + } + if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { + *(char *)(((int)param_1) + 0xC2) = 0; + } else { + *(short *)(((int)param_1) + 0x98) = 0; + *(char *)(((int)param_1) + 0xC2) = 1; + } + ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801844B8); + *(int *)(((int)param_1) + 0x1C) = 0; + func_80131CA8(((int)param_1), 0x1C); + return; + } + func_80131CA8(((int)param_1), 0x1C); +} + + + +DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ + +DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ + +DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ + +DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ + +DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ + +DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ + +DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ + +DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ + +DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ + +DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ + +DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ + +DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ + +DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ + +DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ + +DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ + +DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ + +DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80130650); + +DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ + +DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ + +DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ + +DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ + +DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ + +DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80130A18); + +DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ + +DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80130C08); + + +extern void (*D_801844C0[])(void); + +void func_80130D0C(void *a0) { + D_801844C0[*(u8 *)((s32)a0 + 0xC1)](); +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184510[]; +extern s16 D_80184540[]; +extern s16 D_801845A0[]; +extern s16 D_801845A8[]; +extern s16 D_801845C8[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80184540; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801845A0; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801845A8; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_801845C8; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80184510; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + + +// @class: loop-guard +// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps +// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` +// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); +// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's +// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC +// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). + + +void func_80131170(s32 p, s32 b, s32 c) { + extern u8 D_80184494[]; + + func_80131B14(); + *(u8 *)(((u8 *)p) + 0xC2) = 0; + *(u8 *)(((u8 *)p) + 0xC3) = 0; + *(s16 *)(((u8 *)p) + 0x98) = 0; + if (((u8 *)b) == 0) { + ((u8 *)b) = D_80184494; + } + func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); + *(s32 *)(((u8 *)p) + 0x1C) = 0; + if (c != 0) { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } else { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } +tail: + if (*(s16 *)(((u8 *)p) + 0x76) > 0) { + return; + } + if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); + } else { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); + } +} + + + +// @class: struct +// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) + +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ + + +s32 func_801312D0(s32 param_1, void *param_2) +{ + extern int func_80131CF4(int, int); + extern M8_801312D0 D_801845E8; + + int iVar5; + + iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); + if (iVar5 != 0) { + ((short *)param_2)[2] = 0; + ((short *)param_2)[0] = 0; + ((short *)param_2)[1] = (short)iVar5; + } else { + *(M8_801312D0 *)((short *)param_2) = D_801845E8; + } +} + + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80131340); + +DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80131A34); + +DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` +// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be +// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a +// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). +// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; +// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the +// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); +// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. + +void func_80131B14() { + extern void func_8002A520(void *); + extern void func_8002A790(void *); + extern u8 D_801845F0; + + register u8 *a0v __asm__("$4"); + u8 *p = a0v; + + + s32 e = *(u8 *)(p + 0x5E); + + if (*(s16 *)(p + 0x60) != 0) { + if (e == 0x1D) { + *(s16 *)(p + 0x82) = 0; + *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); + *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); + *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); + } + { + s32 dec; + s32 q = *(s32 *)(p + 0x78); + if (q != 0) { + dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; + if (dec <= 0) dec = 1; + } + *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; + } + ((void (*)(void *))func_8016AA50)(p); + if (*(u16 *)(p + 0x82) & 1) { + ((void (*)(void *))func_8016B428)(p); + ((void(*)(void *))func_80019064)(&D_801845F0); + } + } + + *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; + + if (e != 0x1D) { + if (*(u8 *)(p + 0xC8)) func_8002A520(p); + if (*(u8 *)(p + 0xC9)) func_8002A790(p); + } + + if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; + + { + s32 r = *(s32 *)(p + 0x20); + *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; + { + s32 r2 = *(s32 *)(p + 0x20); + *(s16 *)(r2 + 0x14) = 0; + *(s16 *)(r2 + 0x10) = 0; + } + } + + ((void (*)(void *))func_8012B2CC)(p); + ((void (*)(void *))func_8012B23C)(p); +} + + + +DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80131CA8); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80131CF4); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80131D68); + + +extern void (*D_80184600[])(struct S80131E00 *a0); + +void func_80131E00(struct S80131E00 *a0, s32 a1) { + a0->field_B0 = a1; + D_80184600[a1](a0); +} + + +DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ + +DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ + +DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ + + +extern void (*D_80184658[])(void); + +void func_80131EEC(void *a0) { + D_80184658[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801846A0[])(void); + +void func_80131F28(void *a0) { + D_801846A0[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801846A8[])(void); + +void func_80131F64(void *a0) { + D_801846A8[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801846B0[])(void); + +void func_80131FA0(void *a0) { + D_801846B0[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801846B8[])(void); + +void func_80131FDC(void *a0) { + D_801846B8[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80132018); + +DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80184660; + +void func_801320D8(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80184660; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +s32 func_80132144(s32 param_1) +{ + extern int D_80184670; + + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(((int)param_1) + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(((int)param_1)); + } else { + ((void(*)(int, int))func_8001C214)(v0, 0); + *(int *)(((int)param_1) + 0x58) = (int)&D_80184670; + *(short *)(((int)param_1) + 0x5c) = 0x80; + *(unsigned short *)(((int)param_1) + 2) += 1; + } +} + + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80184680; + +void func_801321B0(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80184680; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80184690; + +void func_8013221C(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80184690; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + +DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ + +DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_801325B8); + +DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ + +DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ + +DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ + +DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ + +DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ + +DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80132F40); + +DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_801330E0); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80133298); + +DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ + +DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH + +extern s32 D_801C3848; +extern s32 D_801C384C[]; +extern int D_801C3850; +extern void func_80136BC4(s32 a0); + +void func_801336E8(void *a0, int a1, int a2) { + if (a0 != 0) { + (*(void * *)&D_801C3848) = a0; + ((void (*)(void))func_80136BC4)(); + } + (*(int *)&D_801C384C) = a1; + D_801C3850 = a2; +} + + + + +extern s32 D_801C384C[]; +extern s32 D_801C3848; +extern void func_80136BC4(s32); + +void func_8013373C(s16 arg0) { + s32 temp = D_801C384C[arg0]; + if (temp != 0) { + D_801C3848 = temp; + func_80136BC4(temp); + } +} + + +// @class: regalloc-order +#include "common.h" + +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; + + +s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { + extern s32 func_80047D3C(s32); + extern s32 func_80133AB0(s16, s16, s16, s32); + extern Box_80133784 * D_801846C0; + extern Box_80133784 * D_801846C4; + extern s16 D_801C3854; + extern u16 D_801C3858; + + register s32 s1 __asm__("$17"); + s32 s2; + register s16 s3 __asm__("$19"); + register s32 s4 __asm__("$20"); + register s16 a0v __asm__("$4"); + register s16 arg0s __asm__("$21"); + s32 dx, dy, dz; + s32 r, ret; + + a0v = ((s16)arg0); + s1 = 0; + s3 = 0; + s4 = 0; + s2 = 0; + arg0s = a0v; + D_801846C0->f6 = -0x7FFF; + D_801846C4->f6 = 0x7FFF; + D_801846C0->f0 = ((Box_80133784 *)arg1)->f0; + D_801846C0->f4 = ((Box_80133784 *)arg1)->f4; + D_801846C4->f0 = ((Box_80133784 *)arg2)->f0; + D_801846C4->f4 = ((Box_80133784 *)arg2)->f4; + D_801C3858 = 0; + D_801C3854 = 0; + + if ((s16)a0v == 0) { + s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; + s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; + s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; + if (sx == 0 && sy == 0) { + s32 zt = (sz == 0); + __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); + } + D_801846C0->f2 = ((Box_80133784 *)arg1)->f2 - 4; + r = func_80047D3C(sx * sx + sz * sz); + if (r < 3) { + r = 4; + } else if (r < 5) { + r += 1; + } + D_801846C4->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; + } else { + D_801846C0->f2 = ((Box_80133784 *)arg1)->f2; + if ((s16)a0v == 2) { + D_801846C4->f0 = D_801846C0->f0; + D_801846C4->f2 = D_801846C0->f2 + 6; + s2 = 1; + D_801846C4->f4 = D_801846C0->f4; + } else { + D_801846C4->f2 = ((Box_80133784 *)arg2)->f2; + } + } + + while (1) { + s32 ret0; + register s32 retc __asm__("$3"); + __asm__ __volatile__(""); + ret0 = func_80133AB0(arg0s, (s16)D_801846C0->f0, (s16)D_801846C0->f4, (*(s32*)&D_801C3848)); + __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); + ret = retc; + if (ret == 0) goto after; + s4 |= ret; + if (s2 != 0) goto after; + { + s16 oldc = s3; + s3 = s3 + 1; + if (oldc >= 5) break; + } + } + + D_801846C4->f0 = D_801846C0->f0; + D_801846C4->f2 = D_801846C0->f2; + s1 = 0x2000; + D_801846C4->f4 = D_801846C0->f4; + goto store_out; + +after: + if ((s16)s4 != 0 || D_801C3854 != 0) { + s16 t; + __asm__ __volatile__("" :: "r"(s4)); + t = D_801846C0->f6; + if (t >= -0xBCB) { + if (t < -0x578) { + s1 |= 0x4000; + } else { + s1 |= 0x8000; + } + } + if ((s16)D_801846C4->f6 < -0xBCB) { + s1 |= 0x2000; + } + store_out: + ((Box_80133784 *)arg2)->f0 = D_801846C4->f0; + ((Box_80133784 *)arg2)->f2 = D_801846C4->f2; + ((Box_80133784 *)arg2)->f4 = D_801846C4->f4; + ((Box_80133784 *)arg2)->f6 = D_801C3858; + return s1 & 0xFFFF; + } + ((Box_80133784 *)arg2)->f6 = D_801C3858; + return 0; +} + + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80133AB0); + + +s32 func_80133CD4(arg0, cmd, base, arr) + s16 arg0; + s16 *cmd; + s16 *base; + s32 *arr; +{ + typedef struct { s16 e[4]; } ElemK; + + extern u16 *D_801846C4; + extern u16 *D_801846C0; + extern s16 *D_801846CC; + extern s16 *D_801846C8; + extern s32 *D_801846D4; + extern s32 *D_801846D8; + extern u16 D_801C3858; + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern u16 D_801152AE; + extern u8 D_801152B0; + extern s32 func_80134310(); + extern s32 func_8013435C(); + + s16 *s3 = ((ElemK *)base)[cmd[1]].e; + s32 s6 = arr[cmd[2]]; + s32 s0var, s1var; + s32 s2a; + s16 y; + + if (func_80134310(s3, D_801846C4, s6) >= 0) + return 0; + + s1var = func_80134310(s3, D_801846C0, s6); + if (s1var < 0) + return 0; + + s0var = func_80134310(s3, D_801846CC, 0); + { + u16 *pac = D_801846C0; + s16 *pb8 = D_801846CC; + s16 *pb4 = D_801846C8; + s32 neg = -s1var; + pb4[0] = pac[0] + neg * pb8[0] / s0var; + pb4[1] = pac[1] + neg * pb8[1] / s0var; + pb4[2] = pac[2] + neg * pb8[2] / s0var; + if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) + return 0; + } + if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_801846C8, arr[cmd[6]], s3)) + return 0; + if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_801846C8, arr[cmd[8]], s3)) + return 0; + if (arg0 < 0) { + if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_801846C8, arr[cmd[10]], s3)) + return 0; + } + if (arg0 & 0x10) { + if (*(u16 *)cmd & 0x100) + return 0; + } + if (*(u16 *)cmd & 0x200) { + D_801C3858 = *(u16 *)cmd; + return 0; + } + + { + s32 ret = func_80134310(s3, D_801846C4, s6); + s32 *pc0; + s32 *pc4; + u16 *pb0; + s32 t, o2; + s32 q3v; + + { + s32 *pw = D_801846D4; + ((struct { s32 w; } *)pw)->w = s3[0]; + pw[1] = s3[1]; + pw[2] = s3[2]; + } + s1var = -ret; + + __asm__ __volatile__( + "lwc2 $9, 0(%0)\n" + "lwc2 $10, 4(%0)\n" + "lwc2 $11, 8(%0)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : "r"(D_801846D4) : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"(D_801846D8) : "memory"); + + pc0 = D_801846D4; + pc4 = D_801846D8; + s0var = pc4[0] + pc4[1] + pc4[2]; + pb0 = D_801846C4; + pb0[0] += s1var * pc0[0] / s0var; + pb0[1] += s1var * pc0[1] / s0var; + q3v = s1var * pc0[2] / s0var; + + { + s32 h; + h = ((s16 *)pb0)[0]; + s1var = h << 16; + __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); + s0var = h << 16; + } + pb0[2] += q3v; + s2a = (s16)pb0[2] << 16; + + t = pc0[0] << 4; + pc0[0] = t; + if (t < 0) s1var |= 0xFFFF; + t = pc0[1] << 4; + pc0[1] = t; + if (t < 0) s0var |= 0xFFFF; + o2 = pc0[2]; + t = o2 << 4; + pc0[2] = t; + if (t < 0) s2a |= 0xFFFF; + s2a += o2 << 5; + s1var += pc0[0] << 1; + s0var += pc0[1] << 1; + + do { + s32 *pl = D_801846D4; + u16 *pb; + s1var += pl[0]; + s0var += pl[1]; + s2a += pl[2]; + pb = D_801846C4; + pb[0] = s1var >> 16; + pb[1] = s0var >> 16; + pb[2] = s2a >> 16; + ret = func_80134310(s3, pb, s6); + } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); + } + + y = s3[1]; + if (y >= -0xBCB) { + D_801846C0[3] = y; + { + typedef struct { s8 c[8]; } Blk8; + *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; + } + if (*(u8 *)cmd != 0) + goto ret1; + return -1; + } + { + typedef struct { u16 h; } H16; + u16 *s3u = (u16 *)s3; + u16 *bp = D_801846C4; + u16 w; + ((H16 *)D_801152A8)->h = s3u[0]; + w = s3u[1]; + bp[3] = w; + ((H16 *)&D_801152AA)->h = w; + ((H16 *)&D_801152AC)->h = s3u[2]; + ((H16 *)&D_801152AE)->h = s3u[3]; + } +ret1: + return 1; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80134310); + +DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (83 ins, relocation-masked) + + + +s32 func_801343C4(s32 angle, s32 p1, s32 p2) +{ + extern int func_80133AB0(int, s16, s16, int); + extern s16 * D_801846C0; + extern s16 * D_801846C4; + extern u16 D_801C3858; + extern u16 D_801C3854; + + s16 *pac; + s16 *pb0; + s16 *pacs, *pb0s; + u16 *pb0u; + int a1v, a2v, d94, b0; + int sangle = ((s16)angle); + + pac = D_801846C0; + d94 = D_801C3848; + pb0 = D_801846C4; + pac[0] = ((u16 *)p1)[0]; + pac[1] = ((u16 *)p1)[1]; + pac[2] = ((u16 *)p1)[2]; + pb0[0] = ((u16 *)p2)[0]; + pb0[1] = ((u16 *)p2)[1]; + pb0[2] = ((u16 *)p2)[2]; + + a1v = pac[0]; a2v = pac[2]; + __asm__ __volatile__("" ::: "memory"); + D_801C3858 = 0; + D_801C3854 = 0; + if (func_80133AB0(sangle, a1v, a2v, d94)) { + setdst: + pb0u = (u16 *)D_801846C4; + ((u16 *)p2)[0] = pb0u[0]; + ((u16 *)p2)[1] = pb0u[1]; + ((u16 *)p2)[2] = pb0u[2]; + ((u16 *)p2)[3] = D_801C3858; + return 1; + } + + pacs = D_801846C0; + pb0s = D_801846C4; + b0 = pb0s[0]; + if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && + (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { + return 0; + } + if (func_80133AB0(sangle, b0, pb0s[2], D_801C3848)) { + goto setdst; + } + return 0; +} + + + +// @class: schedule +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; + + +s32 func_80134510(s32 param) { + extern s32 func_801345F8(s32); + extern Foo_80134510_80134510 * D_801846C0; + extern Foo_80134510_80134510 * D_801846C4; + extern Foo_80134510_80134510 * D_801846C8; + extern u16 D_801C3858; + + + s32 ret = 0; + Foo_80134510_80134510 *b0 = D_801846C4; + Foo_80134510_80134510 *ac = D_801846C0; + u16 t0 = ((Foo_80134510_80134510 *)param)->f0; + u16 t2, t4; + + ((Foo_80134510_80134510 *)param)->f6 = 0; + ac->f0 = t0; + b0->f0 = t0; + t2 = ((Foo_80134510_80134510 *)param)->f2; + ac->f2 = t2 - 4; + b0->f2 = t2 + 0x2FC; + t4 = ((Foo_80134510_80134510 *)param)->f4; + ac->f4 = t4; + b0->f4 = t4; + + if (func_801345F8((*(s32*)&D_801C3848)) != 0) { + s16 x; + ((Foo_80134510_80134510 *)param)->f2 = D_801846C8->f2 - 2; + x = D_801846C0->f6; + if (x >= -3019) { + if (x < -1400) { + ret = 0x4000; + } else { + ret = 0x8000; + } + } else { + ret = 0x2000; + } + D_801846C0->f6 = D_801C3858; + } + return ret; +} + + + +// @class: regalloc-order +// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. + + +s32 func_801345F8(s32 arg) +{ + extern int func_801347A0(short, u16 *, int, int); + extern u16 * D_801846C0; + extern u16 D_801C3858; + + register u16 *param_1 __asm__("$5") = ((u16 *)arg); + register u16 *cc __asm__("$4") = D_801846C0; + int c8000 = 0x8000; + register int zr __asm__("$0"); + u32 c1, c2, uVar6, uVar2, cnt, v14; + u16 *ptmp, *puVar4, *puVar7, uVar1; + int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; + + c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; + uVar6 = c1 + zr; + if ((c1 & 0xffff) < (u32)param_1[2]) { + c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; + uVar2 = c2 + zr; + if ((c2 & 0xffff) < (u32)param_1[3]) + goto do_mult; + return 0; + found: + D_801C3858 = *puVar7; + return 1; + do_mult: + tbl = *(int *)(param_1 + 4); + uVar10 = *(int *)(param_1 + 6); + uVar3 = *(int *)(param_1 + 8); + iVar9 = *(int *)(param_1 + 0xc); + iVar8 = *(int *)(param_1 + 0xe); + ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); + cnt = (u32)ptmp[1]; + v14 = *(int *)(param_1 + 10); + puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; + while (((cnt-- + zr) & 0xffff) != 0) { + uVar1 = *puVar4; + hi = uVar1 & 0x8000; + harg = hi + zr; + if (hi == 0) + puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); + else + puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); + if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) + goto found; + puVar4 = puVar4 - 1; + } + } + return 0; +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. +#include "common.h" + +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; + +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; + +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; + + + +s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); + extern s16 * D_801846C4; + extern SVec_801347A0 * D_801846C0; + extern SVec_801347A0 * D_801846C8; + + Elem_801347A0 *pElem; + s32 val; + register s32 iv __asm__("$4"); + s32 q; + s32 dvsr; + + pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; + val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; + if (func_80134A28((s32)pElem, (s32)D_801846C4, val) >= 0) { + return 0; + } + iv = func_80134A28((s32)pElem, (s32)D_801846C0, val); + if (iv < 0) { + return 0; + } + iv = -iv; + dvsr = pElem->f2 * 48; + q = (iv * 48) / dvsr; + D_801846C8->f0 = D_801846C0->f0; + D_801846C8->f2 = D_801846C0->f2 + q; + D_801846C8->f4 = D_801846C0->f4; + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { + return 0; + } + if ((s16)arg0) { + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_801846C8, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { + return 0; + } + } + if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { + return 0; + } + D_801846C8->f0 = D_801846C0->f0; + D_801846C8->f4 = D_801846C0->f4; + (*(Elem_801347A0*)D_801152A8) = *pElem; + D_801846C0->f6 = pElem->f2; + return 1; +} + + + +DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80134A74); + +// @class: regalloc-order +// @try: variant B — direct pins m=$s5($21), c=$s6($22) + + +s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); + extern void * D_801846C0; + extern void * D_801846C4; + extern void * D_801846C8; + extern void * D_801846CC; + extern u16 D_801C3858; + + s32 temp_a3; + s32 temp_s1; + s32 temp_v0; + s32 temp_v0_2; + s32 var_v0; + u16 temp_a1; + s32 temp_s4; + s32 c = arg0; + __asm__ __volatile__("" : "=r"(c) : "0"(c)); + __asm__ __volatile__("" : : "r"(arg0)); + + temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); + temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); + var_v0 = 0; + if (func_80134FB8(temp_s4, (s32) D_801846C4, temp_s1) >= 0) { + return var_v0; + } + temp_v0 = func_80134FB8(temp_s4, (s32) D_801846C0, temp_s1); + if (temp_v0 < 0) { + goto block_13; + } + temp_v0_2 = func_80134FB8(temp_s4, (s32) D_801846CC, 0); + temp_a3 = -temp_v0; + { + u16 *pB4 = (u16 *)D_801846C8; + u16 *pAC = (u16 *)D_801846C0; + s16 *pB8 = (s16 *)D_801846CC; + pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; + pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; + pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { + return var_v0; + } + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_801846C8, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { + return var_v0; + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_801846C8, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { + return var_v0; + } + if ((arg0 << 16) < 0) { + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_801846C8, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { + return var_v0; + } + } + if (c & 1) { + if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { + goto block_14; + } + return 0; + } + temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); + if (!(temp_a1 & 0x200)) { + goto block_14; + } + D_801C3858 = temp_a1; +block_13: + return 0; +block_14: + __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); + VectorNormalSS(D_801846CC, D_801846CC); + { + u16 *pB8 = (u16 *)D_801846CC; + u16 *pB4b = (u16 *)D_801846C8; + pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); + var_v0 = 1; + pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); + pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); + } + return var_v0; +} + + + +DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype D_801846C4 + D_801846C0 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + extern int func_80134A74(int, s16, s16, int); + extern s16 * D_801846C4; + extern s16 * D_801846C0; + extern u8 D_801846CC; + extern s16 *D_801846C8; + extern u16 D_801C3858; + + register s16 *pb0 __asm__("$9"); /* D_801846C4 -> $t1 */ + register s16 *pac __asm__("$6"); /* D_801846C0 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_801846CC -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = D_801846C4; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = D_801846C0; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_801846CC); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_801C3848; + __asm__ __volatile__("" ::: "memory"); + D_801C3858 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_801846C8); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_801C3858; + return 1; + } + { + register u16 *qb __asm__("$4"); /* D_801846C0 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* D_801846C4[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* D_801846C4 -> $a2 (reloaded) */ + qb = (u16 *)D_801846C0; + qa = (u16 *)D_801846C4; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801C3848)) + goto found; + return 0; + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (62 ins, relocation-masked) + + +extern u8 D_801846C4; +extern u8 D_801846C0; +extern s16 *D_801846C8; +extern u8 D_801846CC; +extern int D_801C3848; +extern u16 D_801C3858; + +extern int func_80134A74(int, s16, s16, int); + +int func_80135168(u16 arg0, u16 *p1, u16 *p2) +{ + register s16 *pb0 __asm__("$8"); + register s16 *pac __asm__("$6"); + register s16 *pb8 __asm__("$7"); + u16 *pb4; + u16 a, b; + int a1v, a2v, d94; + + pb0 = (*(s16 * *)&D_801846C4); + __asm__ __volatile__("" : : "r"(pb0)); + + a = p2[0]; pac = (*(s16 * *)&D_801846C0); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_801846CC); pac[0] = b; pb8[0] = a - b; + a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; + a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; + + a1v = pac[0]; a2v = pac[2]; d94 = D_801C3848; + __asm__ __volatile__("" ::: "memory"); + D_801C3858 = 0; + if (func_80134A74(arg0, a1v, a2v, d94)) { + pb4 = (*(u16 * *)&D_801846C8); + p2[0] = pb4[0]; + p2[1] = pb4[1]; + p2[2] = pb4[2]; + p2[3] = D_801C3858; + return 1; + } + return 0; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80135260); + + +/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). + * + * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 + * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does + * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in + * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). + * + * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): + * the two output buffers D_801846C0 / D_801846C4 are written through a pointer in each of the two + * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a + * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also + * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each + * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks + * the lowest-free scratch over its OWN window: + * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) + * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) + * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail + * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. + * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades + * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the + * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. + * + * Zero file-scope footprint (block-scoped typedefs + externs; D_801846C0/B0 read via the ambient + * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for + * family_sweep --edit-remap with no cc1 crash. + * + * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. + */ +s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) +{ + typedef struct { s32 vx, vy, vz, pad; } Vec32; + typedef struct { s16 vx, vy, vz, pad; } Vec16; + typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; + extern void func_80048EAC(void *m0, void *m1); + extern void func_8004914C(void *m); + extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); + extern void ApplyRotMatrixLV(void *in, void *out); + extern void ApplyRotMatrix(void *in, void *out); + extern s32 D_801C385C, D_801C3860, D_801C3864, D_801C3868; + extern s16 D_801C386C; + extern s32 D_801C387C; + extern s16 D_801C3880, D_801C3882, D_801C3884, D_801C3886, D_801C3888, D_801C388A; + + Vec32 in0, in1, rotout; + Mat32 mat2; + Vec16 vecin; + s32 result; + s32 mode; + s32 q1, q2; + s32 p; + s32 t18, t1A, t1C; + s32 *m; + + in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); + in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); + if ((param_2 & 0x10000000) == 0) { + if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { + return 0; + } + } + mode = param_2 & 0x60000000; + if (mode != 0) { + result = 1; + if (param_2 >= 0) { + mode &= 0x40000000; + } + in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); + in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); + switch (mode) { + case 0x60000000: + m = &D_801C385C; + *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); + q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); + q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); + D_801C3860 = 0; + D_801C3868 = 0; + D_801C3864 = q1; + D_801C386C = q2; + func_80048EAC((void *)((s32)param_1 + 0x34), m); + ApplyTransposeMatrixLV(m, &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + /* fallthrough */ + case 0x20000000: + p = (param_2 & 0xFFFFFFF) | 0x80000000; + t18 = *(s16 *)((s32)param_1 + 0x18); + t1A = *(s16 *)((s32)param_1 + 0x1A); + t1C = *(u16 *)((s32)param_1 + 0x1C); + mat2.w4 = 0; + mat2.wC = 0; + mat2.w0 = t18; + mat2.w8 = t1A; + mat2.h10 = t1C; + func_8004914C(&mat2); + vecin.vx = *(u16 *)(p + 4); + vecin.vy = *(u16 *)(p + 8); + vecin.vz = *(u16 *)(p + 0xC); + ApplyRotMatrix(&vecin, &rotout); + D_801C3880 = rotout.vx; + D_801C3884 = rotout.vy; + D_801C3888 = rotout.vz; + vecin.vx = *(u16 *)(p + 6); + vecin.vy = *(u16 *)(p + 0xA); + vecin.vz = *(u16 *)(p + 0xE); + ApplyRotMatrix(&vecin, &rotout); + D_801C387C = 0; + D_801C3882 = rotout.vx; + D_801C3886 = rotout.vy; + D_801C388A = rotout.vz; + result += 2; + break; + case 0x40000000: + ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + break; + } + { + s16 *p = *(s16 **)&D_801846C0; + p[0] = in0.vx; + p[1] = in0.vy; + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_801846C4; + p[0] = in1.vx; + p[1] = in1.vy; + p[2] = in1.vz; + } + return result; + } + { + s16 *p = *(s16 **)&D_801846C0; + p[0] = in0.vx; + p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_801846C4; + p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); + p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); + } + return 1; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80135888); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80135A4C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80135D20); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80135EB0); + + +s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + register s32 a1v __asm__("$11"); + register s32 a2v __asm__("$12"); + register s32 n __asm__("$5"); + register s16 *b4 __asm__("$7"); + s32 d; + s32 dx; + s32 denom; + s32 result; + s32 frame_pad[2]; + (void)&frame_pad; + __asm__("" : "=r"(a1v) : "0"(arg1)); + a2v = arg2; + + if (!(arg1 & 1)) { + dx = (s16) arg2 - (*(s16 **)&D_801846C0)[2]; + d = dx; + denom = -(*(s16 **)&D_801846CC)[2]; + } else { + denom = (*(s16 **)&D_801846CC)[2]; + d = (*(s16 **)&D_801846C0)[2] - (s16) arg2; + dx = -d; + } + n = -d; + { + register s16 *b8 __asm__("$6") = *(s16 **)&D_801846CC; + u16 *ac = *(u16 **)&D_801846C0; + b4 = D_801846C8; + b4[0] = ac[0] + n * b8[0] / denom; + b4[1] = ac[1] + n * b8[1] / denom; + b4[2] = ac[2] + dx; + } + + if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; + if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; + if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; + if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; + if (a1v & 0x8000) { + u16 *b0 = *(u16 **)&D_801846C4; + b4[0] = b0[0]; + b4[1] = b0[1]; + } + D_801152AA = 0; + (*(s16 *)D_801152A8) = 0; + if (a1v & 1) { + D_801846C8[2] = a2v + 2; + __asm__ __volatile__(""); + D_801152AC = 0xFFF; + } else { + D_801152AC = -0xFFF; + D_801846C8[2] = a2v - 2; + } + __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); + (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; + D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; + result = 1; + D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; + return result; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_801365B8); + + +// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) +// D_801846C0/B0/B8 are file-scope `extern u8`, D_801846C8 is `extern s32 []`; each HOLDS a +// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. +// D_801846C8 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the +// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar +// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the +// siblings read it once via *(u16**)&sym == direct lw either way). + +s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + + register u16 *ac __asm__("$4"); + register s16 *b8 __asm__("$6"); + register s16 *b4 __asm__("$9"); + register s32 r __asm__("$3"); + register s32 pos __asm__("$12"); + register s32 a1v __asm__("$5"); + s16 temp_v0; + s16 temp_v1; + s32 var_a3; + s16 var_v0_3; + s32 temp_a1; + s32 var_t0; + s32 var_v1; + s16 *b4b; + u16 *p; + + __asm__ ("" : "=r"(a1v) : "0"(arg1)); + pos = arg2; + if (!(a1v & 1)) { + var_t0 = (s16) arg2 - (*(s16 **)&D_801846C0)[1]; + var_v1 = var_t0; + var_a3 = -(*(s16 **)&D_801846CC)[1]; + } else { + var_a3 = (*(s16 **)&D_801846CC)[1]; + var_v1 = (*(s16 **)&D_801846C0)[1] - (s16) arg2; + var_t0 = -var_v1; + } + b8 = (*(s16 **)&D_801846CC); + ac = (*(u16 **)&D_801846C0); + b4 = D_801846C8; + temp_a1 = -var_v1; + r = (temp_a1 * b8[0]) / var_a3; + b4[0] = ac[0] + r; + b4[1] = ac[1] + var_t0; + r = (temp_a1 * b8[2]) / var_a3; + temp_v0 = ac[2] + r; + b4[2] = temp_v0; + temp_v1 = b4[0]; + if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { + return 0; + } + if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { + return 0; + } + if (arg1 & 0x8000) { + p = (*(u16 **)&D_801846C4); + b4[0] = (s16) p[0]; + b4[2] = (s16) p[2]; + } + D_801152AC = 0; + (*(s16 *)D_801152A8) = 0; + if (arg1 & 1) { + b4b = D_801846C8; + D_801152AA = 0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos + 2; + } else { + b4b = D_801846C8; + D_801152AA = -0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos - 2; + } + b4b[1] = var_v0_3; + __asm__ __volatile__("" :: "r"(pos)); + (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); + D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); + D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); + return 1; +} + + +// @class: schedule +// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a +// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE +// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses +// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] +// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the +// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; +// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits +// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the +// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). + + +extern s16 *D_801846C8; /* holds a pointer value (*(u16**)&D_801846C8) */ + +s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { + extern void ApplyMatrixSV(void *m, void *v0, void *v1); + extern void ApplyRotMatrix(void *v0, void *v1); + extern u16 D_80126722; + extern s16 D_80126724; + extern s16 D_801152AA; + extern s16 D_801152AC; + + s32 out[4]; + u16 *pb4; + + if (a0) { + ApplyMatrixSV((void *)a3, *(void **)&D_801846C8, *(void **)&D_801846C8); + ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); + ApplyRotMatrix((void *)D_801152A8, (void *)out); + *(s16 *)D_801152A8 = out[0]; + D_801152AA = out[1]; + D_801152AC = out[2]; + } + + pb4 = *(u16 **)&D_801846C8; + *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); + *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); + *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); + + *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); + D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); + D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); +} + + + +DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ + +DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ + +DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ + +DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ + +DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ + + +extern unsigned short D_800B99F0; +extern void (*D_801846DC[])(void); + +void func_80136C54(void) +{ + D_801846DC[D_800B99F0](); +} + + +// @class: struct +// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801C2884 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). + +typedef struct { char s[10]; } S10_80136C90; + +s32 func_80136C90() +{ + extern void func_8001534C(int, void *, int, int, int, int); + extern S10_80136C90 D_801C2884; + + S10_80136C90 buf = D_801C2884; + func_8001534C(0, &buf, 0x78, 0x10, 0, 0); +} + + + +DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ + +DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80136DFC); + +DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ + +DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80136F3C); + +DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80137178); + +DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ + +DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80137614); + +DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ + +DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_801376E8); + +DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ + +DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_801378F0); + +DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ + +DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_801379FC); + + +// @class: remat +// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer +extern s32 D_80127548[]; +extern int D_80184730; +extern int D_801269F0; +extern void func_80138BE0(int p); + +void func_80137B80(void) { + int *p = &D_801269F0; + (*(int *)&D_80127548) = 0x24; + if (*p != 0) { + ((void (*)(int *))func_80138BE0)(p); + } + D_80184730 += 1; +} + + +DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. + +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int D_80184730; +extern int D_801269F0; + +extern void func_801392FC(); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); + +int func_80137D08(int arg0, int arg1, short arg2) +{ + unsigned char buf[3]; + + D_800A5E60 = arg0; + D_80126A0A = arg2; + ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); + if ((*(short *)&D_801269F4) == 7) { + buf[0] = 0x39; + buf[1] = 0xFF; + buf[2] = 0x71; + ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); + } else if ((*(short *)&D_801269F4) == 3) { + if (D_80184730 & 4) { + ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); + } + } + return D_800A5E60; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_8012ACE0", func_80137DD4); + +DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ diff --git a/src/ov_SC03_103/ov_SC03_103_jr_801380E0.c b/src/ov_SC03_103/ov_SC03_103_jr_801380E0.c new file mode 100644 index 000000000..6200dedc6 --- /dev/null +++ b/src/ov_SC03_103/ov_SC03_103_jr_801380E0.c @@ -0,0 +1,3320 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C2630; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801843C8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C37DC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C4D68; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C2630; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184104)(); +extern s16 (*D_80184108)(); +extern M2C_UNK (*D_80184110)(); +extern s32 (*D_80184114)(); +extern s32 D_801C37D8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C2634; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018445C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187940; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184474; +extern M2C_UNK D_8018447C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184484; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801844A0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801844AC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801844C0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184510[]; +extern s16 D_80184540[]; +extern s16 D_801845A0[]; +extern s16 D_801845A8[]; +extern s16 D_801845C8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184600[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80184658[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801846A0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801846A8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801846B0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801846B8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184660; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184680; +extern void func_801321B0(int param_1); +extern int D_80184690; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C3848; +extern s32 D_801C384C[]; +extern int D_801C3850; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801846C4; +extern u8 D_801846C0; +extern s16 *D_801846C8; +extern u8 D_801846CC; +extern int D_801C3848; +extern u16 D_801C3858; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801846C8; /* holds a pointer value (*(u16**)&D_801846C8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801846DC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184730; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184734[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184734[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184778; +extern u8 D_801847BC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184778; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801847BC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184800[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018483C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018483C; + if (((s16)a1) < 0xC00) { + tbl = D_80184800; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80184878, D_8018487A, D_8018487C, D_8018487E, D_80184880, D_80184882; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018487A < ang)) goto outer_else; + if (!(ang < D_80184880)) goto inner_else; + if (ang < D_8018487C) { *(s16 *)L = D_8018487C; goto done; } + if (D_8018487E < ang) { *(s16 *)L = D_8018487E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184878) { *(s16 *)L = D_80184878; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184882 < ang) { *(s16 *)L = D_80184882; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C38C0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C38C0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C38C0; +extern s8 D_801C38C4; +extern s8 D_801C38C5; + +void func_8013C9C4(void * arg0) +{ + D_801C38C0 = arg0; + D_801C38C4 = 0; + D_801C38C5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C38C0; +extern s8 D_801C38C4; +extern s8 D_801C38C5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C38C0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C38C5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C38C4)) * 2) + D_801C38C0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C38C5 = (unsigned char) p[1]; + D_801C38C4 = D_801C38C4 + 1; + if (D_801C38C5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C38C4 = 0; + *base = 0; + } + } + else + { + D_801C38C5 = c - 1; + } + } + return; +} + + + +extern s32 D_801C38E4; +extern s32 D_801C38D8; +extern s32 D_801C38DC; +extern s32 D_801C38E8; + +void func_8013CABC(void) { + D_801C38E4 = 1; + D_801C38D8 = 1; + D_801C38DC = 0; + D_801C38E8 = 1; +} + + + +extern s32 D_801C38D8; +extern s32 D_801C38DC; +extern s32 D_801C38E0; +extern s32 D_801C38E4; +extern s32 D_801C38E8; + +void func_8013CAE8(void) { + D_801C38D8 = 1; + D_801C38E4 = 0; + D_801C38DC = 0; + D_801C38E0 = -1; + D_801C38E8 = 0; +} + + + +extern s32 D_801C38E4; +extern s32 D_801C38E8; +extern s32 D_801C3910; +extern s32 D_801C3914; + +void func_8013CB20(void) +{ + D_801C3910 = D_801C38E8; + D_801C3914 = D_801C38E4; + D_801C38E8 = 1; + D_801C38E4 = 0; +} + + + +extern s32 D_801C3910; +extern s32 D_801C3914; +extern s32 D_801C38E8; +extern s32 D_801C38E4; + +void func_8013CB5C(void) { + D_801C38E8 = D_801C3910; + D_801C38E4 = D_801C3914; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C4C80; + extern u8 D_801C4C81; + extern u8 D_801C4C82; + extern u8 D_801C4C83; + extern u8 D_801C4C84; + extern u8 D_801C4C85; + extern u8 D_801C4C86; + extern u8 D_801C4C87; + extern u8 D_801C4C88; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C4C80; t1 = D_801C4C81; t2 = D_801C4C82; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C4C83; t1 = D_801C4C84; t2 = D_801C4C85; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C4C86; t1 = D_801C4C87; t2 = D_801C4C88; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C38F0; +extern s32 D_801C38D8; +extern s32 D_801C38F4; +extern s32 D_801C38E4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C38F0 != 0) { + if (D_801C38F0 != 2) { + if (((D_801C38F0 < 3) && (D_801C38F0 == 1)) && + (D_801C38F4 = D_801C38F4 + 1, 0x23a < D_801C38F4)) { + D_801C38D8 = D_801C38F0; + D_801C38F0 = 2; + } + } else { + D_801C38D8 = D_801C38D8 + -1; + if (D_801C38D8 == 0) { + D_801C38D8 = D_801C38F0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C38E4 == 0) { + D_801C38F0 = D_801C38F0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C38E4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C38E4; +} + + + +extern s32 D_801C38F0; + +void func_8013D164(void) { + D_801C38F0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C4D62; +extern u8 D_801C4DD6; +extern u8 D_801C4C8A; +extern u8 D_801C4D44; +extern u8 D_801C4C68; +extern u8 D_801C4C89; +extern s32 D_801C4D48; + +void func_8013D330(void) { + if ((D_801C4D62 & 0xff) != D_801C4DD6) { + D_801C4D62 = ((D_801C4D62 & 0xff) < D_801C4DD6) ? (D_801C4D62 + 1) : (D_801C4D62 - 1); + } + if ((D_801C4C8A & 0xff) != D_801C4D44) { + D_801C4C8A = ((D_801C4C8A & 0xff) < D_801C4D44) ? (D_801C4C8A + 1) : (D_801C4C8A - 1); + } + if ((D_801C4C68 & 0xff) != D_801C4C89) { + D_801C4C68 = ((D_801C4C68 & 0xff) < D_801C4C89) ? (D_801C4C68 + 1) : (D_801C4C68 - 1); + } + D_801C4D48 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C38C8; +extern void *D_801C38CC; +extern void *D_801C38D0; +extern s32 D_801C38F8; +extern s32 D_801C38FC; +extern s32 D_801C3900; +extern s32 D_801C4CBC[]; + +extern u8 D_80184970[]; +extern u8 D_80184A18[]; +extern u8 D_801848C8[]; +extern u8 D_801849C4[]; +extern u8 D_80184A44[]; +extern u8 D_8018491C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C38F8 = param_2; + D_801C38FC = (param_2 >> 2) & 3; + D_801C3900 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C38C8 = D_80184970; + D_801C38CC = D_80184A18; + D_801C38D0 = D_801848C8; + } else { + D_801C38C8 = D_801849C4; + D_801C38CC = D_80184A44; + D_801C38D0 = D_8018491C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C3900 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C38F8 & 2) != 0) { + D_801C4CBC[0] = 0x140; + D_801C4CBC[3] = 0x80; + if (p[0x37] == 4) { + D_801C4CBC[0] = 0x140; + D_801C4CBC[3] = 0; + } + if (p[0x37] == 0) { + D_801C4CBC[0] = 0x140; + D_801C4CBC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C38D0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C38D0; +extern s16 *D_801C38D4; +extern s32 D_801C38E4; +extern s32 D_801C3904; +extern s32 D_801C3908; +extern s32 D_801C390C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C38D4 != 0) { + D_801C38E4 = 0; + p = (int *)(param_1 * 12 + (int)D_801C38D0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C3904 != x) { + flag = 1; + if (D_801C3904 < x) { + if (x - D_801C3904 < 5) { + D_801C3904 = x; + } else { + D_801C3904 = D_801C3904 + 4; + } + } else { + if (D_801C3904 - x < 5) { + D_801C3904 = x; + } else { + D_801C3904 = D_801C3904 - 4; + } + } + } + if (D_801C3908 != y) { + flag = 1; + if (D_801C3908 < y) { + if (y - D_801C3908 < 5) { + D_801C3908 = y; + } else { + D_801C3908 = D_801C3908 + 4; + } + } else { + if (D_801C3908 - y < 5) { + D_801C3908 = y; + } else { + D_801C3908 = D_801C3908 - 4; + } + } + } + if (D_801C390C != z) { + flag = 1; + if (D_801C390C < z) { + if (z - D_801C390C < 5) { + D_801C390C = z; + } else { + D_801C390C = D_801C390C + 4; + } + } else { + if (D_801C390C - z < 5) { + D_801C390C = z; + } else { + D_801C390C = D_801C390C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C38E4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80184AD4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C38D4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C3904); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C3908); + uVar5 = (*(int*)&D_801C390C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80184AD4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C38EC; + +s32 func_8013E054(void) { + return D_801C38EC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801854D0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801854A8; +extern s16 D_801854AA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801854D0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801854A8 = 2; + D_801854AA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801854AA = 0; + D_801854A8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C3920; + extern void * D_801C3924; + extern unsigned char D_80185148; + extern unsigned char D_80185160; + extern unsigned char D_801851D4; + extern unsigned char D_801851DC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C3920 = &D_80185148; + D_801C3924 = &D_801851D4; + } else { + D_801C3920 = &D_80185160; + D_801C3924 = &D_801851DC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801854D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801854D0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801854D0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801854AC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801854AC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801854AC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801854A8; +extern s16 D_801854AA; +extern unsigned char D_801854AC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801854AA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801854A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801854AA; + if (*r < 3) { + *r = *r + 1; + } + D_801854A8 = (u16)D_801854A8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801854AC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801854AC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801854AC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013FAF8); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8013FFD8); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8014032C); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80140608); + + +// @class: iv-combine +// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source +// pointer compile to fixed offsets when written base[0..n]; the target advances +// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead +// final increment, yielding the "increment N-2 then offset 0/2" tail). + +extern u8 *D_80185188; +extern u8 *D_8018518C; +extern u8 *D_80185190; +extern u8 *D_80185194; +extern u8 *D_80185198; +extern u16 *D_8018519C[]; +extern u16 *D_801851A4[]; +extern u16 *D_801851C4[]; + +extern s32 func_80028D58(void); +extern s32 func_80028DE0(void); +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); + +void func_801407F4(void) +{ + u8 *puVar1; + s32 iVar2; + u16 *puVar3; + + puVar1 = D_80185188; + iVar2 = func_80028D58(); + puVar3 = D_8018519C[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + puVar1 = D_8018518C; + iVar2 = func_80028DE0(); + puVar3 = D_8018519C[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + iVar2 = func_80028FBC(); + *(s16 *)(D_80185190 + 0x18) = *D_801851A4[iVar2]; + iVar2 = func_80029000(); + *(s16 *)(D_80185194 + 0x18) = *D_801851A4[iVar2]; + + puVar1 = D_80185198; + iVar2 = func_80028D9C(); + puVar3 = D_801851C4[iVar2]; + *(s16 *)(puVar1 + 0x12) = *puVar3++; + *(s16 *)(puVar1 + 0x14) = *puVar3++; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + *(s16 *)(puVar1 + 0x1c) = *puVar3++; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80140958); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80140D68); + + +// @class: struct +// @stuck: none — MATCH + +extern unsigned char D_80078E7F; +extern unsigned char D_80078E7E; +extern unsigned char D_80078E7D; +extern M2C_UNK D_801850C4; + +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); + +void func_80140E6C(void) { + void *puVar1; + unsigned int uVar2; + unsigned int uVar3; + unsigned int uVar4; + + puVar1 = (*(void * *)&D_801850C4); + uVar2 = func_800D2CA8(D_80078E7F, 0x18); + uVar3 = func_800D2CA8(D_80078E7E, 0xc); + uVar4 = func_800D2CA8(D_80078E7D, 0); + func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); +} + + + + +// @class: plumbing +// @stuck: none — MATCH (128/128 ins, match_one confirmed) + +extern short D_80115128; +extern u8 D_801850D4; +extern char *D_801850F4; +extern char *D_801850F8; +extern char *D_801850FC; +extern char *D_80185100; +extern char *D_80185104; + +extern int func_80029FE4(void); +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); +extern char *func_8002AAB4(void); +extern char *strcpy(char *, const char *); +extern int func_8002A26C(void); +extern int func_8002A2B0(void); +extern int func_8002A4B8(void); +extern s32 func_8002A4FC(s32 a0); +extern int func_8002A998(void); +extern int func_8002A9DC(void); +extern int func_8002A728(void); +extern int func_8002A76C(void); +extern int func_80029FD4(void); + +void func_80140F00(void) { + char *p; + int r; + + if (D_80115128 == 0) { + p = (*(char * *)&D_801850D4); + r = func_800D2CA8(func_80029FE4() + 1, 0x18); + func_800D2D10(r, 2, p + 4, 1); + strcpy(p + 0xA, func_8002AAB4()); + + p = D_801850F4; + r = func_800D2CA8(func_8002A26C() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A2B0(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_801850F8; + r = func_800D2CA8(func_8002A4B8() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_801850FC; + r = func_800D2CA8(func_8002A998() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A9DC(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80185100; + r = func_800D2CA8(func_8002A728() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A76C(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80185104; + r = func_800D2CA8(func_80029FD4(), 4); + func_800D2D10(r, 7, p + 0x18, -1); + } +} + + + +// @class: other +// @stuck: none — MATCH + +extern short D_80115128; +extern unsigned short D_80115172; +extern unsigned short D_80184F8E; +extern unsigned short D_80184F92; +extern unsigned short D_80184F96; +extern unsigned short D_80184F9A; + +extern s32 func_8002A1B4(void); +extern short func_8002A28C(void); +extern short func_8002A27C(void); +extern s32 func_8002A400(void); +extern short func_8002A4D8(void); +extern short func_8002A4C8(void); +extern s32 func_8002A8E0(void); +extern short func_8002A9B8(void); +extern short func_8002A9A8(void); +extern s32 func_8002A670(void); +extern short func_8002A748(void); +extern short func_8002A738(void); +extern int func_801412A8(int, int, int, int, int, int); + +int func_80141100(int param_1) +{ + short sVar1; + int iVar7; + + if (D_80115128 == 0) { + iVar7 = D_80115172 + 0x31; + sVar1 = D_80184F8E; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); + sVar1 = D_80184F92; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); + sVar1 = D_80184F96; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); + sVar1 = D_80184F9A; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); + } + return param_1; +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_801412A8); + +DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ + +DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ + +DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ + + +extern unsigned short D_80115112; +extern void (*D_80185524[])(void); + +void func_80141788(void) +{ + D_80185524[D_80115112](); +} + + +DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ + +DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80141874); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_801418F8); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80141A60); + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80141B90); + +DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) + +extern u16 D_80115110; +extern u8 D_80185484; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80141C0C(s32 param_1) +{ + func_8002D4C8(*(u16 *)(&D_80185484 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); +} + + +DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ + +DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ + +DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ + +DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_801424E4); + + +extern void (*D_80185564[])(void); + +void func_801425CC(void *a0) { + D_80185564[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: schedule +// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail + +extern void func_8012C1B8(void); +extern s32 func_8012C1DC(s32 a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern s32 func_8012AD50(void *a0); +extern s32 D_80185548; + +void func_80142608(s32 param_1) +{ + register s32 iVar1 __asm__("$16"); + + if (*(short *)(param_1 + 0x70) != 0) { + iVar1 = ((s32 (*)(void))func_8012C1B8)(); + } else { + iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); + } + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CA1C(iVar1, (s32)&D_80185548); + *(short *)(iVar1 + 0x1a) = 0x200; + *(short *)(iVar1 + 0x18) = 0x200; + *(short *)(param_1 + 0xfc) = 0x40; + if (*(short *)(param_1 + 0x70) != 0) { + goto ad50; + } + if (*(s32 *)(param_1 + 100) != 0) { + *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); + goto ad50; + } + } + ((void (*)(s32))func_8012CAE4)(param_1); + return; +ad50: + *(short *)(param_1 + 0x98) = 0; + *(s32 *)(param_1 + 0x90) = 0; + ((void (*)(s32))func_8012AD50)(param_1); +} + + +DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ + +DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ + +DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ + +DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ + +DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80185578[])(); + +void func_801427EC(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80185578[*(u16 *)(param_1 + 2)](); + } +} + + +DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ + +DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80185594[])(); + +void func_8014292C(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80185594[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80185764[])(); + +void func_80142978(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80185764[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_8018581C[])(); + +void func_801429C4(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_8018581C[*(u16 *)(param_1 + 2)](); + } +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80142A10); + + +// @class: struct +// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) + +extern u16 D_800B99D8; +extern struct packed_word D_801C2FC0; +extern u8 D_801C3928; +extern u8 D_801C3929; +extern u8 D_801C392A; + +void func_80142A80(void) +{ + u16 flags; + union word_bytes local; + s32 mul; + + flags = D_800B99D8; + local.pw = D_801C2FC0; + + if (flags & 0x10) { + mul = (s8)((flags & 0xf) >> 1) + 9; + } else { + mul = 0x10 - (s8)((flags & 0xf) >> 1); + } + + D_801C3928 = mul * (local.b[0] >> 4); + D_801C3929 = mul * (local.b[1] >> 4); + D_801C392A = mul * (local.b[2] >> 4); +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80142B2C); + +DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ + +DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ + +DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ + +DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ + +DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ + +DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern int D_8018556C; + +void func_80142DC4(int param_1) +{ + int v0; + + *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_8018556C); + *(short *)(v0 + 0x1a) = 0x1800; + *(short *)(v0 + 0x18) = 0x1800; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80185588[]; + +void func_80142E38(int param_1) +{ + short sVar1; + int iVar2; + + *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_80185588); + sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; + *(short *)(iVar2 + 0x1a) = sVar1; + *(short *)(iVar2 + 0x18) = sVar1; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80142EC0); + +DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ + +DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result +// survives across func_8001CA1C while $v0 serves the pre-call store/test; +// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80185774[]; +extern unsigned char D_801857D4[]; + +void func_8014305C(int param_1) +{ + register int s0_param __asm__("$16") = param_1; + register int s1_copy __asm__("$17"); + int iVar2; + short sVar1; + + iVar2 = ((int (*)(void))func_8012C1B8)(); + *(int *)(s0_param + 0x20) = iVar2; + s1_copy = iVar2; + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(s0_param); + } else { + ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80185774); + sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; + *(short *)(s1_copy + 0x1a) = sVar1; + *(short *)(s1_copy + 0x18) = sVar1; + *(short *)(s0_param + 0xfc) = 0; + func_8012A828(s0_param, D_801857D4); + ((void (*)(int))func_80142B2C)(s0_param); + } +} + + +DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ + +DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) + + +extern void *memcpy(void *, const void *, u32); + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern int func_8001CA88(int, void *); +extern s32 func_8012E504(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80142B2C(void *arg0); + +extern u8 D_801C2FBC; +extern u8 D_801C3928; +extern u8 D_801C392C; + +void func_801431E8(s32 param_1) { + u8 buf[8]; + s32 iVar5; + u16 uVar2; + s16 sVar4; + + register s32 d __asm__("$16"); + memcpy(buf, &D_801C2FBC, 4); + iVar5 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = iVar5; + d = iVar5; + if (iVar5 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, void *))func_8001CA88)(d, &D_801C3928); + uVar2 = *(u16 *)(param_1 + 0x70); + *(s16 *)(d + 0x76) = -0x10; + sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; + *(s16 *)(d + 0x1a) = sVar4; + *(s16 *)(d + 0x18) = sVar4; + *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; + if (func_8012E504(param_1, 0x33) == 0) { + *(s16 *)(param_1 + 0xfc) = 1; + func_800233CC(&D_801C3928, 0x10); + memcpy(&D_801C392C, buf, 4); + } else { + *(s16 *)(param_1 + 0xfc) = 0; + } + ((void (*)(s32))func_80142B2C)(param_1); + } +} + + +DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ + +DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ + +DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) + +extern u8 D_800D387C[]; +extern u32 D_8018592C[]; + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80143458(s32 param_1) +{ + s32 p; + u16 v; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + p = *(s32 *)(param_1 + 0x20); + if (*(s32 *)(p + 4) == 0) { + *(s32 *)(p + 4) = 0x50000000; + } + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + v = *(u16 *)(param_1 + 0x34) & 0x7fff; + if (v != 0) { + p = *(s32 *)(param_1 + 0x20); + *(u16 *)(p + 0x1a) = v; + *(u16 *)(p + 0x18) = v; + } + + func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, + D_8018592C[*(u16 *)(param_1 + 0x34) & 3]); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + +DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_8014358C); + +DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ + +DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ + +DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ + +DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ + +DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ + +DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ + + +extern void (*D_80185A54[])(void); + +void func_80143B30(void *a0) { + D_80185A54[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ + +DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ + + +extern void (*D_80185A60[])(void); + +void func_80143C38(void *a0) { + D_80185A60[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ + + +extern void (*D_80185A68[])(void); + +void func_80143C98(void *a0) { + D_80185A68[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80143D28); + + +extern void (*D_80185AB0[])(void); + +void func_80143E68(void *a0) { + D_80185AB0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ + +DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ + +DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ + +DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ + + +extern void (*D_80185AC4[])(void); + +void func_80144054(void *a0) { + D_80185AC4[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80144090); + +extern void func_8012C218(void *a0); + +// @class: struct +// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) + +extern void (*D_80185ACC[])(); + +void func_801442F8(int param_1) +{ + int iVar1; + + D_80185ACC[*(u16 *)(param_1 + 2)](); + iVar1 = *(int *)(param_1 + 0x1c) + 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (0x1d < iVar1) { + func_8012C218(param_1); + } +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern u8 D_80185A48; + +void func_80144364(int param_1) { + int iVar3; + u16 uVar2; + s16 sVar1; + + iVar3 = ((s32 (*)(void))func_8012C194)(); + if (iVar3 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); + *(int *)(param_1 + 0xCC) = iVar3; + *(u16 *)(param_1 + 0xFC) = uVar2; + func_8001CB6C((u8 *)iVar3, (s32)&D_80185A48, 0x250, 0x1A0); + *(s32 *)(iVar3 + 4) = 0x60000000; + *(u8 *)(iVar3 + 0x27) = 0x14; + *(u16 *)(iVar3 + 0x10) = 0x400; + *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); + *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); + *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); + sVar1 = *(s16 *)(param_1 + 0x70); + if (sVar1 != 0) { + *(s16 *)(iVar3 + 0x1A) = sVar1; + *(s16 *)(iVar3 + 0x18) = sVar1; + } else { + *(u16 *)(iVar3 + 0x1A) = 0x2000; + *(u16 *)(iVar3 + 0x18) = 0x2000; + } + *(u16 *)(param_1 + 2) = 1; + } +} + + + + +extern void func_80016714(void *a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *a0); +extern s32 D_80185A5C; + +void func_80144458(void *arg0) { + s32 temp_s0; + void *temp_s2; + void *temp_v0; + + temp_s2 = M2C_FIELD(arg0, void **, 0xCC); + if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { + temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); + if (temp_v0 != NULL) { + temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; + M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80185A5C * 0x10); + M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80185A5C * 0x10); + func_8012AD80(arg0); + } + } + M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); + M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); + M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); + if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { + func_80016714(temp_s2, 0x38); + func_8012C218(arg0); + } +} + + +DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ + +DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ + +DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_80185A70; +extern u8 D_80185A7C; + +void func_8014477C(void *param_1) { + s32 v0; + s32 v1; + register s32 uVar2 __asm__("$2"); + register s32 addr __asm__("$3"); + s32 gv; + s32 fv; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)param_1 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(param_1); + return; + } + ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80185A70); + if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { + *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); + uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); + if (uVar2 != 0) { + addr = uVar2 & 0xFFFFFFF; + gv = *(u16 *)((addr | 0x80000000) + 8); + fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; + *(u16 *)((s32)param_1 + 0xA) = gv + fv; + } else { + *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; + } + } + ((void (*)(void *, void *))func_8012A828)(param_1, &D_80185A7C); + v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; + *(s16 *)((s32)param_1 + 0x2) = 1; + *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; + *(s32 *)((s32)param_1 + 0x1C) = 0x78; +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); + +extern u8 D_80185A48; +extern u8 D_80185AB8; + +void func_80144880(s32 param_1) +{ + register s32 obj __asm__("$16"); /* $s0 */ + register s32 self __asm__("$17") = param_1; /* $s1 */ + register s32 b __asm__("$2"); /* $v0 */ + s32 e; + + obj = ((s32 (*)(void))func_8012C194)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(self); + } else { + *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); + *(s32 *)(self + 0xCC) = obj; + if (*(s16 *)(self + 0x70) == 1) { + func_8001CB6C((u8 *)obj, (s32)&D_80185A48, 0x250, 0x1A0); + b = 0x14; + } else { + func_8001CB6C((u8 *)obj, (s32)&D_80185AB8, 0x300, 0x1D0); + b = 0x6A; + } + *(u8 *)(obj + 0x27) = (u8)b; + *(s32 *)(obj + 4) = 0x60000000; + *(u16 *)(obj + 0x10) = 0x400; + *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); + *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); + e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); + *(u16 *)(obj + 0x1A) = 0x4000; + *(u16 *)(obj + 0x18) = 0x4000; + *(u16 *)(obj + 0xC) = (u16)e; + *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; + } +} + + +DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ + + +extern void (*D_80185AD4[])(void); + +void func_801449C8(void *a0) { + D_80185AD4[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ + + +extern void (*D_80185ADC[])(void); + +void func_80144A2C(void *a0) { + D_80185ADC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ + +DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ + +DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ + +DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_103/nonmatchings/ov_SC03_103_jr_801380E0", func_80144B14); + diff --git a/src/ov_SC03_104/ov_SC03_104_jr_8012ACE0.c b/src/ov_SC03_104/ov_SC03_104_jr_8012ACE0.c index 5623aa481..c338e5d21 100644 --- a/src/ov_SC03_104/ov_SC03_104_jr_8012ACE0.c +++ b/src/ov_SC03_104/ov_SC03_104_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018B2C4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018B2C4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018B308; -extern u8 D_8018B34C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018B308; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018B34C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018B390[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018B3CC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018B3CC; - if (((s16)a1) < 0xC00) { - tbl = D_8018B390; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018B408, D_8018B40A, D_8018B40C, D_8018B40E, D_8018B410, D_8018B412; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018B40A < ang)) goto outer_else; - if (!(ang < D_8018B410)) goto inner_else; - if (ang < D_8018B40C) { *(s16 *)L = D_8018B40C; goto done; } - if (D_8018B40E < ang) { *(s16 *)L = D_8018B40E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018B408) { *(s16 *)L = D_8018B408; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018B412 < ang) { *(s16 *)L = D_8018B412; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801BEE58; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801BEE58, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801BEE58; -extern s8 D_801BEE5C; -extern s8 D_801BEE5D; - -void func_8013C9C4(void * arg0) -{ - D_801BEE58 = arg0; - D_801BEE5C = 0; - D_801BEE5D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801BEE58; -extern s8 D_801BEE5C; -extern s8 D_801BEE5D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801BEE58; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801BEE5D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801BEE5C)) * 2) + D_801BEE58); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801BEE5D = (unsigned char) p[1]; - D_801BEE5C = D_801BEE5C + 1; - if (D_801BEE5D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801BEE5C = 0; - *base = 0; - } - } - else - { - D_801BEE5D = c - 1; - } - } - return; -} - - - -extern s32 D_801BEE7C; -extern s32 D_801BEE70; -extern s32 D_801BEE74; -extern s32 D_801BEE80; - -void func_8013CABC(void) { - D_801BEE7C = 1; - D_801BEE70 = 1; - D_801BEE74 = 0; - D_801BEE80 = 1; -} - - - -extern s32 D_801BEE70; -extern s32 D_801BEE74; -extern s32 D_801BEE78; -extern s32 D_801BEE7C; -extern s32 D_801BEE80; - -void func_8013CAE8(void) { - D_801BEE70 = 1; - D_801BEE7C = 0; - D_801BEE74 = 0; - D_801BEE78 = -1; - D_801BEE80 = 0; -} - - - -extern s32 D_801BEE7C; -extern s32 D_801BEE80; -extern s32 D_801BEEA8; -extern s32 D_801BEEAC; - -void func_8013CB20(void) -{ - D_801BEEA8 = D_801BEE80; - D_801BEEAC = D_801BEE7C; - D_801BEE80 = 1; - D_801BEE7C = 0; -} - - - -extern s32 D_801BEEA8; -extern s32 D_801BEEAC; -extern s32 D_801BEE80; -extern s32 D_801BEE7C; - -void func_8013CB5C(void) { - D_801BEE80 = D_801BEEA8; - D_801BEE7C = D_801BEEAC; -} - - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C0340; - extern u8 D_801C0341; - extern u8 D_801C0342; - extern u8 D_801C0343; - extern u8 D_801C0344; - extern u8 D_801C0345; - extern u8 D_801C0346; - extern u8 D_801C0347; - extern u8 D_801C0348; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C0340; t1 = D_801C0341; t2 = D_801C0342; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C0343; t1 = D_801C0344; t2 = D_801C0345; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C0346; t1 = D_801C0347; t2 = D_801C0348; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801BEE88; -extern s32 D_801BEE70; -extern s32 D_801BEE8C; -extern s32 D_801BEE7C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801BEE88 != 0) { - if (D_801BEE88 != 2) { - if (((D_801BEE88 < 3) && (D_801BEE88 == 1)) && - (D_801BEE8C = D_801BEE8C + 1, 0x23a < D_801BEE8C)) { - D_801BEE70 = D_801BEE88; - D_801BEE88 = 2; - } - } else { - D_801BEE70 = D_801BEE70 + -1; - if (D_801BEE70 == 0) { - D_801BEE70 = D_801BEE88; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801BEE7C == 0) { - D_801BEE88 = D_801BEE88 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801BEE7C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801BEE7C; -} - - - -extern s32 D_801BEE88; - -void func_8013D164(void) { - D_801BEE88 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C0422; -extern u8 D_801C0496; -extern u8 D_801C034A; -extern u8 D_801C0404; -extern u8 D_801C0328; -extern u8 D_801C0349; -extern s32 D_801C0408; - -void func_8013D330(void) { - if ((D_801C0422 & 0xff) != D_801C0496) { - D_801C0422 = ((D_801C0422 & 0xff) < D_801C0496) ? (D_801C0422 + 1) : (D_801C0422 - 1); - } - if ((D_801C034A & 0xff) != D_801C0404) { - D_801C034A = ((D_801C034A & 0xff) < D_801C0404) ? (D_801C034A + 1) : (D_801C034A - 1); - } - if ((D_801C0328 & 0xff) != D_801C0349) { - D_801C0328 = ((D_801C0328 & 0xff) < D_801C0349) ? (D_801C0328 + 1) : (D_801C0328 - 1); - } - D_801C0408 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801BEE60; -extern void *D_801BEE64; -extern void *D_801BEE68; -extern s32 D_801BEE90; -extern s32 D_801BEE94; -extern s32 D_801BEE98; -extern s32 D_801C037C[]; - -extern u8 D_8018B500[]; -extern u8 D_8018B5A8[]; -extern u8 D_8018B458[]; -extern u8 D_8018B554[]; -extern u8 D_8018B5D4[]; -extern u8 D_8018B4AC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801BEE90 = param_2; - D_801BEE94 = (param_2 >> 2) & 3; - D_801BEE98 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801BEE60 = D_8018B500; - D_801BEE64 = D_8018B5A8; - D_801BEE68 = D_8018B458; - } else { - D_801BEE60 = D_8018B554; - D_801BEE64 = D_8018B5D4; - D_801BEE68 = D_8018B4AC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801BEE98 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801BEE90 & 2) != 0) { - D_801C037C[0] = 0x140; - D_801C037C[3] = 0x80; - if (p[0x37] == 4) { - D_801C037C[0] = 0x140; - D_801C037C[3] = 0; - } - if (p[0x37] == 0) { - D_801C037C[0] = 0x140; - D_801C037C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801BEE68)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801BEE68; -extern s16 *D_801BEE6C; -extern s32 D_801BEE7C; -extern s32 D_801BEE9C; -extern s32 D_801BEEA0; -extern s32 D_801BEEA4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801BEE6C != 0) { - D_801BEE7C = 0; - p = (int *)(param_1 * 12 + (int)D_801BEE68); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801BEE9C != x) { - flag = 1; - if (D_801BEE9C < x) { - if (x - D_801BEE9C < 5) { - D_801BEE9C = x; - } else { - D_801BEE9C = D_801BEE9C + 4; - } - } else { - if (D_801BEE9C - x < 5) { - D_801BEE9C = x; - } else { - D_801BEE9C = D_801BEE9C - 4; - } - } - } - if (D_801BEEA0 != y) { - flag = 1; - if (D_801BEEA0 < y) { - if (y - D_801BEEA0 < 5) { - D_801BEEA0 = y; - } else { - D_801BEEA0 = D_801BEEA0 + 4; - } - } else { - if (D_801BEEA0 - y < 5) { - D_801BEEA0 = y; - } else { - D_801BEEA0 = D_801BEEA0 - 4; - } - } - } - if (D_801BEEA4 != z) { - flag = 1; - if (D_801BEEA4 < z) { - if (z - D_801BEEA4 < 5) { - D_801BEEA4 = z; - } else { - D_801BEEA4 = D_801BEEA4 + 4; - } - } else { - if (D_801BEEA4 - z < 5) { - D_801BEEA4 = z; - } else { - D_801BEEA4 = D_801BEEA4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801BEE7C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018B664[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801BEE6C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BEE9C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BEEA0); - uVar5 = (*(int*)&D_801BEEA4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018B664); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801BEE84; - -s32 func_8013E054(void) { - return D_801BEE84; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018C060; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018C038; -extern s16 D_8018C03A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018C060; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018C038 = 2; - D_8018C03A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018C03A = 0; - D_8018C038 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801BEEB8; - extern void * D_801BEEBC; - extern unsigned char D_8018BCD8; - extern unsigned char D_8018BCF0; - extern unsigned char D_8018BD64; - extern unsigned char D_8018BD6C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801BEEB8 = &D_8018BCD8; - D_801BEEBC = &D_8018BD64; - } else { - D_801BEEB8 = &D_8018BCF0; - D_801BEEBC = &D_8018BD6C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018C060/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C060 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018C060)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018C03C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C03C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C03C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018C038; -extern s16 D_8018C03A; -extern unsigned char D_8018C03C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C03A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018C038` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018C03A; - if (*r < 3) { - *r = *r + 1; - } - D_8018C038 = (u16)D_8018C038 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C03C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018C03C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C03C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_104/ov_SC03_104_jr_801380E0.c b/src/ov_SC03_104/ov_SC03_104_jr_801380E0.c new file mode 100644 index 000000000..e73d16f6b --- /dev/null +++ b/src/ov_SC03_104/ov_SC03_104_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801BDB90; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018AF58[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801BED74; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C0428; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801BDB90; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018AC94)(); +extern s16 (*D_8018AC98)(); +extern M2C_UNK (*D_8018ACA0)(); +extern s32 (*D_8018ACA4)(); +extern s32 D_801BED70; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801BDB94; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018AFEC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018E4D0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018B004; +extern M2C_UNK D_8018B00C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018B014; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018B030[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018B03C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018B050[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018B0A0[]; +extern s16 D_8018B0D0[]; +extern s16 D_8018B130[]; +extern s16 D_8018B138[]; +extern s16 D_8018B158[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018B190[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018B1E8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018B230[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018B238[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018B240[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018B248[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018B1F0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018B210; +extern void func_801321B0(int param_1); +extern int D_8018B220; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801BEDE0; +extern s32 D_801BEDE4[]; +extern int D_801BEDE8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018B254; +extern u8 D_8018B250; +extern s16 *D_8018B258; +extern u8 D_8018B25C; +extern int D_801BEDE0; +extern u16 D_801BEDF0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018B258; /* holds a pointer value (*(u16**)&D_8018B258) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018B26C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018B2C0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018B2C4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018B2C4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018B308; +extern u8 D_8018B34C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018B308; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018B34C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018B390[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018B3CC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018B3CC; + if (((s16)a1) < 0xC00) { + tbl = D_8018B390; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018B408, D_8018B40A, D_8018B40C, D_8018B40E, D_8018B410, D_8018B412; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B40A < ang)) goto outer_else; + if (!(ang < D_8018B410)) goto inner_else; + if (ang < D_8018B40C) { *(s16 *)L = D_8018B40C; goto done; } + if (D_8018B40E < ang) { *(s16 *)L = D_8018B40E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B408) { *(s16 *)L = D_8018B408; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B412 < ang) { *(s16 *)L = D_8018B412; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801BEE58; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801BEE58, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801BEE58; +extern s8 D_801BEE5C; +extern s8 D_801BEE5D; + +void func_8013C9C4(void * arg0) +{ + D_801BEE58 = arg0; + D_801BEE5C = 0; + D_801BEE5D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801BEE58; +extern s8 D_801BEE5C; +extern s8 D_801BEE5D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801BEE58; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801BEE5D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801BEE5C)) * 2) + D_801BEE58); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801BEE5D = (unsigned char) p[1]; + D_801BEE5C = D_801BEE5C + 1; + if (D_801BEE5D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801BEE5C = 0; + *base = 0; + } + } + else + { + D_801BEE5D = c - 1; + } + } + return; +} + + + +extern s32 D_801BEE7C; +extern s32 D_801BEE70; +extern s32 D_801BEE74; +extern s32 D_801BEE80; + +void func_8013CABC(void) { + D_801BEE7C = 1; + D_801BEE70 = 1; + D_801BEE74 = 0; + D_801BEE80 = 1; +} + + + +extern s32 D_801BEE70; +extern s32 D_801BEE74; +extern s32 D_801BEE78; +extern s32 D_801BEE7C; +extern s32 D_801BEE80; + +void func_8013CAE8(void) { + D_801BEE70 = 1; + D_801BEE7C = 0; + D_801BEE74 = 0; + D_801BEE78 = -1; + D_801BEE80 = 0; +} + + + +extern s32 D_801BEE7C; +extern s32 D_801BEE80; +extern s32 D_801BEEA8; +extern s32 D_801BEEAC; + +void func_8013CB20(void) +{ + D_801BEEA8 = D_801BEE80; + D_801BEEAC = D_801BEE7C; + D_801BEE80 = 1; + D_801BEE7C = 0; +} + + + +extern s32 D_801BEEA8; +extern s32 D_801BEEAC; +extern s32 D_801BEE80; +extern s32 D_801BEE7C; + +void func_8013CB5C(void) { + D_801BEE80 = D_801BEEA8; + D_801BEE7C = D_801BEEAC; +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C0340; + extern u8 D_801C0341; + extern u8 D_801C0342; + extern u8 D_801C0343; + extern u8 D_801C0344; + extern u8 D_801C0345; + extern u8 D_801C0346; + extern u8 D_801C0347; + extern u8 D_801C0348; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C0340; t1 = D_801C0341; t2 = D_801C0342; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C0343; t1 = D_801C0344; t2 = D_801C0345; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C0346; t1 = D_801C0347; t2 = D_801C0348; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801BEE88; +extern s32 D_801BEE70; +extern s32 D_801BEE8C; +extern s32 D_801BEE7C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801BEE88 != 0) { + if (D_801BEE88 != 2) { + if (((D_801BEE88 < 3) && (D_801BEE88 == 1)) && + (D_801BEE8C = D_801BEE8C + 1, 0x23a < D_801BEE8C)) { + D_801BEE70 = D_801BEE88; + D_801BEE88 = 2; + } + } else { + D_801BEE70 = D_801BEE70 + -1; + if (D_801BEE70 == 0) { + D_801BEE70 = D_801BEE88; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801BEE7C == 0) { + D_801BEE88 = D_801BEE88 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801BEE7C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801BEE7C; +} + + + +extern s32 D_801BEE88; + +void func_8013D164(void) { + D_801BEE88 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C0422; +extern u8 D_801C0496; +extern u8 D_801C034A; +extern u8 D_801C0404; +extern u8 D_801C0328; +extern u8 D_801C0349; +extern s32 D_801C0408; + +void func_8013D330(void) { + if ((D_801C0422 & 0xff) != D_801C0496) { + D_801C0422 = ((D_801C0422 & 0xff) < D_801C0496) ? (D_801C0422 + 1) : (D_801C0422 - 1); + } + if ((D_801C034A & 0xff) != D_801C0404) { + D_801C034A = ((D_801C034A & 0xff) < D_801C0404) ? (D_801C034A + 1) : (D_801C034A - 1); + } + if ((D_801C0328 & 0xff) != D_801C0349) { + D_801C0328 = ((D_801C0328 & 0xff) < D_801C0349) ? (D_801C0328 + 1) : (D_801C0328 - 1); + } + D_801C0408 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801BEE60; +extern void *D_801BEE64; +extern void *D_801BEE68; +extern s32 D_801BEE90; +extern s32 D_801BEE94; +extern s32 D_801BEE98; +extern s32 D_801C037C[]; + +extern u8 D_8018B500[]; +extern u8 D_8018B5A8[]; +extern u8 D_8018B458[]; +extern u8 D_8018B554[]; +extern u8 D_8018B5D4[]; +extern u8 D_8018B4AC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801BEE90 = param_2; + D_801BEE94 = (param_2 >> 2) & 3; + D_801BEE98 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801BEE60 = D_8018B500; + D_801BEE64 = D_8018B5A8; + D_801BEE68 = D_8018B458; + } else { + D_801BEE60 = D_8018B554; + D_801BEE64 = D_8018B5D4; + D_801BEE68 = D_8018B4AC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801BEE98 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801BEE90 & 2) != 0) { + D_801C037C[0] = 0x140; + D_801C037C[3] = 0x80; + if (p[0x37] == 4) { + D_801C037C[0] = 0x140; + D_801C037C[3] = 0; + } + if (p[0x37] == 0) { + D_801C037C[0] = 0x140; + D_801C037C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801BEE68)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801BEE68; +extern s16 *D_801BEE6C; +extern s32 D_801BEE7C; +extern s32 D_801BEE9C; +extern s32 D_801BEEA0; +extern s32 D_801BEEA4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801BEE6C != 0) { + D_801BEE7C = 0; + p = (int *)(param_1 * 12 + (int)D_801BEE68); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801BEE9C != x) { + flag = 1; + if (D_801BEE9C < x) { + if (x - D_801BEE9C < 5) { + D_801BEE9C = x; + } else { + D_801BEE9C = D_801BEE9C + 4; + } + } else { + if (D_801BEE9C - x < 5) { + D_801BEE9C = x; + } else { + D_801BEE9C = D_801BEE9C - 4; + } + } + } + if (D_801BEEA0 != y) { + flag = 1; + if (D_801BEEA0 < y) { + if (y - D_801BEEA0 < 5) { + D_801BEEA0 = y; + } else { + D_801BEEA0 = D_801BEEA0 + 4; + } + } else { + if (D_801BEEA0 - y < 5) { + D_801BEEA0 = y; + } else { + D_801BEEA0 = D_801BEEA0 - 4; + } + } + } + if (D_801BEEA4 != z) { + flag = 1; + if (D_801BEEA4 < z) { + if (z - D_801BEEA4 < 5) { + D_801BEEA4 = z; + } else { + D_801BEEA4 = D_801BEEA4 + 4; + } + } else { + if (D_801BEEA4 - z < 5) { + D_801BEEA4 = z; + } else { + D_801BEEA4 = D_801BEEA4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801BEE7C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018B664[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801BEE6C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BEE9C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BEEA0); + uVar5 = (*(int*)&D_801BEEA4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018B664); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801BEE84; + +s32 func_8013E054(void) { + return D_801BEE84; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018C060; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018C038; +extern s16 D_8018C03A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018C060; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018C038 = 2; + D_8018C03A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018C03A = 0; + D_8018C038 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801BEEB8; + extern void * D_801BEEBC; + extern unsigned char D_8018BCD8; + extern unsigned char D_8018BCF0; + extern unsigned char D_8018BD64; + extern unsigned char D_8018BD6C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801BEEB8 = &D_8018BCD8; + D_801BEEBC = &D_8018BD64; + } else { + D_801BEEB8 = &D_8018BCF0; + D_801BEEBC = &D_8018BD6C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018C060/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018C060 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018C060)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018C03C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018C03C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018C03C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018C038; +extern s16 D_8018C03A; +extern unsigned char D_8018C03C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018C03A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018C038` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018C03A; + if (*r < 3) { + *r = *r + 1; + } + D_8018C038 = (u16)D_8018C038 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C03C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018C03C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018C03C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_105/ov_SC03_105_jr_8012ACE0.c b/src/ov_SC03_105/ov_SC03_105_jr_8012ACE0.c index 68188a064..f047b603d 100644 --- a/src/ov_SC03_105/ov_SC03_105_jr_8012ACE0.c +++ b/src/ov_SC03_105/ov_SC03_105_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018A94C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018A94C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018A990; -extern u8 D_8018A9D4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018A990; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018A9D4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018AA18[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018AA54[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018AA54; - if (((s16)a1) < 0xC00) { - tbl = D_8018AA18; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018AA90, D_8018AA92, D_8018AA94, D_8018AA96, D_8018AA98, D_8018AA9A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018AA92 < ang)) goto outer_else; - if (!(ang < D_8018AA98)) goto inner_else; - if (ang < D_8018AA94) { *(s16 *)L = D_8018AA94; goto done; } - if (D_8018AA96 < ang) { *(s16 *)L = D_8018AA96; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018AA90) { *(s16 *)L = D_8018AA90; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018AA9A < ang) { *(s16 *)L = D_8018AA9A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B83E8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B83E8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B83E8; -extern s8 D_801B83EC; -extern s8 D_801B83ED; - -void func_8013C9C4(void * arg0) -{ - D_801B83E8 = arg0; - D_801B83EC = 0; - D_801B83ED = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B83E8; -extern s8 D_801B83EC; -extern s8 D_801B83ED; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B83E8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B83ED; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B83EC)) * 2) + D_801B83E8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B83ED = (unsigned char) p[1]; - D_801B83EC = D_801B83EC + 1; - if (D_801B83ED == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B83EC = 0; - *base = 0; - } - } - else - { - D_801B83ED = c - 1; - } - } - return; -} - - - -extern s32 D_801B840C; -extern s32 D_801B8400; -extern s32 D_801B8404; -extern s32 D_801B8410; - -void func_8013CABC(void) { - D_801B840C = 1; - D_801B8400 = 1; - D_801B8404 = 0; - D_801B8410 = 1; -} - - - -extern s32 D_801B8400; -extern s32 D_801B8404; -extern s32 D_801B8408; -extern s32 D_801B840C; -extern s32 D_801B8410; - -void func_8013CAE8(void) { - D_801B8400 = 1; - D_801B840C = 0; - D_801B8404 = 0; - D_801B8408 = -1; - D_801B8410 = 0; -} - - - -extern s32 D_801B840C; -extern s32 D_801B8410; -extern s32 D_801B8438; -extern s32 D_801B843C; - -void func_8013CB20(void) -{ - D_801B8438 = D_801B8410; - D_801B843C = D_801B840C; - D_801B8410 = 1; - D_801B840C = 0; -} - - - -extern s32 D_801B8438; -extern s32 D_801B843C; -extern s32 D_801B8410; -extern s32 D_801B840C; - -void func_8013CB5C(void) { - D_801B8410 = D_801B8438; - D_801B840C = D_801B843C; -} - - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801BCBC8; - extern u8 D_801BCBC9; - extern u8 D_801BCBCA; - extern u8 D_801BCBCB; - extern u8 D_801BCBCC; - extern u8 D_801BCBCD; - extern u8 D_801BCBCE; - extern u8 D_801BCBCF; - extern u8 D_801BCBD0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801BCBC8; t1 = D_801BCBC9; t2 = D_801BCBCA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801BCBCB; t1 = D_801BCBCC; t2 = D_801BCBCD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801BCBCE; t1 = D_801BCBCF; t2 = D_801BCBD0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B8418; -extern s32 D_801B8400; -extern s32 D_801B841C; -extern s32 D_801B840C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B8418 != 0) { - if (D_801B8418 != 2) { - if (((D_801B8418 < 3) && (D_801B8418 == 1)) && - (D_801B841C = D_801B841C + 1, 0x23a < D_801B841C)) { - D_801B8400 = D_801B8418; - D_801B8418 = 2; - } - } else { - D_801B8400 = D_801B8400 + -1; - if (D_801B8400 == 0) { - D_801B8400 = D_801B8418; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B840C == 0) { - D_801B8418 = D_801B8418 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B840C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B840C; -} - - - -extern s32 D_801B8418; - -void func_8013D164(void) { - D_801B8418 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801BCCAA; -extern u8 D_801BCD1E; -extern u8 D_801BCBD2; -extern u8 D_801BCC8C; -extern u8 D_801BCBA8; -extern u8 D_801BCBD1; -extern s32 D_801BCC90; - -void func_8013D330(void) { - if ((D_801BCCAA & 0xff) != D_801BCD1E) { - D_801BCCAA = ((D_801BCCAA & 0xff) < D_801BCD1E) ? (D_801BCCAA + 1) : (D_801BCCAA - 1); - } - if ((D_801BCBD2 & 0xff) != D_801BCC8C) { - D_801BCBD2 = ((D_801BCBD2 & 0xff) < D_801BCC8C) ? (D_801BCBD2 + 1) : (D_801BCBD2 - 1); - } - if ((D_801BCBA8 & 0xff) != D_801BCBD1) { - D_801BCBA8 = ((D_801BCBA8 & 0xff) < D_801BCBD1) ? (D_801BCBA8 + 1) : (D_801BCBA8 - 1); - } - D_801BCC90 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B83F0; -extern void *D_801B83F4; -extern void *D_801B83F8; -extern s32 D_801B8420; -extern s32 D_801B8424; -extern s32 D_801B8428; -extern s32 D_801BCC04[]; - -extern u8 D_8018AB88[]; -extern u8 D_8018AC30[]; -extern u8 D_8018AAE0[]; -extern u8 D_8018ABDC[]; -extern u8 D_8018AC5C[]; -extern u8 D_8018AB34[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B8420 = param_2; - D_801B8424 = (param_2 >> 2) & 3; - D_801B8428 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B83F0 = D_8018AB88; - D_801B83F4 = D_8018AC30; - D_801B83F8 = D_8018AAE0; - } else { - D_801B83F0 = D_8018ABDC; - D_801B83F4 = D_8018AC5C; - D_801B83F8 = D_8018AB34; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B8428 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B8420 & 2) != 0) { - D_801BCC04[0] = 0x140; - D_801BCC04[3] = 0x80; - if (p[0x37] == 4) { - D_801BCC04[0] = 0x140; - D_801BCC04[3] = 0; - } - if (p[0x37] == 0) { - D_801BCC04[0] = 0x140; - D_801BCC04[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B83F8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B83F8; -extern s16 *D_801B83FC; -extern s32 D_801B840C; -extern s32 D_801B842C; -extern s32 D_801B8430; -extern s32 D_801B8434; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B83FC != 0) { - D_801B840C = 0; - p = (int *)(param_1 * 12 + (int)D_801B83F8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B842C != x) { - flag = 1; - if (D_801B842C < x) { - if (x - D_801B842C < 5) { - D_801B842C = x; - } else { - D_801B842C = D_801B842C + 4; - } - } else { - if (D_801B842C - x < 5) { - D_801B842C = x; - } else { - D_801B842C = D_801B842C - 4; - } - } - } - if (D_801B8430 != y) { - flag = 1; - if (D_801B8430 < y) { - if (y - D_801B8430 < 5) { - D_801B8430 = y; - } else { - D_801B8430 = D_801B8430 + 4; - } - } else { - if (D_801B8430 - y < 5) { - D_801B8430 = y; - } else { - D_801B8430 = D_801B8430 - 4; - } - } - } - if (D_801B8434 != z) { - flag = 1; - if (D_801B8434 < z) { - if (z - D_801B8434 < 5) { - D_801B8434 = z; - } else { - D_801B8434 = D_801B8434 + 4; - } - } else { - if (D_801B8434 - z < 5) { - D_801B8434 = z; - } else { - D_801B8434 = D_801B8434 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B840C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018ACEC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B83FC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B842C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B8430); - uVar5 = (*(int*)&D_801B8434); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018ACEC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B8414; - -s32 func_8013E054(void) { - return D_801B8414; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018B6E8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018B6C0; -extern s16 D_8018B6C2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018B6E8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018B6C0 = 2; - D_8018B6C2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018B6C2 = 0; - D_8018B6C0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B8448; - extern void * D_801B844C; - extern unsigned char D_8018B360; - extern unsigned char D_8018B378; - extern unsigned char D_8018B3EC; - extern unsigned char D_8018B3F4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B8448 = &D_8018B360; - D_801B844C = &D_8018B3EC; - } else { - D_801B8448 = &D_8018B378; - D_801B844C = &D_8018B3F4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018B6E8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018B6E8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018B6E8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018B6C4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018B6C4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018B6C4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018B6C0; -extern s16 D_8018B6C2; -extern unsigned char D_8018B6C4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018B6C2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018B6C0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018B6C2; - if (*r < 3) { - *r = *r + 1; - } - D_8018B6C0 = (u16)D_8018B6C0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B6C4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018B6C4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B6C4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c b/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c new file mode 100644 index 000000000..42e998d67 --- /dev/null +++ b/src/ov_SC03_105/ov_SC03_105_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B6E88; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018A5E0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B8304; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801BCCB0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B6E88; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018A31C)(); +extern s16 (*D_8018A320)(); +extern M2C_UNK (*D_8018A328)(); +extern s32 (*D_8018A32C)(); +extern s32 D_801B8300; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B6E8C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018A674; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018DB58; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018A68C; +extern M2C_UNK D_8018A694; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018A69C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018A6B8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018A6C4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018A6D8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018A728[]; +extern s16 D_8018A758[]; +extern s16 D_8018A7B8[]; +extern s16 D_8018A7C0[]; +extern s16 D_8018A7E0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018A818[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018A870[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018A8B8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018A8C0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018A8C8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018A8D0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018A878; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018A898; +extern void func_801321B0(int param_1); +extern int D_8018A8A8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B8370; +extern s32 D_801B8374[]; +extern int D_801B8378; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018A8DC; +extern u8 D_8018A8D8; +extern s16 *D_8018A8E0; +extern u8 D_8018A8E4; +extern int D_801B8370; +extern u16 D_801B8380; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018A8E0; /* holds a pointer value (*(u16**)&D_8018A8E0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018A8F4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018A948; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018A94C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018A94C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018A990; +extern u8 D_8018A9D4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018A990; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018A9D4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018AA18[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018AA54[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018AA54; + if (((s16)a1) < 0xC00) { + tbl = D_8018AA18; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018AA90, D_8018AA92, D_8018AA94, D_8018AA96, D_8018AA98, D_8018AA9A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018AA92 < ang)) goto outer_else; + if (!(ang < D_8018AA98)) goto inner_else; + if (ang < D_8018AA94) { *(s16 *)L = D_8018AA94; goto done; } + if (D_8018AA96 < ang) { *(s16 *)L = D_8018AA96; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018AA90) { *(s16 *)L = D_8018AA90; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018AA9A < ang) { *(s16 *)L = D_8018AA9A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B83E8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B83E8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B83E8; +extern s8 D_801B83EC; +extern s8 D_801B83ED; + +void func_8013C9C4(void * arg0) +{ + D_801B83E8 = arg0; + D_801B83EC = 0; + D_801B83ED = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B83E8; +extern s8 D_801B83EC; +extern s8 D_801B83ED; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B83E8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B83ED; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B83EC)) * 2) + D_801B83E8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B83ED = (unsigned char) p[1]; + D_801B83EC = D_801B83EC + 1; + if (D_801B83ED == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B83EC = 0; + *base = 0; + } + } + else + { + D_801B83ED = c - 1; + } + } + return; +} + + + +extern s32 D_801B840C; +extern s32 D_801B8400; +extern s32 D_801B8404; +extern s32 D_801B8410; + +void func_8013CABC(void) { + D_801B840C = 1; + D_801B8400 = 1; + D_801B8404 = 0; + D_801B8410 = 1; +} + + + +extern s32 D_801B8400; +extern s32 D_801B8404; +extern s32 D_801B8408; +extern s32 D_801B840C; +extern s32 D_801B8410; + +void func_8013CAE8(void) { + D_801B8400 = 1; + D_801B840C = 0; + D_801B8404 = 0; + D_801B8408 = -1; + D_801B8410 = 0; +} + + + +extern s32 D_801B840C; +extern s32 D_801B8410; +extern s32 D_801B8438; +extern s32 D_801B843C; + +void func_8013CB20(void) +{ + D_801B8438 = D_801B8410; + D_801B843C = D_801B840C; + D_801B8410 = 1; + D_801B840C = 0; +} + + + +extern s32 D_801B8438; +extern s32 D_801B843C; +extern s32 D_801B8410; +extern s32 D_801B840C; + +void func_8013CB5C(void) { + D_801B8410 = D_801B8438; + D_801B840C = D_801B843C; +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801BCBC8; + extern u8 D_801BCBC9; + extern u8 D_801BCBCA; + extern u8 D_801BCBCB; + extern u8 D_801BCBCC; + extern u8 D_801BCBCD; + extern u8 D_801BCBCE; + extern u8 D_801BCBCF; + extern u8 D_801BCBD0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801BCBC8; t1 = D_801BCBC9; t2 = D_801BCBCA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801BCBCB; t1 = D_801BCBCC; t2 = D_801BCBCD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801BCBCE; t1 = D_801BCBCF; t2 = D_801BCBD0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B8418; +extern s32 D_801B8400; +extern s32 D_801B841C; +extern s32 D_801B840C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B8418 != 0) { + if (D_801B8418 != 2) { + if (((D_801B8418 < 3) && (D_801B8418 == 1)) && + (D_801B841C = D_801B841C + 1, 0x23a < D_801B841C)) { + D_801B8400 = D_801B8418; + D_801B8418 = 2; + } + } else { + D_801B8400 = D_801B8400 + -1; + if (D_801B8400 == 0) { + D_801B8400 = D_801B8418; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B840C == 0) { + D_801B8418 = D_801B8418 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B840C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B840C; +} + + + +extern s32 D_801B8418; + +void func_8013D164(void) { + D_801B8418 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801BCCAA; +extern u8 D_801BCD1E; +extern u8 D_801BCBD2; +extern u8 D_801BCC8C; +extern u8 D_801BCBA8; +extern u8 D_801BCBD1; +extern s32 D_801BCC90; + +void func_8013D330(void) { + if ((D_801BCCAA & 0xff) != D_801BCD1E) { + D_801BCCAA = ((D_801BCCAA & 0xff) < D_801BCD1E) ? (D_801BCCAA + 1) : (D_801BCCAA - 1); + } + if ((D_801BCBD2 & 0xff) != D_801BCC8C) { + D_801BCBD2 = ((D_801BCBD2 & 0xff) < D_801BCC8C) ? (D_801BCBD2 + 1) : (D_801BCBD2 - 1); + } + if ((D_801BCBA8 & 0xff) != D_801BCBD1) { + D_801BCBA8 = ((D_801BCBA8 & 0xff) < D_801BCBD1) ? (D_801BCBA8 + 1) : (D_801BCBA8 - 1); + } + D_801BCC90 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B83F0; +extern void *D_801B83F4; +extern void *D_801B83F8; +extern s32 D_801B8420; +extern s32 D_801B8424; +extern s32 D_801B8428; +extern s32 D_801BCC04[]; + +extern u8 D_8018AB88[]; +extern u8 D_8018AC30[]; +extern u8 D_8018AAE0[]; +extern u8 D_8018ABDC[]; +extern u8 D_8018AC5C[]; +extern u8 D_8018AB34[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B8420 = param_2; + D_801B8424 = (param_2 >> 2) & 3; + D_801B8428 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B83F0 = D_8018AB88; + D_801B83F4 = D_8018AC30; + D_801B83F8 = D_8018AAE0; + } else { + D_801B83F0 = D_8018ABDC; + D_801B83F4 = D_8018AC5C; + D_801B83F8 = D_8018AB34; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B8428 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B8420 & 2) != 0) { + D_801BCC04[0] = 0x140; + D_801BCC04[3] = 0x80; + if (p[0x37] == 4) { + D_801BCC04[0] = 0x140; + D_801BCC04[3] = 0; + } + if (p[0x37] == 0) { + D_801BCC04[0] = 0x140; + D_801BCC04[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B83F8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B83F8; +extern s16 *D_801B83FC; +extern s32 D_801B840C; +extern s32 D_801B842C; +extern s32 D_801B8430; +extern s32 D_801B8434; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B83FC != 0) { + D_801B840C = 0; + p = (int *)(param_1 * 12 + (int)D_801B83F8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B842C != x) { + flag = 1; + if (D_801B842C < x) { + if (x - D_801B842C < 5) { + D_801B842C = x; + } else { + D_801B842C = D_801B842C + 4; + } + } else { + if (D_801B842C - x < 5) { + D_801B842C = x; + } else { + D_801B842C = D_801B842C - 4; + } + } + } + if (D_801B8430 != y) { + flag = 1; + if (D_801B8430 < y) { + if (y - D_801B8430 < 5) { + D_801B8430 = y; + } else { + D_801B8430 = D_801B8430 + 4; + } + } else { + if (D_801B8430 - y < 5) { + D_801B8430 = y; + } else { + D_801B8430 = D_801B8430 - 4; + } + } + } + if (D_801B8434 != z) { + flag = 1; + if (D_801B8434 < z) { + if (z - D_801B8434 < 5) { + D_801B8434 = z; + } else { + D_801B8434 = D_801B8434 + 4; + } + } else { + if (D_801B8434 - z < 5) { + D_801B8434 = z; + } else { + D_801B8434 = D_801B8434 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B840C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018ACEC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B83FC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B842C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B8430); + uVar5 = (*(int*)&D_801B8434); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018ACEC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B8414; + +s32 func_8013E054(void) { + return D_801B8414; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018B6E8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018B6C0; +extern s16 D_8018B6C2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018B6E8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018B6C0 = 2; + D_8018B6C2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018B6C2 = 0; + D_8018B6C0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B8448; + extern void * D_801B844C; + extern unsigned char D_8018B360; + extern unsigned char D_8018B378; + extern unsigned char D_8018B3EC; + extern unsigned char D_8018B3F4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B8448 = &D_8018B360; + D_801B844C = &D_8018B3EC; + } else { + D_801B8448 = &D_8018B378; + D_801B844C = &D_8018B3F4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018B6E8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018B6E8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018B6E8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018B6C4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018B6C4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018B6C4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018B6C0; +extern s16 D_8018B6C2; +extern unsigned char D_8018B6C4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018B6C2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018B6C0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018B6C2; + if (*r < 3) { + *r = *r + 1; + } + D_8018B6C0 = (u16)D_8018B6C0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B6C4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018B6C4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018B6C4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_105/nonmatchings/ov_SC03_105_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_108/ov_SC03_108_jr_8012ACE0.c b/src/ov_SC03_108/ov_SC03_108_jr_8012ACE0.c index c1208ff23..10a1939a5 100644 --- a/src/ov_SC03_108/ov_SC03_108_jr_8012ACE0.c +++ b/src/ov_SC03_108/ov_SC03_108_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801812A4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801812A4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801812E8; -extern u8 D_8018132C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801812E8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018132C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181370[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801813AC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801813AC; - if (((s16)a1) < 0xC00) { - tbl = D_80181370; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801813E8, D_801813EA, D_801813EC, D_801813EE, D_801813F0, D_801813F2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801813EA < ang)) goto outer_else; - if (!(ang < D_801813F0)) goto inner_else; - if (ang < D_801813EC) { *(s16 *)L = D_801813EC; goto done; } - if (D_801813EE < ang) { *(s16 *)L = D_801813EE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801813E8) { *(s16 *)L = D_801813E8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801813F2 < ang) { *(s16 *)L = D_801813F2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A06D8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A06D8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A06D8; -extern s8 D_801A06DC; -extern s8 D_801A06DD; - -void func_8013C9C4(void * arg0) -{ - D_801A06D8 = arg0; - D_801A06DC = 0; - D_801A06DD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A06D8; -extern s8 D_801A06DC; -extern s8 D_801A06DD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A06D8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A06DD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A06DC)) * 2) + D_801A06D8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A06DD = (unsigned char) p[1]; - D_801A06DC = D_801A06DC + 1; - if (D_801A06DD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A06DC = 0; - *base = 0; - } - } - else - { - D_801A06DD = c - 1; - } - } - return; -} - - - -extern s32 D_801A06FC; -extern s32 D_801A06F0; -extern s32 D_801A06F4; -extern s32 D_801A0700; - -void func_8013CABC(void) { - D_801A06FC = 1; - D_801A06F0 = 1; - D_801A06F4 = 0; - D_801A0700 = 1; -} - - - -extern s32 D_801A06F0; -extern s32 D_801A06F4; -extern s32 D_801A06F8; -extern s32 D_801A06FC; -extern s32 D_801A0700; - -void func_8013CAE8(void) { - D_801A06F0 = 1; - D_801A06FC = 0; - D_801A06F4 = 0; - D_801A06F8 = -1; - D_801A0700 = 0; -} - - - -extern s32 D_801A06FC; -extern s32 D_801A0700; -extern s32 D_801A0728; -extern s32 D_801A072C; - -void func_8013CB20(void) -{ - D_801A0728 = D_801A0700; - D_801A072C = D_801A06FC; - D_801A0700 = 1; - D_801A06FC = 0; -} - - - -extern s32 D_801A0728; -extern s32 D_801A072C; -extern s32 D_801A0700; -extern s32 D_801A06FC; - -void func_8013CB5C(void) { - D_801A0700 = D_801A0728; - D_801A06FC = D_801A072C; -} - - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A1950; - extern u8 D_801A1951; - extern u8 D_801A1952; - extern u8 D_801A1953; - extern u8 D_801A1954; - extern u8 D_801A1955; - extern u8 D_801A1956; - extern u8 D_801A1957; - extern u8 D_801A1958; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A1950; t1 = D_801A1951; t2 = D_801A1952; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A1953; t1 = D_801A1954; t2 = D_801A1955; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A1956; t1 = D_801A1957; t2 = D_801A1958; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A0708; -extern s32 D_801A06F0; -extern s32 D_801A070C; -extern s32 D_801A06FC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A0708 != 0) { - if (D_801A0708 != 2) { - if (((D_801A0708 < 3) && (D_801A0708 == 1)) && - (D_801A070C = D_801A070C + 1, 0x23a < D_801A070C)) { - D_801A06F0 = D_801A0708; - D_801A0708 = 2; - } - } else { - D_801A06F0 = D_801A06F0 + -1; - if (D_801A06F0 == 0) { - D_801A06F0 = D_801A0708; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A06FC == 0) { - D_801A0708 = D_801A0708 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A06FC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A06FC; -} - - - -extern s32 D_801A0708; - -void func_8013D164(void) { - D_801A0708 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A1A32; -extern u8 D_801A1AA6; -extern u8 D_801A195A; -extern u8 D_801A1A14; -extern u8 D_801A1938; -extern u8 D_801A1959; -extern s32 D_801A1A18; - -void func_8013D330(void) { - if ((D_801A1A32 & 0xff) != D_801A1AA6) { - D_801A1A32 = ((D_801A1A32 & 0xff) < D_801A1AA6) ? (D_801A1A32 + 1) : (D_801A1A32 - 1); - } - if ((D_801A195A & 0xff) != D_801A1A14) { - D_801A195A = ((D_801A195A & 0xff) < D_801A1A14) ? (D_801A195A + 1) : (D_801A195A - 1); - } - if ((D_801A1938 & 0xff) != D_801A1959) { - D_801A1938 = ((D_801A1938 & 0xff) < D_801A1959) ? (D_801A1938 + 1) : (D_801A1938 - 1); - } - D_801A1A18 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A06E0; -extern void *D_801A06E4; -extern void *D_801A06E8; -extern s32 D_801A0710; -extern s32 D_801A0714; -extern s32 D_801A0718; -extern s32 D_801A198C[]; - -extern u8 D_801814E0[]; -extern u8 D_80181588[]; -extern u8 D_80181438[]; -extern u8 D_80181534[]; -extern u8 D_801815B4[]; -extern u8 D_8018148C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A0710 = param_2; - D_801A0714 = (param_2 >> 2) & 3; - D_801A0718 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A06E0 = D_801814E0; - D_801A06E4 = D_80181588; - D_801A06E8 = D_80181438; - } else { - D_801A06E0 = D_80181534; - D_801A06E4 = D_801815B4; - D_801A06E8 = D_8018148C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A0718 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A0710 & 2) != 0) { - D_801A198C[0] = 0x140; - D_801A198C[3] = 0x80; - if (p[0x37] == 4) { - D_801A198C[0] = 0x140; - D_801A198C[3] = 0; - } - if (p[0x37] == 0) { - D_801A198C[0] = 0x140; - D_801A198C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A06E8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A06E8; -extern s16 *D_801A06EC; -extern s32 D_801A06FC; -extern s32 D_801A071C; -extern s32 D_801A0720; -extern s32 D_801A0724; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A06EC != 0) { - D_801A06FC = 0; - p = (int *)(param_1 * 12 + (int)D_801A06E8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A071C != x) { - flag = 1; - if (D_801A071C < x) { - if (x - D_801A071C < 5) { - D_801A071C = x; - } else { - D_801A071C = D_801A071C + 4; - } - } else { - if (D_801A071C - x < 5) { - D_801A071C = x; - } else { - D_801A071C = D_801A071C - 4; - } - } - } - if (D_801A0720 != y) { - flag = 1; - if (D_801A0720 < y) { - if (y - D_801A0720 < 5) { - D_801A0720 = y; - } else { - D_801A0720 = D_801A0720 + 4; - } - } else { - if (D_801A0720 - y < 5) { - D_801A0720 = y; - } else { - D_801A0720 = D_801A0720 - 4; - } - } - } - if (D_801A0724 != z) { - flag = 1; - if (D_801A0724 < z) { - if (z - D_801A0724 < 5) { - D_801A0724 = z; - } else { - D_801A0724 = D_801A0724 + 4; - } - } else { - if (D_801A0724 - z < 5) { - D_801A0724 = z; - } else { - D_801A0724 = D_801A0724 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A06FC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80181644[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A06EC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A071C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0720); - uVar5 = (*(int*)&D_801A0724); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80181644); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A0704; - -s32 func_8013E054(void) { - return D_801A0704; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80182040; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80182018; -extern s16 D_8018201A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80182040; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80182018 = 2; - D_8018201A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018201A = 0; - D_80182018 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A0738; - extern void * D_801A073C; - extern unsigned char D_80181CB8; - extern unsigned char D_80181CD0; - extern unsigned char D_80181D44; - extern unsigned char D_80181D4C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A0738 = &D_80181CB8; - D_801A073C = &D_80181D44; - } else { - D_801A0738 = &D_80181CD0; - D_801A073C = &D_80181D4C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80182040/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80182040 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80182040)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018201C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018201C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018201C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80182018; -extern s16 D_8018201A; -extern unsigned char D_8018201C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018201A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80182018` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018201A; - if (*r < 3) { - *r = *r + 1; - } - D_80182018 = (u16)D_80182018 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018201C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018201C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018201C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_108/ov_SC03_108_jr_801380E0.c b/src/ov_SC03_108/ov_SC03_108_jr_801380E0.c new file mode 100644 index 000000000..3646431c9 --- /dev/null +++ b/src/ov_SC03_108/ov_SC03_108_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019F390; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80180F38[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A05F4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A1A38; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019F390; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180C74)(); +extern s16 (*D_80180C78)(); +extern M2C_UNK (*D_80180C80)(); +extern s32 (*D_80180C84)(); +extern s32 D_801A05F0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019F394; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80180FCC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801844B0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80180FE4; +extern M2C_UNK D_80180FEC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80180FF4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80181010[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018101C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80181030[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181080[]; +extern s16 D_801810B0[]; +extern s16 D_80181110[]; +extern s16 D_80181118[]; +extern s16 D_80181138[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80181170[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801811C8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80181210[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80181218[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80181220[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80181228[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801811D0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801811F0; +extern void func_801321B0(int param_1); +extern int D_80181200; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A0660; +extern s32 D_801A0664[]; +extern int D_801A0668; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80181234; +extern u8 D_80181230; +extern s16 *D_80181238; +extern u8 D_8018123C; +extern int D_801A0660; +extern u16 D_801A0670; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80181238; /* holds a pointer value (*(u16**)&D_80181238) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018124C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801812A0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801812A4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801812A4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801812E8; +extern u8 D_8018132C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801812E8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018132C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181370[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801813AC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801813AC; + if (((s16)a1) < 0xC00) { + tbl = D_80181370; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801813E8, D_801813EA, D_801813EC, D_801813EE, D_801813F0, D_801813F2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801813EA < ang)) goto outer_else; + if (!(ang < D_801813F0)) goto inner_else; + if (ang < D_801813EC) { *(s16 *)L = D_801813EC; goto done; } + if (D_801813EE < ang) { *(s16 *)L = D_801813EE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801813E8) { *(s16 *)L = D_801813E8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801813F2 < ang) { *(s16 *)L = D_801813F2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A06D8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A06D8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A06D8; +extern s8 D_801A06DC; +extern s8 D_801A06DD; + +void func_8013C9C4(void * arg0) +{ + D_801A06D8 = arg0; + D_801A06DC = 0; + D_801A06DD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A06D8; +extern s8 D_801A06DC; +extern s8 D_801A06DD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A06D8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A06DD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A06DC)) * 2) + D_801A06D8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A06DD = (unsigned char) p[1]; + D_801A06DC = D_801A06DC + 1; + if (D_801A06DD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A06DC = 0; + *base = 0; + } + } + else + { + D_801A06DD = c - 1; + } + } + return; +} + + + +extern s32 D_801A06FC; +extern s32 D_801A06F0; +extern s32 D_801A06F4; +extern s32 D_801A0700; + +void func_8013CABC(void) { + D_801A06FC = 1; + D_801A06F0 = 1; + D_801A06F4 = 0; + D_801A0700 = 1; +} + + + +extern s32 D_801A06F0; +extern s32 D_801A06F4; +extern s32 D_801A06F8; +extern s32 D_801A06FC; +extern s32 D_801A0700; + +void func_8013CAE8(void) { + D_801A06F0 = 1; + D_801A06FC = 0; + D_801A06F4 = 0; + D_801A06F8 = -1; + D_801A0700 = 0; +} + + + +extern s32 D_801A06FC; +extern s32 D_801A0700; +extern s32 D_801A0728; +extern s32 D_801A072C; + +void func_8013CB20(void) +{ + D_801A0728 = D_801A0700; + D_801A072C = D_801A06FC; + D_801A0700 = 1; + D_801A06FC = 0; +} + + + +extern s32 D_801A0728; +extern s32 D_801A072C; +extern s32 D_801A0700; +extern s32 D_801A06FC; + +void func_8013CB5C(void) { + D_801A0700 = D_801A0728; + D_801A06FC = D_801A072C; +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A1950; + extern u8 D_801A1951; + extern u8 D_801A1952; + extern u8 D_801A1953; + extern u8 D_801A1954; + extern u8 D_801A1955; + extern u8 D_801A1956; + extern u8 D_801A1957; + extern u8 D_801A1958; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A1950; t1 = D_801A1951; t2 = D_801A1952; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A1953; t1 = D_801A1954; t2 = D_801A1955; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A1956; t1 = D_801A1957; t2 = D_801A1958; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A0708; +extern s32 D_801A06F0; +extern s32 D_801A070C; +extern s32 D_801A06FC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A0708 != 0) { + if (D_801A0708 != 2) { + if (((D_801A0708 < 3) && (D_801A0708 == 1)) && + (D_801A070C = D_801A070C + 1, 0x23a < D_801A070C)) { + D_801A06F0 = D_801A0708; + D_801A0708 = 2; + } + } else { + D_801A06F0 = D_801A06F0 + -1; + if (D_801A06F0 == 0) { + D_801A06F0 = D_801A0708; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A06FC == 0) { + D_801A0708 = D_801A0708 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A06FC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A06FC; +} + + + +extern s32 D_801A0708; + +void func_8013D164(void) { + D_801A0708 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A1A32; +extern u8 D_801A1AA6; +extern u8 D_801A195A; +extern u8 D_801A1A14; +extern u8 D_801A1938; +extern u8 D_801A1959; +extern s32 D_801A1A18; + +void func_8013D330(void) { + if ((D_801A1A32 & 0xff) != D_801A1AA6) { + D_801A1A32 = ((D_801A1A32 & 0xff) < D_801A1AA6) ? (D_801A1A32 + 1) : (D_801A1A32 - 1); + } + if ((D_801A195A & 0xff) != D_801A1A14) { + D_801A195A = ((D_801A195A & 0xff) < D_801A1A14) ? (D_801A195A + 1) : (D_801A195A - 1); + } + if ((D_801A1938 & 0xff) != D_801A1959) { + D_801A1938 = ((D_801A1938 & 0xff) < D_801A1959) ? (D_801A1938 + 1) : (D_801A1938 - 1); + } + D_801A1A18 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A06E0; +extern void *D_801A06E4; +extern void *D_801A06E8; +extern s32 D_801A0710; +extern s32 D_801A0714; +extern s32 D_801A0718; +extern s32 D_801A198C[]; + +extern u8 D_801814E0[]; +extern u8 D_80181588[]; +extern u8 D_80181438[]; +extern u8 D_80181534[]; +extern u8 D_801815B4[]; +extern u8 D_8018148C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A0710 = param_2; + D_801A0714 = (param_2 >> 2) & 3; + D_801A0718 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A06E0 = D_801814E0; + D_801A06E4 = D_80181588; + D_801A06E8 = D_80181438; + } else { + D_801A06E0 = D_80181534; + D_801A06E4 = D_801815B4; + D_801A06E8 = D_8018148C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A0718 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A0710 & 2) != 0) { + D_801A198C[0] = 0x140; + D_801A198C[3] = 0x80; + if (p[0x37] == 4) { + D_801A198C[0] = 0x140; + D_801A198C[3] = 0; + } + if (p[0x37] == 0) { + D_801A198C[0] = 0x140; + D_801A198C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A06E8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A06E8; +extern s16 *D_801A06EC; +extern s32 D_801A06FC; +extern s32 D_801A071C; +extern s32 D_801A0720; +extern s32 D_801A0724; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A06EC != 0) { + D_801A06FC = 0; + p = (int *)(param_1 * 12 + (int)D_801A06E8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A071C != x) { + flag = 1; + if (D_801A071C < x) { + if (x - D_801A071C < 5) { + D_801A071C = x; + } else { + D_801A071C = D_801A071C + 4; + } + } else { + if (D_801A071C - x < 5) { + D_801A071C = x; + } else { + D_801A071C = D_801A071C - 4; + } + } + } + if (D_801A0720 != y) { + flag = 1; + if (D_801A0720 < y) { + if (y - D_801A0720 < 5) { + D_801A0720 = y; + } else { + D_801A0720 = D_801A0720 + 4; + } + } else { + if (D_801A0720 - y < 5) { + D_801A0720 = y; + } else { + D_801A0720 = D_801A0720 - 4; + } + } + } + if (D_801A0724 != z) { + flag = 1; + if (D_801A0724 < z) { + if (z - D_801A0724 < 5) { + D_801A0724 = z; + } else { + D_801A0724 = D_801A0724 + 4; + } + } else { + if (D_801A0724 - z < 5) { + D_801A0724 = z; + } else { + D_801A0724 = D_801A0724 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A06FC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80181644[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A06EC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A071C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0720); + uVar5 = (*(int*)&D_801A0724); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80181644); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A0704; + +s32 func_8013E054(void) { + return D_801A0704; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80182040; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80182018; +extern s16 D_8018201A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80182040; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80182018 = 2; + D_8018201A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018201A = 0; + D_80182018 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A0738; + extern void * D_801A073C; + extern unsigned char D_80181CB8; + extern unsigned char D_80181CD0; + extern unsigned char D_80181D44; + extern unsigned char D_80181D4C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A0738 = &D_80181CB8; + D_801A073C = &D_80181D44; + } else { + D_801A0738 = &D_80181CD0; + D_801A073C = &D_80181D4C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80182040/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80182040 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80182040)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018201C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018201C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018201C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80182018; +extern s16 D_8018201A; +extern unsigned char D_8018201C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018201A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80182018` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018201A; + if (*r < 3) { + *r = *r + 1; + } + D_80182018 = (u16)D_80182018 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018201C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018201C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018201C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_109/ov_SC03_109_jr_8012ACE0.c b/src/ov_SC03_109/ov_SC03_109_jr_8012ACE0.c index 5ca4b4d25..44f2ff734 100644 --- a/src/ov_SC03_109/ov_SC03_109_jr_8012ACE0.c +++ b/src/ov_SC03_109/ov_SC03_109_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E950[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E950[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E994; -extern u8 D_8017E9D8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E994; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E9D8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017EA1C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017EA58[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017EA58; - if (((s16)a1) < 0xC00) { - tbl = D_8017EA1C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017EA94, D_8017EA96, D_8017EA98, D_8017EA9A, D_8017EA9C, D_8017EA9E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017EA96 < ang)) goto outer_else; - if (!(ang < D_8017EA9C)) goto inner_else; - if (ang < D_8017EA98) { *(s16 *)L = D_8017EA98; goto done; } - if (D_8017EA9A < ang) { *(s16 *)L = D_8017EA9A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017EA94) { *(s16 *)L = D_8017EA94; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017EA9E < ang) { *(s16 *)L = D_8017EA9E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801990E8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801990E8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801990E8; -extern s8 D_801990EC; -extern s8 D_801990ED; - -void func_8013C9C4(void * arg0) -{ - D_801990E8 = arg0; - D_801990EC = 0; - D_801990ED = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801990E8; -extern s8 D_801990EC; -extern s8 D_801990ED; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801990E8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801990ED; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801990EC)) * 2) + D_801990E8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801990ED = (unsigned char) p[1]; - D_801990EC = D_801990EC + 1; - if (D_801990ED == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801990EC = 0; - *base = 0; - } - } - else - { - D_801990ED = c - 1; - } - } - return; -} - - - -extern s32 D_8019910C; -extern s32 D_80199100; -extern s32 D_80199104; -extern s32 D_80199110; - -void func_8013CABC(void) { - D_8019910C = 1; - D_80199100 = 1; - D_80199104 = 0; - D_80199110 = 1; -} - - - -extern s32 D_80199100; -extern s32 D_80199104; -extern s32 D_80199108; -extern s32 D_8019910C; -extern s32 D_80199110; - -void func_8013CAE8(void) { - D_80199100 = 1; - D_8019910C = 0; - D_80199104 = 0; - D_80199108 = -1; - D_80199110 = 0; -} - - - -extern s32 D_8019910C; -extern s32 D_80199110; -extern s32 D_80199138; -extern s32 D_8019913C; - -void func_8013CB20(void) -{ - D_80199138 = D_80199110; - D_8019913C = D_8019910C; - D_80199110 = 1; - D_8019910C = 0; -} - - - -extern s32 D_80199138; -extern s32 D_8019913C; -extern s32 D_80199110; -extern s32 D_8019910C; - -void func_8013CB5C(void) { - D_80199110 = D_80199138; - D_8019910C = D_8019913C; -} - - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019A358; - extern u8 D_8019A359; - extern u8 D_8019A35A; - extern u8 D_8019A35B; - extern u8 D_8019A35C; - extern u8 D_8019A35D; - extern u8 D_8019A35E; - extern u8 D_8019A35F; - extern u8 D_8019A360; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019A358; t1 = D_8019A359; t2 = D_8019A35A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019A35B; t1 = D_8019A35C; t2 = D_8019A35D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019A35E; t1 = D_8019A35F; t2 = D_8019A360; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80199118; -extern s32 D_80199100; -extern s32 D_8019911C; -extern s32 D_8019910C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80199118 != 0) { - if (D_80199118 != 2) { - if (((D_80199118 < 3) && (D_80199118 == 1)) && - (D_8019911C = D_8019911C + 1, 0x23a < D_8019911C)) { - D_80199100 = D_80199118; - D_80199118 = 2; - } - } else { - D_80199100 = D_80199100 + -1; - if (D_80199100 == 0) { - D_80199100 = D_80199118; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019910C == 0) { - D_80199118 = D_80199118 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019910C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019910C; -} - - - -extern s32 D_80199118; - -void func_8013D164(void) { - D_80199118 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019A43A; -extern u8 D_8019A4AE; -extern u8 D_8019A362; -extern u8 D_8019A41C; -extern u8 D_8019A340; -extern u8 D_8019A361; -extern s32 D_8019A420; - -void func_8013D330(void) { - if ((D_8019A43A & 0xff) != D_8019A4AE) { - D_8019A43A = ((D_8019A43A & 0xff) < D_8019A4AE) ? (D_8019A43A + 1) : (D_8019A43A - 1); - } - if ((D_8019A362 & 0xff) != D_8019A41C) { - D_8019A362 = ((D_8019A362 & 0xff) < D_8019A41C) ? (D_8019A362 + 1) : (D_8019A362 - 1); - } - if ((D_8019A340 & 0xff) != D_8019A361) { - D_8019A340 = ((D_8019A340 & 0xff) < D_8019A361) ? (D_8019A340 + 1) : (D_8019A340 - 1); - } - D_8019A420 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801990F0; -extern void *D_801990F4; -extern void *D_801990F8; -extern s32 D_80199120; -extern s32 D_80199124; -extern s32 D_80199128; -extern s32 D_8019A394[]; - -extern u8 D_8017EB8C[]; -extern u8 D_8017EC34[]; -extern u8 D_8017EAE4[]; -extern u8 D_8017EBE0[]; -extern u8 D_8017EC60[]; -extern u8 D_8017EB38[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80199120 = param_2; - D_80199124 = (param_2 >> 2) & 3; - D_80199128 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801990F0 = D_8017EB8C; - D_801990F4 = D_8017EC34; - D_801990F8 = D_8017EAE4; - } else { - D_801990F0 = D_8017EBE0; - D_801990F4 = D_8017EC60; - D_801990F8 = D_8017EB38; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80199128 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80199120 & 2) != 0) { - D_8019A394[0] = 0x140; - D_8019A394[3] = 0x80; - if (p[0x37] == 4) { - D_8019A394[0] = 0x140; - D_8019A394[3] = 0; - } - if (p[0x37] == 0) { - D_8019A394[0] = 0x140; - D_8019A394[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801990F8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801990F8; -extern s16 *D_801990FC; -extern s32 D_8019910C; -extern s32 D_8019912C; -extern s32 D_80199130; -extern s32 D_80199134; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801990FC != 0) { - D_8019910C = 0; - p = (int *)(param_1 * 12 + (int)D_801990F8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019912C != x) { - flag = 1; - if (D_8019912C < x) { - if (x - D_8019912C < 5) { - D_8019912C = x; - } else { - D_8019912C = D_8019912C + 4; - } - } else { - if (D_8019912C - x < 5) { - D_8019912C = x; - } else { - D_8019912C = D_8019912C - 4; - } - } - } - if (D_80199130 != y) { - flag = 1; - if (D_80199130 < y) { - if (y - D_80199130 < 5) { - D_80199130 = y; - } else { - D_80199130 = D_80199130 + 4; - } - } else { - if (D_80199130 - y < 5) { - D_80199130 = y; - } else { - D_80199130 = D_80199130 - 4; - } - } - } - if (D_80199134 != z) { - flag = 1; - if (D_80199134 < z) { - if (z - D_80199134 < 5) { - D_80199134 = z; - } else { - D_80199134 = D_80199134 + 4; - } - } else { - if (D_80199134 - z < 5) { - D_80199134 = z; - } else { - D_80199134 = D_80199134 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019910C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017ECF0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801990FC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019912C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80199130); - uVar5 = (*(int*)&D_80199134); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017ECF0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80199114; - -s32 func_8013E054(void) { - return D_80199114; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F6EC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F6C4; -extern s16 D_8017F6C6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F6EC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F6C4 = 2; - D_8017F6C6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F6C6 = 0; - D_8017F6C4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80199148; - extern void * D_8019914C; - extern unsigned char D_8017F364; - extern unsigned char D_8017F37C; - extern unsigned char D_8017F3F0; - extern unsigned char D_8017F3F8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80199148 = &D_8017F364; - D_8019914C = &D_8017F3F0; - } else { - D_80199148 = &D_8017F37C; - D_8019914C = &D_8017F3F8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F6EC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F6EC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F6EC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F6C8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F6C8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F6C8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F6C4; -extern s16 D_8017F6C6; -extern unsigned char D_8017F6C8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F6C6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F6C4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F6C6; - if (*r < 3) { - *r = *r + 1; - } - D_8017F6C4 = (u16)D_8017F6C4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F6C8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F6C8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F6C8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_109/ov_SC03_109_jr_801380E0.c b/src/ov_SC03_109/ov_SC03_109_jr_801380E0.c new file mode 100644 index 000000000..01173e0bc --- /dev/null +++ b/src/ov_SC03_109/ov_SC03_109_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80197EA0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E5E4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80199004; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019A440; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80197EA0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E320)(); +extern s16 (*D_8017E324)(); +extern M2C_UNK (*D_8017E32C)(); +extern s32 (*D_8017E330)(); +extern s32 D_80199000; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80197EA4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E678; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181B5C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E690; +extern M2C_UNK D_8017E698; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E6A0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E6BC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E6C8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E6DC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E72C[]; +extern s16 D_8017E75C[]; +extern s16 D_8017E7BC[]; +extern s16 D_8017E7C4[]; +extern s16 D_8017E7E4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E81C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E874[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E8BC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E8C4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E8CC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E8D4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E87C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E89C; +extern void func_801321B0(int param_1); +extern int D_8017E8AC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80199070; +extern s32 D_80199074[]; +extern int D_80199078; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E8E0; +extern u8 D_8017E8DC; +extern s16 *D_8017E8E4; +extern u8 D_8017E8E8; +extern int D_80199070; +extern u16 D_80199080; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E8E4; /* holds a pointer value (*(u16**)&D_8017E8E4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E8F8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E94C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E950[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E950[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E994; +extern u8 D_8017E9D8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E994; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E9D8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017EA1C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017EA58[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017EA58; + if (((s16)a1) < 0xC00) { + tbl = D_8017EA1C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017EA94, D_8017EA96, D_8017EA98, D_8017EA9A, D_8017EA9C, D_8017EA9E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017EA96 < ang)) goto outer_else; + if (!(ang < D_8017EA9C)) goto inner_else; + if (ang < D_8017EA98) { *(s16 *)L = D_8017EA98; goto done; } + if (D_8017EA9A < ang) { *(s16 *)L = D_8017EA9A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017EA94) { *(s16 *)L = D_8017EA94; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017EA9E < ang) { *(s16 *)L = D_8017EA9E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801990E8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801990E8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801990E8; +extern s8 D_801990EC; +extern s8 D_801990ED; + +void func_8013C9C4(void * arg0) +{ + D_801990E8 = arg0; + D_801990EC = 0; + D_801990ED = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801990E8; +extern s8 D_801990EC; +extern s8 D_801990ED; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801990E8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801990ED; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801990EC)) * 2) + D_801990E8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801990ED = (unsigned char) p[1]; + D_801990EC = D_801990EC + 1; + if (D_801990ED == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801990EC = 0; + *base = 0; + } + } + else + { + D_801990ED = c - 1; + } + } + return; +} + + + +extern s32 D_8019910C; +extern s32 D_80199100; +extern s32 D_80199104; +extern s32 D_80199110; + +void func_8013CABC(void) { + D_8019910C = 1; + D_80199100 = 1; + D_80199104 = 0; + D_80199110 = 1; +} + + + +extern s32 D_80199100; +extern s32 D_80199104; +extern s32 D_80199108; +extern s32 D_8019910C; +extern s32 D_80199110; + +void func_8013CAE8(void) { + D_80199100 = 1; + D_8019910C = 0; + D_80199104 = 0; + D_80199108 = -1; + D_80199110 = 0; +} + + + +extern s32 D_8019910C; +extern s32 D_80199110; +extern s32 D_80199138; +extern s32 D_8019913C; + +void func_8013CB20(void) +{ + D_80199138 = D_80199110; + D_8019913C = D_8019910C; + D_80199110 = 1; + D_8019910C = 0; +} + + + +extern s32 D_80199138; +extern s32 D_8019913C; +extern s32 D_80199110; +extern s32 D_8019910C; + +void func_8013CB5C(void) { + D_80199110 = D_80199138; + D_8019910C = D_8019913C; +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019A358; + extern u8 D_8019A359; + extern u8 D_8019A35A; + extern u8 D_8019A35B; + extern u8 D_8019A35C; + extern u8 D_8019A35D; + extern u8 D_8019A35E; + extern u8 D_8019A35F; + extern u8 D_8019A360; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019A358; t1 = D_8019A359; t2 = D_8019A35A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019A35B; t1 = D_8019A35C; t2 = D_8019A35D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019A35E; t1 = D_8019A35F; t2 = D_8019A360; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80199118; +extern s32 D_80199100; +extern s32 D_8019911C; +extern s32 D_8019910C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80199118 != 0) { + if (D_80199118 != 2) { + if (((D_80199118 < 3) && (D_80199118 == 1)) && + (D_8019911C = D_8019911C + 1, 0x23a < D_8019911C)) { + D_80199100 = D_80199118; + D_80199118 = 2; + } + } else { + D_80199100 = D_80199100 + -1; + if (D_80199100 == 0) { + D_80199100 = D_80199118; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019910C == 0) { + D_80199118 = D_80199118 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019910C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019910C; +} + + + +extern s32 D_80199118; + +void func_8013D164(void) { + D_80199118 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019A43A; +extern u8 D_8019A4AE; +extern u8 D_8019A362; +extern u8 D_8019A41C; +extern u8 D_8019A340; +extern u8 D_8019A361; +extern s32 D_8019A420; + +void func_8013D330(void) { + if ((D_8019A43A & 0xff) != D_8019A4AE) { + D_8019A43A = ((D_8019A43A & 0xff) < D_8019A4AE) ? (D_8019A43A + 1) : (D_8019A43A - 1); + } + if ((D_8019A362 & 0xff) != D_8019A41C) { + D_8019A362 = ((D_8019A362 & 0xff) < D_8019A41C) ? (D_8019A362 + 1) : (D_8019A362 - 1); + } + if ((D_8019A340 & 0xff) != D_8019A361) { + D_8019A340 = ((D_8019A340 & 0xff) < D_8019A361) ? (D_8019A340 + 1) : (D_8019A340 - 1); + } + D_8019A420 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801990F0; +extern void *D_801990F4; +extern void *D_801990F8; +extern s32 D_80199120; +extern s32 D_80199124; +extern s32 D_80199128; +extern s32 D_8019A394[]; + +extern u8 D_8017EB8C[]; +extern u8 D_8017EC34[]; +extern u8 D_8017EAE4[]; +extern u8 D_8017EBE0[]; +extern u8 D_8017EC60[]; +extern u8 D_8017EB38[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80199120 = param_2; + D_80199124 = (param_2 >> 2) & 3; + D_80199128 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801990F0 = D_8017EB8C; + D_801990F4 = D_8017EC34; + D_801990F8 = D_8017EAE4; + } else { + D_801990F0 = D_8017EBE0; + D_801990F4 = D_8017EC60; + D_801990F8 = D_8017EB38; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80199128 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80199120 & 2) != 0) { + D_8019A394[0] = 0x140; + D_8019A394[3] = 0x80; + if (p[0x37] == 4) { + D_8019A394[0] = 0x140; + D_8019A394[3] = 0; + } + if (p[0x37] == 0) { + D_8019A394[0] = 0x140; + D_8019A394[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801990F8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801990F8; +extern s16 *D_801990FC; +extern s32 D_8019910C; +extern s32 D_8019912C; +extern s32 D_80199130; +extern s32 D_80199134; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801990FC != 0) { + D_8019910C = 0; + p = (int *)(param_1 * 12 + (int)D_801990F8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019912C != x) { + flag = 1; + if (D_8019912C < x) { + if (x - D_8019912C < 5) { + D_8019912C = x; + } else { + D_8019912C = D_8019912C + 4; + } + } else { + if (D_8019912C - x < 5) { + D_8019912C = x; + } else { + D_8019912C = D_8019912C - 4; + } + } + } + if (D_80199130 != y) { + flag = 1; + if (D_80199130 < y) { + if (y - D_80199130 < 5) { + D_80199130 = y; + } else { + D_80199130 = D_80199130 + 4; + } + } else { + if (D_80199130 - y < 5) { + D_80199130 = y; + } else { + D_80199130 = D_80199130 - 4; + } + } + } + if (D_80199134 != z) { + flag = 1; + if (D_80199134 < z) { + if (z - D_80199134 < 5) { + D_80199134 = z; + } else { + D_80199134 = D_80199134 + 4; + } + } else { + if (D_80199134 - z < 5) { + D_80199134 = z; + } else { + D_80199134 = D_80199134 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019910C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017ECF0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801990FC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019912C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80199130); + uVar5 = (*(int*)&D_80199134); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017ECF0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80199114; + +s32 func_8013E054(void) { + return D_80199114; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F6EC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F6C4; +extern s16 D_8017F6C6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F6EC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F6C4 = 2; + D_8017F6C6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F6C6 = 0; + D_8017F6C4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80199148; + extern void * D_8019914C; + extern unsigned char D_8017F364; + extern unsigned char D_8017F37C; + extern unsigned char D_8017F3F0; + extern unsigned char D_8017F3F8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80199148 = &D_8017F364; + D_8019914C = &D_8017F3F0; + } else { + D_80199148 = &D_8017F37C; + D_8019914C = &D_8017F3F8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F6EC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F6EC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F6EC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F6C8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F6C8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F6C8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F6C4; +extern s16 D_8017F6C6; +extern unsigned char D_8017F6C8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F6C6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F6C4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F6C6; + if (*r < 3) { + *r = *r + 1; + } + D_8017F6C4 = (u16)D_8017F6C4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F6C8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F6C8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F6C8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_109/nonmatchings/ov_SC03_109_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_110/ov_SC03_110_jr_8012ACE0.c b/src/ov_SC03_110/ov_SC03_110_jr_8012ACE0.c index f0314b615..40c799d9f 100644 --- a/src/ov_SC03_110/ov_SC03_110_jr_8012ACE0.c +++ b/src/ov_SC03_110/ov_SC03_110_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182370[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182370[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801823B4; -extern u8 D_801823F8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801823B4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801823F8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018243C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182478[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182478; - if (((s16)a1) < 0xC00) { - tbl = D_8018243C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801824B4, D_801824B6, D_801824B8, D_801824BA, D_801824BC, D_801824BE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801824B6 < ang)) goto outer_else; - if (!(ang < D_801824BC)) goto inner_else; - if (ang < D_801824B8) { *(s16 *)L = D_801824B8; goto done; } - if (D_801824BA < ang) { *(s16 *)L = D_801824BA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801824B4) { *(s16 *)L = D_801824B4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801824BE < ang) { *(s16 *)L = D_801824BE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A0E90; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A0E90, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A0E90; -extern s8 D_801A0E94; -extern s8 D_801A0E95; - -void func_8013C9C4(void * arg0) -{ - D_801A0E90 = arg0; - D_801A0E94 = 0; - D_801A0E95 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A0E90; -extern s8 D_801A0E94; -extern s8 D_801A0E95; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A0E90; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A0E95; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A0E94)) * 2) + D_801A0E90); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A0E95 = (unsigned char) p[1]; - D_801A0E94 = D_801A0E94 + 1; - if (D_801A0E95 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A0E94 = 0; - *base = 0; - } - } - else - { - D_801A0E95 = c - 1; - } - } - return; -} - - - -extern s32 D_801A0EB4; -extern s32 D_801A0EA8; -extern s32 D_801A0EAC; -extern s32 D_801A0EB8; - -void func_8013CABC(void) { - D_801A0EB4 = 1; - D_801A0EA8 = 1; - D_801A0EAC = 0; - D_801A0EB8 = 1; -} - - - -extern s32 D_801A0EA8; -extern s32 D_801A0EAC; -extern s32 D_801A0EB0; -extern s32 D_801A0EB4; -extern s32 D_801A0EB8; - -void func_8013CAE8(void) { - D_801A0EA8 = 1; - D_801A0EB4 = 0; - D_801A0EAC = 0; - D_801A0EB0 = -1; - D_801A0EB8 = 0; -} - - - -extern s32 D_801A0EB4; -extern s32 D_801A0EB8; -extern s32 D_801A0EE0; -extern s32 D_801A0EE4; - -void func_8013CB20(void) -{ - D_801A0EE0 = D_801A0EB8; - D_801A0EE4 = D_801A0EB4; - D_801A0EB8 = 1; - D_801A0EB4 = 0; -} - - - -extern s32 D_801A0EE0; -extern s32 D_801A0EE4; -extern s32 D_801A0EB8; -extern s32 D_801A0EB4; - -void func_8013CB5C(void) { - D_801A0EB8 = D_801A0EE0; - D_801A0EB4 = D_801A0EE4; -} - - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A2388; - extern u8 D_801A2389; - extern u8 D_801A238A; - extern u8 D_801A238B; - extern u8 D_801A238C; - extern u8 D_801A238D; - extern u8 D_801A238E; - extern u8 D_801A238F; - extern u8 D_801A2390; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A2388; t1 = D_801A2389; t2 = D_801A238A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A238B; t1 = D_801A238C; t2 = D_801A238D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A238E; t1 = D_801A238F; t2 = D_801A2390; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A0EC0; -extern s32 D_801A0EA8; -extern s32 D_801A0EC4; -extern s32 D_801A0EB4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A0EC0 != 0) { - if (D_801A0EC0 != 2) { - if (((D_801A0EC0 < 3) && (D_801A0EC0 == 1)) && - (D_801A0EC4 = D_801A0EC4 + 1, 0x23a < D_801A0EC4)) { - D_801A0EA8 = D_801A0EC0; - D_801A0EC0 = 2; - } - } else { - D_801A0EA8 = D_801A0EA8 + -1; - if (D_801A0EA8 == 0) { - D_801A0EA8 = D_801A0EC0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A0EB4 == 0) { - D_801A0EC0 = D_801A0EC0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A0EB4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A0EB4; -} - - - -extern s32 D_801A0EC0; - -void func_8013D164(void) { - D_801A0EC0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A246A; -extern u8 D_801A24DE; -extern u8 D_801A2392; -extern u8 D_801A244C; -extern u8 D_801A2370; -extern u8 D_801A2391; -extern s32 D_801A2450; - -void func_8013D330(void) { - if ((D_801A246A & 0xff) != D_801A24DE) { - D_801A246A = ((D_801A246A & 0xff) < D_801A24DE) ? (D_801A246A + 1) : (D_801A246A - 1); - } - if ((D_801A2392 & 0xff) != D_801A244C) { - D_801A2392 = ((D_801A2392 & 0xff) < D_801A244C) ? (D_801A2392 + 1) : (D_801A2392 - 1); - } - if ((D_801A2370 & 0xff) != D_801A2391) { - D_801A2370 = ((D_801A2370 & 0xff) < D_801A2391) ? (D_801A2370 + 1) : (D_801A2370 - 1); - } - D_801A2450 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A0E98; -extern void *D_801A0E9C; -extern void *D_801A0EA0; -extern s32 D_801A0EC8; -extern s32 D_801A0ECC; -extern s32 D_801A0ED0; -extern s32 D_801A23C4[]; - -extern u8 D_801825AC[]; -extern u8 D_80182654[]; -extern u8 D_80182504[]; -extern u8 D_80182600[]; -extern u8 D_80182680[]; -extern u8 D_80182558[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A0EC8 = param_2; - D_801A0ECC = (param_2 >> 2) & 3; - D_801A0ED0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A0E98 = D_801825AC; - D_801A0E9C = D_80182654; - D_801A0EA0 = D_80182504; - } else { - D_801A0E98 = D_80182600; - D_801A0E9C = D_80182680; - D_801A0EA0 = D_80182558; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A0ED0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A0EC8 & 2) != 0) { - D_801A23C4[0] = 0x140; - D_801A23C4[3] = 0x80; - if (p[0x37] == 4) { - D_801A23C4[0] = 0x140; - D_801A23C4[3] = 0; - } - if (p[0x37] == 0) { - D_801A23C4[0] = 0x140; - D_801A23C4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A0EA0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A0EA0; -extern s16 *D_801A0EA4; -extern s32 D_801A0EB4; -extern s32 D_801A0ED4; -extern s32 D_801A0ED8; -extern s32 D_801A0EDC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A0EA4 != 0) { - D_801A0EB4 = 0; - p = (int *)(param_1 * 12 + (int)D_801A0EA0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A0ED4 != x) { - flag = 1; - if (D_801A0ED4 < x) { - if (x - D_801A0ED4 < 5) { - D_801A0ED4 = x; - } else { - D_801A0ED4 = D_801A0ED4 + 4; - } - } else { - if (D_801A0ED4 - x < 5) { - D_801A0ED4 = x; - } else { - D_801A0ED4 = D_801A0ED4 - 4; - } - } - } - if (D_801A0ED8 != y) { - flag = 1; - if (D_801A0ED8 < y) { - if (y - D_801A0ED8 < 5) { - D_801A0ED8 = y; - } else { - D_801A0ED8 = D_801A0ED8 + 4; - } - } else { - if (D_801A0ED8 - y < 5) { - D_801A0ED8 = y; - } else { - D_801A0ED8 = D_801A0ED8 - 4; - } - } - } - if (D_801A0EDC != z) { - flag = 1; - if (D_801A0EDC < z) { - if (z - D_801A0EDC < 5) { - D_801A0EDC = z; - } else { - D_801A0EDC = D_801A0EDC + 4; - } - } else { - if (D_801A0EDC - z < 5) { - D_801A0EDC = z; - } else { - D_801A0EDC = D_801A0EDC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A0EB4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182710[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A0EA4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A0ED4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0ED8); - uVar5 = (*(int*)&D_801A0EDC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182710); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A0EBC; - -s32 func_8013E054(void) { - return D_801A0EBC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018310C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801830E4; -extern s16 D_801830E6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018310C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801830E4 = 2; - D_801830E6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801830E6 = 0; - D_801830E4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A0EF0; - extern void * D_801A0EF4; - extern unsigned char D_80182D84; - extern unsigned char D_80182D9C; - extern unsigned char D_80182E10; - extern unsigned char D_80182E18; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A0EF0 = &D_80182D84; - D_801A0EF4 = &D_80182E10; - } else { - D_801A0EF0 = &D_80182D9C; - D_801A0EF4 = &D_80182E18; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018310C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018310C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018310C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801830E8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801830E8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801830E8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801830E4; -extern s16 D_801830E6; -extern unsigned char D_801830E8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801830E6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801830E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801830E6; - if (*r < 3) { - *r = *r + 1; - } - D_801830E4 = (u16)D_801830E4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801830E8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801830E8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801830E8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_110/ov_SC03_110_jr_801380E0.c b/src/ov_SC03_110/ov_SC03_110_jr_801380E0.c new file mode 100644 index 000000000..af3e7a3c7 --- /dev/null +++ b/src/ov_SC03_110/ov_SC03_110_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019FB3C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182004[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A0DAC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A2470; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019FB3C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181D40)(); +extern s16 (*D_80181D44)(); +extern M2C_UNK (*D_80181D4C)(); +extern s32 (*D_80181D50)(); +extern s32 D_801A0DA8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019FB40; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182098; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018557C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801820B0; +extern M2C_UNK D_801820B8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801820C0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801820DC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801820E8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801820FC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018214C[]; +extern s16 D_8018217C[]; +extern s16 D_801821DC[]; +extern s16 D_801821E4[]; +extern s16 D_80182204[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018223C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182294[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801822DC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801822E4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801822EC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801822F4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018229C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801822BC; +extern void func_801321B0(int param_1); +extern int D_801822CC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A0E18; +extern s32 D_801A0E1C[]; +extern int D_801A0E20; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182300; +extern u8 D_801822FC; +extern s16 *D_80182304; +extern u8 D_80182308; +extern int D_801A0E18; +extern u16 D_801A0E28; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182304; /* holds a pointer value (*(u16**)&D_80182304) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182318[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018236C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182370[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182370[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801823B4; +extern u8 D_801823F8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801823B4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801823F8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018243C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182478[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182478; + if (((s16)a1) < 0xC00) { + tbl = D_8018243C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801824B4, D_801824B6, D_801824B8, D_801824BA, D_801824BC, D_801824BE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801824B6 < ang)) goto outer_else; + if (!(ang < D_801824BC)) goto inner_else; + if (ang < D_801824B8) { *(s16 *)L = D_801824B8; goto done; } + if (D_801824BA < ang) { *(s16 *)L = D_801824BA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801824B4) { *(s16 *)L = D_801824B4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801824BE < ang) { *(s16 *)L = D_801824BE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A0E90; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A0E90, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A0E90; +extern s8 D_801A0E94; +extern s8 D_801A0E95; + +void func_8013C9C4(void * arg0) +{ + D_801A0E90 = arg0; + D_801A0E94 = 0; + D_801A0E95 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A0E90; +extern s8 D_801A0E94; +extern s8 D_801A0E95; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A0E90; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A0E95; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A0E94)) * 2) + D_801A0E90); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A0E95 = (unsigned char) p[1]; + D_801A0E94 = D_801A0E94 + 1; + if (D_801A0E95 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A0E94 = 0; + *base = 0; + } + } + else + { + D_801A0E95 = c - 1; + } + } + return; +} + + + +extern s32 D_801A0EB4; +extern s32 D_801A0EA8; +extern s32 D_801A0EAC; +extern s32 D_801A0EB8; + +void func_8013CABC(void) { + D_801A0EB4 = 1; + D_801A0EA8 = 1; + D_801A0EAC = 0; + D_801A0EB8 = 1; +} + + + +extern s32 D_801A0EA8; +extern s32 D_801A0EAC; +extern s32 D_801A0EB0; +extern s32 D_801A0EB4; +extern s32 D_801A0EB8; + +void func_8013CAE8(void) { + D_801A0EA8 = 1; + D_801A0EB4 = 0; + D_801A0EAC = 0; + D_801A0EB0 = -1; + D_801A0EB8 = 0; +} + + + +extern s32 D_801A0EB4; +extern s32 D_801A0EB8; +extern s32 D_801A0EE0; +extern s32 D_801A0EE4; + +void func_8013CB20(void) +{ + D_801A0EE0 = D_801A0EB8; + D_801A0EE4 = D_801A0EB4; + D_801A0EB8 = 1; + D_801A0EB4 = 0; +} + + + +extern s32 D_801A0EE0; +extern s32 D_801A0EE4; +extern s32 D_801A0EB8; +extern s32 D_801A0EB4; + +void func_8013CB5C(void) { + D_801A0EB8 = D_801A0EE0; + D_801A0EB4 = D_801A0EE4; +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A2388; + extern u8 D_801A2389; + extern u8 D_801A238A; + extern u8 D_801A238B; + extern u8 D_801A238C; + extern u8 D_801A238D; + extern u8 D_801A238E; + extern u8 D_801A238F; + extern u8 D_801A2390; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A2388; t1 = D_801A2389; t2 = D_801A238A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A238B; t1 = D_801A238C; t2 = D_801A238D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A238E; t1 = D_801A238F; t2 = D_801A2390; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A0EC0; +extern s32 D_801A0EA8; +extern s32 D_801A0EC4; +extern s32 D_801A0EB4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A0EC0 != 0) { + if (D_801A0EC0 != 2) { + if (((D_801A0EC0 < 3) && (D_801A0EC0 == 1)) && + (D_801A0EC4 = D_801A0EC4 + 1, 0x23a < D_801A0EC4)) { + D_801A0EA8 = D_801A0EC0; + D_801A0EC0 = 2; + } + } else { + D_801A0EA8 = D_801A0EA8 + -1; + if (D_801A0EA8 == 0) { + D_801A0EA8 = D_801A0EC0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A0EB4 == 0) { + D_801A0EC0 = D_801A0EC0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A0EB4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A0EB4; +} + + + +extern s32 D_801A0EC0; + +void func_8013D164(void) { + D_801A0EC0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A246A; +extern u8 D_801A24DE; +extern u8 D_801A2392; +extern u8 D_801A244C; +extern u8 D_801A2370; +extern u8 D_801A2391; +extern s32 D_801A2450; + +void func_8013D330(void) { + if ((D_801A246A & 0xff) != D_801A24DE) { + D_801A246A = ((D_801A246A & 0xff) < D_801A24DE) ? (D_801A246A + 1) : (D_801A246A - 1); + } + if ((D_801A2392 & 0xff) != D_801A244C) { + D_801A2392 = ((D_801A2392 & 0xff) < D_801A244C) ? (D_801A2392 + 1) : (D_801A2392 - 1); + } + if ((D_801A2370 & 0xff) != D_801A2391) { + D_801A2370 = ((D_801A2370 & 0xff) < D_801A2391) ? (D_801A2370 + 1) : (D_801A2370 - 1); + } + D_801A2450 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A0E98; +extern void *D_801A0E9C; +extern void *D_801A0EA0; +extern s32 D_801A0EC8; +extern s32 D_801A0ECC; +extern s32 D_801A0ED0; +extern s32 D_801A23C4[]; + +extern u8 D_801825AC[]; +extern u8 D_80182654[]; +extern u8 D_80182504[]; +extern u8 D_80182600[]; +extern u8 D_80182680[]; +extern u8 D_80182558[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A0EC8 = param_2; + D_801A0ECC = (param_2 >> 2) & 3; + D_801A0ED0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A0E98 = D_801825AC; + D_801A0E9C = D_80182654; + D_801A0EA0 = D_80182504; + } else { + D_801A0E98 = D_80182600; + D_801A0E9C = D_80182680; + D_801A0EA0 = D_80182558; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A0ED0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A0EC8 & 2) != 0) { + D_801A23C4[0] = 0x140; + D_801A23C4[3] = 0x80; + if (p[0x37] == 4) { + D_801A23C4[0] = 0x140; + D_801A23C4[3] = 0; + } + if (p[0x37] == 0) { + D_801A23C4[0] = 0x140; + D_801A23C4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A0EA0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A0EA0; +extern s16 *D_801A0EA4; +extern s32 D_801A0EB4; +extern s32 D_801A0ED4; +extern s32 D_801A0ED8; +extern s32 D_801A0EDC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A0EA4 != 0) { + D_801A0EB4 = 0; + p = (int *)(param_1 * 12 + (int)D_801A0EA0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A0ED4 != x) { + flag = 1; + if (D_801A0ED4 < x) { + if (x - D_801A0ED4 < 5) { + D_801A0ED4 = x; + } else { + D_801A0ED4 = D_801A0ED4 + 4; + } + } else { + if (D_801A0ED4 - x < 5) { + D_801A0ED4 = x; + } else { + D_801A0ED4 = D_801A0ED4 - 4; + } + } + } + if (D_801A0ED8 != y) { + flag = 1; + if (D_801A0ED8 < y) { + if (y - D_801A0ED8 < 5) { + D_801A0ED8 = y; + } else { + D_801A0ED8 = D_801A0ED8 + 4; + } + } else { + if (D_801A0ED8 - y < 5) { + D_801A0ED8 = y; + } else { + D_801A0ED8 = D_801A0ED8 - 4; + } + } + } + if (D_801A0EDC != z) { + flag = 1; + if (D_801A0EDC < z) { + if (z - D_801A0EDC < 5) { + D_801A0EDC = z; + } else { + D_801A0EDC = D_801A0EDC + 4; + } + } else { + if (D_801A0EDC - z < 5) { + D_801A0EDC = z; + } else { + D_801A0EDC = D_801A0EDC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A0EB4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182710[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A0EA4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A0ED4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0ED8); + uVar5 = (*(int*)&D_801A0EDC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182710); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A0EBC; + +s32 func_8013E054(void) { + return D_801A0EBC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018310C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801830E4; +extern s16 D_801830E6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018310C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801830E4 = 2; + D_801830E6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801830E6 = 0; + D_801830E4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A0EF0; + extern void * D_801A0EF4; + extern unsigned char D_80182D84; + extern unsigned char D_80182D9C; + extern unsigned char D_80182E10; + extern unsigned char D_80182E18; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A0EF0 = &D_80182D84; + D_801A0EF4 = &D_80182E10; + } else { + D_801A0EF0 = &D_80182D9C; + D_801A0EF4 = &D_80182E18; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018310C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018310C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018310C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801830E8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801830E8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801830E8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801830E4; +extern s16 D_801830E6; +extern unsigned char D_801830E8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801830E6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801830E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801830E6; + if (*r < 3) { + *r = *r + 1; + } + D_801830E4 = (u16)D_801830E4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801830E8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801830E8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801830E8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_110/nonmatchings/ov_SC03_110_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_111/ov_SC03_111_jr_8012ACE0.c b/src/ov_SC03_111/ov_SC03_111_jr_8012ACE0.c index f6ceb9eae..43c243a47 100644 --- a/src/ov_SC03_111/ov_SC03_111_jr_8012ACE0.c +++ b/src/ov_SC03_111/ov_SC03_111_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184F24[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184F24[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184F68; -extern u8 D_80184FAC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184F68; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184FAC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184FF0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018502C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018502C; - if (((s16)a1) < 0xC00) { - tbl = D_80184FF0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185068, D_8018506A, D_8018506C, D_8018506E, D_80185070, D_80185072; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018506A < ang)) goto outer_else; - if (!(ang < D_80185070)) goto inner_else; - if (ang < D_8018506C) { *(s16 *)L = D_8018506C; goto done; } - if (D_8018506E < ang) { *(s16 *)L = D_8018506E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185068) { *(s16 *)L = D_80185068; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80185072 < ang) { *(s16 *)L = D_80185072; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B8398; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B8398, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B8398; -extern s8 D_801B839C; -extern s8 D_801B839D; - -void func_8013C9C4(void * arg0) -{ - D_801B8398 = arg0; - D_801B839C = 0; - D_801B839D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B8398; -extern s8 D_801B839C; -extern s8 D_801B839D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B8398; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B839D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B839C)) * 2) + D_801B8398); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B839D = (unsigned char) p[1]; - D_801B839C = D_801B839C + 1; - if (D_801B839D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B839C = 0; - *base = 0; - } - } - else - { - D_801B839D = c - 1; - } - } - return; -} - - - -extern s32 D_801B83BC; -extern s32 D_801B83B0; -extern s32 D_801B83B4; -extern s32 D_801B83C0; - -void func_8013CABC(void) { - D_801B83BC = 1; - D_801B83B0 = 1; - D_801B83B4 = 0; - D_801B83C0 = 1; -} - - - -extern s32 D_801B83B0; -extern s32 D_801B83B4; -extern s32 D_801B83B8; -extern s32 D_801B83BC; -extern s32 D_801B83C0; - -void func_8013CAE8(void) { - D_801B83B0 = 1; - D_801B83BC = 0; - D_801B83B4 = 0; - D_801B83B8 = -1; - D_801B83C0 = 0; -} - - - -extern s32 D_801B83BC; -extern s32 D_801B83C0; -extern s32 D_801B83E8; -extern s32 D_801B83EC; - -void func_8013CB20(void) -{ - D_801B83E8 = D_801B83C0; - D_801B83EC = D_801B83BC; - D_801B83C0 = 1; - D_801B83BC = 0; -} - - - -extern s32 D_801B83E8; -extern s32 D_801B83EC; -extern s32 D_801B83C0; -extern s32 D_801B83BC; - -void func_8013CB5C(void) { - D_801B83C0 = D_801B83E8; - D_801B83BC = D_801B83EC; -} - - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B9A30; - extern u8 D_801B9A31; - extern u8 D_801B9A32; - extern u8 D_801B9A33; - extern u8 D_801B9A34; - extern u8 D_801B9A35; - extern u8 D_801B9A36; - extern u8 D_801B9A37; - extern u8 D_801B9A38; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B9A30; t1 = D_801B9A31; t2 = D_801B9A32; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B9A33; t1 = D_801B9A34; t2 = D_801B9A35; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B9A36; t1 = D_801B9A37; t2 = D_801B9A38; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B83C8; -extern s32 D_801B83B0; -extern s32 D_801B83CC; -extern s32 D_801B83BC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B83C8 != 0) { - if (D_801B83C8 != 2) { - if (((D_801B83C8 < 3) && (D_801B83C8 == 1)) && - (D_801B83CC = D_801B83CC + 1, 0x23a < D_801B83CC)) { - D_801B83B0 = D_801B83C8; - D_801B83C8 = 2; - } - } else { - D_801B83B0 = D_801B83B0 + -1; - if (D_801B83B0 == 0) { - D_801B83B0 = D_801B83C8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B83BC == 0) { - D_801B83C8 = D_801B83C8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B83BC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B83BC; -} - - - -extern s32 D_801B83C8; - -void func_8013D164(void) { - D_801B83C8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B9B12; -extern u8 D_801B9B86; -extern u8 D_801B9A3A; -extern u8 D_801B9AF4; -extern u8 D_801B9A18; -extern u8 D_801B9A39; -extern s32 D_801B9AF8; - -void func_8013D330(void) { - if ((D_801B9B12 & 0xff) != D_801B9B86) { - D_801B9B12 = ((D_801B9B12 & 0xff) < D_801B9B86) ? (D_801B9B12 + 1) : (D_801B9B12 - 1); - } - if ((D_801B9A3A & 0xff) != D_801B9AF4) { - D_801B9A3A = ((D_801B9A3A & 0xff) < D_801B9AF4) ? (D_801B9A3A + 1) : (D_801B9A3A - 1); - } - if ((D_801B9A18 & 0xff) != D_801B9A39) { - D_801B9A18 = ((D_801B9A18 & 0xff) < D_801B9A39) ? (D_801B9A18 + 1) : (D_801B9A18 - 1); - } - D_801B9AF8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B83A0; -extern void *D_801B83A4; -extern void *D_801B83A8; -extern s32 D_801B83D0; -extern s32 D_801B83D4; -extern s32 D_801B83D8; -extern s32 D_801B9A6C[]; - -extern u8 D_80185160[]; -extern u8 D_80185208[]; -extern u8 D_801850B8[]; -extern u8 D_801851B4[]; -extern u8 D_80185234[]; -extern u8 D_8018510C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B83D0 = param_2; - D_801B83D4 = (param_2 >> 2) & 3; - D_801B83D8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B83A0 = D_80185160; - D_801B83A4 = D_80185208; - D_801B83A8 = D_801850B8; - } else { - D_801B83A0 = D_801851B4; - D_801B83A4 = D_80185234; - D_801B83A8 = D_8018510C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B83D8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B83D0 & 2) != 0) { - D_801B9A6C[0] = 0x140; - D_801B9A6C[3] = 0x80; - if (p[0x37] == 4) { - D_801B9A6C[0] = 0x140; - D_801B9A6C[3] = 0; - } - if (p[0x37] == 0) { - D_801B9A6C[0] = 0x140; - D_801B9A6C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B83A8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B83A8; -extern s16 *D_801B83AC; -extern s32 D_801B83BC; -extern s32 D_801B83DC; -extern s32 D_801B83E0; -extern s32 D_801B83E4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B83AC != 0) { - D_801B83BC = 0; - p = (int *)(param_1 * 12 + (int)D_801B83A8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B83DC != x) { - flag = 1; - if (D_801B83DC < x) { - if (x - D_801B83DC < 5) { - D_801B83DC = x; - } else { - D_801B83DC = D_801B83DC + 4; - } - } else { - if (D_801B83DC - x < 5) { - D_801B83DC = x; - } else { - D_801B83DC = D_801B83DC - 4; - } - } - } - if (D_801B83E0 != y) { - flag = 1; - if (D_801B83E0 < y) { - if (y - D_801B83E0 < 5) { - D_801B83E0 = y; - } else { - D_801B83E0 = D_801B83E0 + 4; - } - } else { - if (D_801B83E0 - y < 5) { - D_801B83E0 = y; - } else { - D_801B83E0 = D_801B83E0 - 4; - } - } - } - if (D_801B83E4 != z) { - flag = 1; - if (D_801B83E4 < z) { - if (z - D_801B83E4 < 5) { - D_801B83E4 = z; - } else { - D_801B83E4 = D_801B83E4 + 4; - } - } else { - if (D_801B83E4 - z < 5) { - D_801B83E4 = z; - } else { - D_801B83E4 = D_801B83E4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B83BC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801852C4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B83AC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B83DC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B83E0); - uVar5 = (*(int*)&D_801B83E4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801852C4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B83C4; - -s32 func_8013E054(void) { - return D_801B83C4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80185CC0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80185C98; -extern s16 D_80185C9A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80185CC0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80185C98 = 2; - D_80185C9A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80185C9A = 0; - D_80185C98 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B83F8; - extern void * D_801B83FC; - extern unsigned char D_80185938; - extern unsigned char D_80185950; - extern unsigned char D_801859C4; - extern unsigned char D_801859CC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B83F8 = &D_80185938; - D_801B83FC = &D_801859C4; - } else { - D_801B83F8 = &D_80185950; - D_801B83FC = &D_801859CC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80185CC0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185CC0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80185CC0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80185C9C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185C9C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185C9C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80185C98; -extern s16 D_80185C9A; -extern unsigned char D_80185C9C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185C9A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80185C98` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80185C9A; - if (*r < 3) { - *r = *r + 1; - } - D_80185C98 = (u16)D_80185C98 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C9C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80185C9C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C9C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_111/ov_SC03_111_jr_801380E0.c b/src/ov_SC03_111/ov_SC03_111_jr_801380E0.c new file mode 100644 index 000000000..4163d14dc --- /dev/null +++ b/src/ov_SC03_111/ov_SC03_111_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B70BC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184BB8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B82B4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B9B18; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B70BC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801848F4)(); +extern s16 (*D_801848F8)(); +extern M2C_UNK (*D_80184900)(); +extern s32 (*D_80184904)(); +extern s32 D_801B82B0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B70C0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80184C4C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80188130; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184C64; +extern M2C_UNK D_80184C6C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184C74; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80184C90[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80184C9C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80184CB0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184D00[]; +extern s16 D_80184D30[]; +extern s16 D_80184D90[]; +extern s16 D_80184D98[]; +extern s16 D_80184DB8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184DF0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80184E48[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80184E90[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80184E98[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184EA0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184EA8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184E50; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184E70; +extern void func_801321B0(int param_1); +extern int D_80184E80; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B8320; +extern s32 D_801B8324[]; +extern int D_801B8328; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184EB4; +extern u8 D_80184EB0; +extern s16 *D_80184EB8; +extern u8 D_80184EBC; +extern int D_801B8320; +extern u16 D_801B8330; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184EB8; /* holds a pointer value (*(u16**)&D_80184EB8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184ECC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184F20; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184F24[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184F24[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184F68; +extern u8 D_80184FAC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184F68; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184FAC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184FF0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018502C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018502C; + if (((s16)a1) < 0xC00) { + tbl = D_80184FF0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185068, D_8018506A, D_8018506C, D_8018506E, D_80185070, D_80185072; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018506A < ang)) goto outer_else; + if (!(ang < D_80185070)) goto inner_else; + if (ang < D_8018506C) { *(s16 *)L = D_8018506C; goto done; } + if (D_8018506E < ang) { *(s16 *)L = D_8018506E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185068) { *(s16 *)L = D_80185068; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185072 < ang) { *(s16 *)L = D_80185072; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B8398; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B8398, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B8398; +extern s8 D_801B839C; +extern s8 D_801B839D; + +void func_8013C9C4(void * arg0) +{ + D_801B8398 = arg0; + D_801B839C = 0; + D_801B839D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B8398; +extern s8 D_801B839C; +extern s8 D_801B839D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B8398; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B839D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B839C)) * 2) + D_801B8398); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B839D = (unsigned char) p[1]; + D_801B839C = D_801B839C + 1; + if (D_801B839D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B839C = 0; + *base = 0; + } + } + else + { + D_801B839D = c - 1; + } + } + return; +} + + + +extern s32 D_801B83BC; +extern s32 D_801B83B0; +extern s32 D_801B83B4; +extern s32 D_801B83C0; + +void func_8013CABC(void) { + D_801B83BC = 1; + D_801B83B0 = 1; + D_801B83B4 = 0; + D_801B83C0 = 1; +} + + + +extern s32 D_801B83B0; +extern s32 D_801B83B4; +extern s32 D_801B83B8; +extern s32 D_801B83BC; +extern s32 D_801B83C0; + +void func_8013CAE8(void) { + D_801B83B0 = 1; + D_801B83BC = 0; + D_801B83B4 = 0; + D_801B83B8 = -1; + D_801B83C0 = 0; +} + + + +extern s32 D_801B83BC; +extern s32 D_801B83C0; +extern s32 D_801B83E8; +extern s32 D_801B83EC; + +void func_8013CB20(void) +{ + D_801B83E8 = D_801B83C0; + D_801B83EC = D_801B83BC; + D_801B83C0 = 1; + D_801B83BC = 0; +} + + + +extern s32 D_801B83E8; +extern s32 D_801B83EC; +extern s32 D_801B83C0; +extern s32 D_801B83BC; + +void func_8013CB5C(void) { + D_801B83C0 = D_801B83E8; + D_801B83BC = D_801B83EC; +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B9A30; + extern u8 D_801B9A31; + extern u8 D_801B9A32; + extern u8 D_801B9A33; + extern u8 D_801B9A34; + extern u8 D_801B9A35; + extern u8 D_801B9A36; + extern u8 D_801B9A37; + extern u8 D_801B9A38; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B9A30; t1 = D_801B9A31; t2 = D_801B9A32; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B9A33; t1 = D_801B9A34; t2 = D_801B9A35; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B9A36; t1 = D_801B9A37; t2 = D_801B9A38; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B83C8; +extern s32 D_801B83B0; +extern s32 D_801B83CC; +extern s32 D_801B83BC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B83C8 != 0) { + if (D_801B83C8 != 2) { + if (((D_801B83C8 < 3) && (D_801B83C8 == 1)) && + (D_801B83CC = D_801B83CC + 1, 0x23a < D_801B83CC)) { + D_801B83B0 = D_801B83C8; + D_801B83C8 = 2; + } + } else { + D_801B83B0 = D_801B83B0 + -1; + if (D_801B83B0 == 0) { + D_801B83B0 = D_801B83C8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B83BC == 0) { + D_801B83C8 = D_801B83C8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B83BC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B83BC; +} + + + +extern s32 D_801B83C8; + +void func_8013D164(void) { + D_801B83C8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B9B12; +extern u8 D_801B9B86; +extern u8 D_801B9A3A; +extern u8 D_801B9AF4; +extern u8 D_801B9A18; +extern u8 D_801B9A39; +extern s32 D_801B9AF8; + +void func_8013D330(void) { + if ((D_801B9B12 & 0xff) != D_801B9B86) { + D_801B9B12 = ((D_801B9B12 & 0xff) < D_801B9B86) ? (D_801B9B12 + 1) : (D_801B9B12 - 1); + } + if ((D_801B9A3A & 0xff) != D_801B9AF4) { + D_801B9A3A = ((D_801B9A3A & 0xff) < D_801B9AF4) ? (D_801B9A3A + 1) : (D_801B9A3A - 1); + } + if ((D_801B9A18 & 0xff) != D_801B9A39) { + D_801B9A18 = ((D_801B9A18 & 0xff) < D_801B9A39) ? (D_801B9A18 + 1) : (D_801B9A18 - 1); + } + D_801B9AF8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B83A0; +extern void *D_801B83A4; +extern void *D_801B83A8; +extern s32 D_801B83D0; +extern s32 D_801B83D4; +extern s32 D_801B83D8; +extern s32 D_801B9A6C[]; + +extern u8 D_80185160[]; +extern u8 D_80185208[]; +extern u8 D_801850B8[]; +extern u8 D_801851B4[]; +extern u8 D_80185234[]; +extern u8 D_8018510C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B83D0 = param_2; + D_801B83D4 = (param_2 >> 2) & 3; + D_801B83D8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B83A0 = D_80185160; + D_801B83A4 = D_80185208; + D_801B83A8 = D_801850B8; + } else { + D_801B83A0 = D_801851B4; + D_801B83A4 = D_80185234; + D_801B83A8 = D_8018510C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B83D8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B83D0 & 2) != 0) { + D_801B9A6C[0] = 0x140; + D_801B9A6C[3] = 0x80; + if (p[0x37] == 4) { + D_801B9A6C[0] = 0x140; + D_801B9A6C[3] = 0; + } + if (p[0x37] == 0) { + D_801B9A6C[0] = 0x140; + D_801B9A6C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B83A8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B83A8; +extern s16 *D_801B83AC; +extern s32 D_801B83BC; +extern s32 D_801B83DC; +extern s32 D_801B83E0; +extern s32 D_801B83E4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B83AC != 0) { + D_801B83BC = 0; + p = (int *)(param_1 * 12 + (int)D_801B83A8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B83DC != x) { + flag = 1; + if (D_801B83DC < x) { + if (x - D_801B83DC < 5) { + D_801B83DC = x; + } else { + D_801B83DC = D_801B83DC + 4; + } + } else { + if (D_801B83DC - x < 5) { + D_801B83DC = x; + } else { + D_801B83DC = D_801B83DC - 4; + } + } + } + if (D_801B83E0 != y) { + flag = 1; + if (D_801B83E0 < y) { + if (y - D_801B83E0 < 5) { + D_801B83E0 = y; + } else { + D_801B83E0 = D_801B83E0 + 4; + } + } else { + if (D_801B83E0 - y < 5) { + D_801B83E0 = y; + } else { + D_801B83E0 = D_801B83E0 - 4; + } + } + } + if (D_801B83E4 != z) { + flag = 1; + if (D_801B83E4 < z) { + if (z - D_801B83E4 < 5) { + D_801B83E4 = z; + } else { + D_801B83E4 = D_801B83E4 + 4; + } + } else { + if (D_801B83E4 - z < 5) { + D_801B83E4 = z; + } else { + D_801B83E4 = D_801B83E4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B83BC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801852C4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B83AC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B83DC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B83E0); + uVar5 = (*(int*)&D_801B83E4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801852C4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B83C4; + +s32 func_8013E054(void) { + return D_801B83C4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80185CC0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80185C98; +extern s16 D_80185C9A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80185CC0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80185C98 = 2; + D_80185C9A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80185C9A = 0; + D_80185C98 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B83F8; + extern void * D_801B83FC; + extern unsigned char D_80185938; + extern unsigned char D_80185950; + extern unsigned char D_801859C4; + extern unsigned char D_801859CC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B83F8 = &D_80185938; + D_801B83FC = &D_801859C4; + } else { + D_801B83F8 = &D_80185950; + D_801B83FC = &D_801859CC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80185CC0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185CC0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80185CC0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80185C9C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185C9C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185C9C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80185C98; +extern s16 D_80185C9A; +extern unsigned char D_80185C9C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185C9A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80185C98` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80185C9A; + if (*r < 3) { + *r = *r + 1; + } + D_80185C98 = (u16)D_80185C98 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C9C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80185C9C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C9C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_111/nonmatchings/ov_SC03_111_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_112/ov_SC03_112_jr_8012ACE0.c b/src/ov_SC03_112/ov_SC03_112_jr_8012ACE0.c index 894fd6a35..ca49d9711 100644 --- a/src/ov_SC03_112/ov_SC03_112_jr_8012ACE0.c +++ b/src/ov_SC03_112/ov_SC03_112_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185D2C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185D2C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80185D70; -extern u8 D_80185DB4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80185D70; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80185DB4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80185DF8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80185E34[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80185E34; - if (((s16)a1) < 0xC00) { - tbl = D_80185DF8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185E70, D_80185E72, D_80185E74, D_80185E76, D_80185E78, D_80185E7A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185E72 < ang)) goto outer_else; - if (!(ang < D_80185E78)) goto inner_else; - if (ang < D_80185E74) { *(s16 *)L = D_80185E74; goto done; } - if (D_80185E76 < ang) { *(s16 *)L = D_80185E76; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185E70) { *(s16 *)L = D_80185E70; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80185E7A < ang) { *(s16 *)L = D_80185E7A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801ABBF8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801ABBF8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801ABBF8; -extern s8 D_801ABBFC; -extern s8 D_801ABBFD; - -void func_8013C9C4(void * arg0) -{ - D_801ABBF8 = arg0; - D_801ABBFC = 0; - D_801ABBFD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801ABBF8; -extern s8 D_801ABBFC; -extern s8 D_801ABBFD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801ABBF8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801ABBFD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801ABBFC)) * 2) + D_801ABBF8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801ABBFD = (unsigned char) p[1]; - D_801ABBFC = D_801ABBFC + 1; - if (D_801ABBFD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801ABBFC = 0; - *base = 0; - } - } - else - { - D_801ABBFD = c - 1; - } - } - return; -} - - - -extern s32 D_801ABC1C; -extern s32 D_801ABC10; -extern s32 D_801ABC14; -extern s32 D_801ABC20; - -void func_8013CABC(void) { - D_801ABC1C = 1; - D_801ABC10 = 1; - D_801ABC14 = 0; - D_801ABC20 = 1; -} - - - -extern s32 D_801ABC10; -extern s32 D_801ABC14; -extern s32 D_801ABC18; -extern s32 D_801ABC1C; -extern s32 D_801ABC20; - -void func_8013CAE8(void) { - D_801ABC10 = 1; - D_801ABC1C = 0; - D_801ABC14 = 0; - D_801ABC18 = -1; - D_801ABC20 = 0; -} - - - -extern s32 D_801ABC1C; -extern s32 D_801ABC20; -extern s32 D_801ABC48; -extern s32 D_801ABC4C; - -void func_8013CB20(void) -{ - D_801ABC48 = D_801ABC20; - D_801ABC4C = D_801ABC1C; - D_801ABC20 = 1; - D_801ABC1C = 0; -} - - - -extern s32 D_801ABC48; -extern s32 D_801ABC4C; -extern s32 D_801ABC20; -extern s32 D_801ABC1C; - -void func_8013CB5C(void) { - D_801ABC20 = D_801ABC48; - D_801ABC1C = D_801ABC4C; -} - - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801ACFF8; - extern u8 D_801ACFF9; - extern u8 D_801ACFFA; - extern u8 D_801ACFFB; - extern u8 D_801ACFFC; - extern u8 D_801ACFFD; - extern u8 D_801ACFFE; - extern u8 D_801ACFFF; - extern u8 D_801AD000; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801ACFF8; t1 = D_801ACFF9; t2 = D_801ACFFA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801ACFFB; t1 = D_801ACFFC; t2 = D_801ACFFD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801ACFFE; t1 = D_801ACFFF; t2 = D_801AD000; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801ABC28; -extern s32 D_801ABC10; -extern s32 D_801ABC2C; -extern s32 D_801ABC1C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801ABC28 != 0) { - if (D_801ABC28 != 2) { - if (((D_801ABC28 < 3) && (D_801ABC28 == 1)) && - (D_801ABC2C = D_801ABC2C + 1, 0x23a < D_801ABC2C)) { - D_801ABC10 = D_801ABC28; - D_801ABC28 = 2; - } - } else { - D_801ABC10 = D_801ABC10 + -1; - if (D_801ABC10 == 0) { - D_801ABC10 = D_801ABC28; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801ABC1C == 0) { - D_801ABC28 = D_801ABC28 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801ABC1C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801ABC1C; -} - - - -extern s32 D_801ABC28; - -void func_8013D164(void) { - D_801ABC28 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AD0DA; -extern u8 D_801AD14E; -extern u8 D_801AD002; -extern u8 D_801AD0BC; -extern u8 D_801ACFE0; -extern u8 D_801AD001; -extern s32 D_801AD0C0; - -void func_8013D330(void) { - if ((D_801AD0DA & 0xff) != D_801AD14E) { - D_801AD0DA = ((D_801AD0DA & 0xff) < D_801AD14E) ? (D_801AD0DA + 1) : (D_801AD0DA - 1); - } - if ((D_801AD002 & 0xff) != D_801AD0BC) { - D_801AD002 = ((D_801AD002 & 0xff) < D_801AD0BC) ? (D_801AD002 + 1) : (D_801AD002 - 1); - } - if ((D_801ACFE0 & 0xff) != D_801AD001) { - D_801ACFE0 = ((D_801ACFE0 & 0xff) < D_801AD001) ? (D_801ACFE0 + 1) : (D_801ACFE0 - 1); - } - D_801AD0C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801ABC00; -extern void *D_801ABC04; -extern void *D_801ABC08; -extern s32 D_801ABC30; -extern s32 D_801ABC34; -extern s32 D_801ABC38; -extern s32 D_801AD034[]; - -extern u8 D_80185F68[]; -extern u8 D_80186010[]; -extern u8 D_80185EC0[]; -extern u8 D_80185FBC[]; -extern u8 D_8018603C[]; -extern u8 D_80185F14[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801ABC30 = param_2; - D_801ABC34 = (param_2 >> 2) & 3; - D_801ABC38 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801ABC00 = D_80185F68; - D_801ABC04 = D_80186010; - D_801ABC08 = D_80185EC0; - } else { - D_801ABC00 = D_80185FBC; - D_801ABC04 = D_8018603C; - D_801ABC08 = D_80185F14; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801ABC38 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801ABC30 & 2) != 0) { - D_801AD034[0] = 0x140; - D_801AD034[3] = 0x80; - if (p[0x37] == 4) { - D_801AD034[0] = 0x140; - D_801AD034[3] = 0; - } - if (p[0x37] == 0) { - D_801AD034[0] = 0x140; - D_801AD034[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801ABC08)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801ABC08; -extern s16 *D_801ABC0C; -extern s32 D_801ABC1C; -extern s32 D_801ABC3C; -extern s32 D_801ABC40; -extern s32 D_801ABC44; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801ABC0C != 0) { - D_801ABC1C = 0; - p = (int *)(param_1 * 12 + (int)D_801ABC08); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801ABC3C != x) { - flag = 1; - if (D_801ABC3C < x) { - if (x - D_801ABC3C < 5) { - D_801ABC3C = x; - } else { - D_801ABC3C = D_801ABC3C + 4; - } - } else { - if (D_801ABC3C - x < 5) { - D_801ABC3C = x; - } else { - D_801ABC3C = D_801ABC3C - 4; - } - } - } - if (D_801ABC40 != y) { - flag = 1; - if (D_801ABC40 < y) { - if (y - D_801ABC40 < 5) { - D_801ABC40 = y; - } else { - D_801ABC40 = D_801ABC40 + 4; - } - } else { - if (D_801ABC40 - y < 5) { - D_801ABC40 = y; - } else { - D_801ABC40 = D_801ABC40 - 4; - } - } - } - if (D_801ABC44 != z) { - flag = 1; - if (D_801ABC44 < z) { - if (z - D_801ABC44 < 5) { - D_801ABC44 = z; - } else { - D_801ABC44 = D_801ABC44 + 4; - } - } else { - if (D_801ABC44 - z < 5) { - D_801ABC44 = z; - } else { - D_801ABC44 = D_801ABC44 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801ABC1C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801860CC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801ABC0C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801ABC3C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801ABC40); - uVar5 = (*(int*)&D_801ABC44); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801860CC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801ABC24; - -s32 func_8013E054(void) { - return D_801ABC24; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186AC8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186AA0; -extern s16 D_80186AA2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186AC8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186AA0 = 2; - D_80186AA2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186AA2 = 0; - D_80186AA0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801ABC58; - extern void * D_801ABC5C; - extern unsigned char D_80186740; - extern unsigned char D_80186758; - extern unsigned char D_801867CC; - extern unsigned char D_801867D4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801ABC58 = &D_80186740; - D_801ABC5C = &D_801867CC; - } else { - D_801ABC58 = &D_80186758; - D_801ABC5C = &D_801867D4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186AC8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186AC8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186AC8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186AA4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186AA4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186AA4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186AA0; -extern s16 D_80186AA2; -extern unsigned char D_80186AA4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186AA2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186AA0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186AA2; - if (*r < 3) { - *r = *r + 1; - } - D_80186AA0 = (u16)D_80186AA0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186AA4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186AA4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186AA4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_112/ov_SC03_112_jr_801380E0.c b/src/ov_SC03_112/ov_SC03_112_jr_801380E0.c new file mode 100644 index 000000000..0b412fcce --- /dev/null +++ b/src/ov_SC03_112/ov_SC03_112_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AA824; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801859C0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801ABB14; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AD0E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AA824; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801856FC)(); +extern s16 (*D_80185700)(); +extern M2C_UNK (*D_80185708)(); +extern s32 (*D_8018570C)(); +extern s32 D_801ABB10; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AA828; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80185A54; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80188F38; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185A6C; +extern M2C_UNK D_80185A74; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185A7C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185A98[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185AA4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185AB8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185B08[]; +extern s16 D_80185B38[]; +extern s16 D_80185B98[]; +extern s16 D_80185BA0[]; +extern s16 D_80185BC0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80185BF8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185C50[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185C98[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185CA0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185CA8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185CB0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80185C58; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80185C78; +extern void func_801321B0(int param_1); +extern int D_80185C88; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801ABB80; +extern s32 D_801ABB84[]; +extern int D_801ABB88; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185CBC; +extern u8 D_80185CB8; +extern s16 *D_80185CC0; +extern u8 D_80185CC4; +extern int D_801ABB80; +extern u16 D_801ABB90; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185CC0; /* holds a pointer value (*(u16**)&D_80185CC0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185CD4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185D28; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185D2C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185D2C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80185D70; +extern u8 D_80185DB4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80185D70; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80185DB4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80185DF8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80185E34[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80185E34; + if (((s16)a1) < 0xC00) { + tbl = D_80185DF8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185E70, D_80185E72, D_80185E74, D_80185E76, D_80185E78, D_80185E7A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185E72 < ang)) goto outer_else; + if (!(ang < D_80185E78)) goto inner_else; + if (ang < D_80185E74) { *(s16 *)L = D_80185E74; goto done; } + if (D_80185E76 < ang) { *(s16 *)L = D_80185E76; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185E70) { *(s16 *)L = D_80185E70; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185E7A < ang) { *(s16 *)L = D_80185E7A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801ABBF8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801ABBF8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801ABBF8; +extern s8 D_801ABBFC; +extern s8 D_801ABBFD; + +void func_8013C9C4(void * arg0) +{ + D_801ABBF8 = arg0; + D_801ABBFC = 0; + D_801ABBFD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801ABBF8; +extern s8 D_801ABBFC; +extern s8 D_801ABBFD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801ABBF8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801ABBFD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801ABBFC)) * 2) + D_801ABBF8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801ABBFD = (unsigned char) p[1]; + D_801ABBFC = D_801ABBFC + 1; + if (D_801ABBFD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801ABBFC = 0; + *base = 0; + } + } + else + { + D_801ABBFD = c - 1; + } + } + return; +} + + + +extern s32 D_801ABC1C; +extern s32 D_801ABC10; +extern s32 D_801ABC14; +extern s32 D_801ABC20; + +void func_8013CABC(void) { + D_801ABC1C = 1; + D_801ABC10 = 1; + D_801ABC14 = 0; + D_801ABC20 = 1; +} + + + +extern s32 D_801ABC10; +extern s32 D_801ABC14; +extern s32 D_801ABC18; +extern s32 D_801ABC1C; +extern s32 D_801ABC20; + +void func_8013CAE8(void) { + D_801ABC10 = 1; + D_801ABC1C = 0; + D_801ABC14 = 0; + D_801ABC18 = -1; + D_801ABC20 = 0; +} + + + +extern s32 D_801ABC1C; +extern s32 D_801ABC20; +extern s32 D_801ABC48; +extern s32 D_801ABC4C; + +void func_8013CB20(void) +{ + D_801ABC48 = D_801ABC20; + D_801ABC4C = D_801ABC1C; + D_801ABC20 = 1; + D_801ABC1C = 0; +} + + + +extern s32 D_801ABC48; +extern s32 D_801ABC4C; +extern s32 D_801ABC20; +extern s32 D_801ABC1C; + +void func_8013CB5C(void) { + D_801ABC20 = D_801ABC48; + D_801ABC1C = D_801ABC4C; +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801ACFF8; + extern u8 D_801ACFF9; + extern u8 D_801ACFFA; + extern u8 D_801ACFFB; + extern u8 D_801ACFFC; + extern u8 D_801ACFFD; + extern u8 D_801ACFFE; + extern u8 D_801ACFFF; + extern u8 D_801AD000; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801ACFF8; t1 = D_801ACFF9; t2 = D_801ACFFA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801ACFFB; t1 = D_801ACFFC; t2 = D_801ACFFD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801ACFFE; t1 = D_801ACFFF; t2 = D_801AD000; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801ABC28; +extern s32 D_801ABC10; +extern s32 D_801ABC2C; +extern s32 D_801ABC1C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801ABC28 != 0) { + if (D_801ABC28 != 2) { + if (((D_801ABC28 < 3) && (D_801ABC28 == 1)) && + (D_801ABC2C = D_801ABC2C + 1, 0x23a < D_801ABC2C)) { + D_801ABC10 = D_801ABC28; + D_801ABC28 = 2; + } + } else { + D_801ABC10 = D_801ABC10 + -1; + if (D_801ABC10 == 0) { + D_801ABC10 = D_801ABC28; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801ABC1C == 0) { + D_801ABC28 = D_801ABC28 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801ABC1C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801ABC1C; +} + + + +extern s32 D_801ABC28; + +void func_8013D164(void) { + D_801ABC28 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AD0DA; +extern u8 D_801AD14E; +extern u8 D_801AD002; +extern u8 D_801AD0BC; +extern u8 D_801ACFE0; +extern u8 D_801AD001; +extern s32 D_801AD0C0; + +void func_8013D330(void) { + if ((D_801AD0DA & 0xff) != D_801AD14E) { + D_801AD0DA = ((D_801AD0DA & 0xff) < D_801AD14E) ? (D_801AD0DA + 1) : (D_801AD0DA - 1); + } + if ((D_801AD002 & 0xff) != D_801AD0BC) { + D_801AD002 = ((D_801AD002 & 0xff) < D_801AD0BC) ? (D_801AD002 + 1) : (D_801AD002 - 1); + } + if ((D_801ACFE0 & 0xff) != D_801AD001) { + D_801ACFE0 = ((D_801ACFE0 & 0xff) < D_801AD001) ? (D_801ACFE0 + 1) : (D_801ACFE0 - 1); + } + D_801AD0C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801ABC00; +extern void *D_801ABC04; +extern void *D_801ABC08; +extern s32 D_801ABC30; +extern s32 D_801ABC34; +extern s32 D_801ABC38; +extern s32 D_801AD034[]; + +extern u8 D_80185F68[]; +extern u8 D_80186010[]; +extern u8 D_80185EC0[]; +extern u8 D_80185FBC[]; +extern u8 D_8018603C[]; +extern u8 D_80185F14[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801ABC30 = param_2; + D_801ABC34 = (param_2 >> 2) & 3; + D_801ABC38 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801ABC00 = D_80185F68; + D_801ABC04 = D_80186010; + D_801ABC08 = D_80185EC0; + } else { + D_801ABC00 = D_80185FBC; + D_801ABC04 = D_8018603C; + D_801ABC08 = D_80185F14; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801ABC38 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801ABC30 & 2) != 0) { + D_801AD034[0] = 0x140; + D_801AD034[3] = 0x80; + if (p[0x37] == 4) { + D_801AD034[0] = 0x140; + D_801AD034[3] = 0; + } + if (p[0x37] == 0) { + D_801AD034[0] = 0x140; + D_801AD034[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801ABC08)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801ABC08; +extern s16 *D_801ABC0C; +extern s32 D_801ABC1C; +extern s32 D_801ABC3C; +extern s32 D_801ABC40; +extern s32 D_801ABC44; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801ABC0C != 0) { + D_801ABC1C = 0; + p = (int *)(param_1 * 12 + (int)D_801ABC08); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801ABC3C != x) { + flag = 1; + if (D_801ABC3C < x) { + if (x - D_801ABC3C < 5) { + D_801ABC3C = x; + } else { + D_801ABC3C = D_801ABC3C + 4; + } + } else { + if (D_801ABC3C - x < 5) { + D_801ABC3C = x; + } else { + D_801ABC3C = D_801ABC3C - 4; + } + } + } + if (D_801ABC40 != y) { + flag = 1; + if (D_801ABC40 < y) { + if (y - D_801ABC40 < 5) { + D_801ABC40 = y; + } else { + D_801ABC40 = D_801ABC40 + 4; + } + } else { + if (D_801ABC40 - y < 5) { + D_801ABC40 = y; + } else { + D_801ABC40 = D_801ABC40 - 4; + } + } + } + if (D_801ABC44 != z) { + flag = 1; + if (D_801ABC44 < z) { + if (z - D_801ABC44 < 5) { + D_801ABC44 = z; + } else { + D_801ABC44 = D_801ABC44 + 4; + } + } else { + if (D_801ABC44 - z < 5) { + D_801ABC44 = z; + } else { + D_801ABC44 = D_801ABC44 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801ABC1C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801860CC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801ABC0C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801ABC3C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801ABC40); + uVar5 = (*(int*)&D_801ABC44); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801860CC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801ABC24; + +s32 func_8013E054(void) { + return D_801ABC24; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186AC8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186AA0; +extern s16 D_80186AA2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186AC8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186AA0 = 2; + D_80186AA2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186AA2 = 0; + D_80186AA0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801ABC58; + extern void * D_801ABC5C; + extern unsigned char D_80186740; + extern unsigned char D_80186758; + extern unsigned char D_801867CC; + extern unsigned char D_801867D4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801ABC58 = &D_80186740; + D_801ABC5C = &D_801867CC; + } else { + D_801ABC58 = &D_80186758; + D_801ABC5C = &D_801867D4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186AC8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186AC8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186AC8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186AA4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186AA4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186AA4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186AA0; +extern s16 D_80186AA2; +extern unsigned char D_80186AA4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186AA2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186AA0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186AA2; + if (*r < 3) { + *r = *r + 1; + } + D_80186AA0 = (u16)D_80186AA0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186AA4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186AA4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186AA4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_112/nonmatchings/ov_SC03_112_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_113/ov_SC03_113_jr_8012ACE0.c b/src/ov_SC03_113/ov_SC03_113_jr_8012ACE0.c index a9051ef68..8267f79d2 100644 --- a/src/ov_SC03_113/ov_SC03_113_jr_8012ACE0.c +++ b/src/ov_SC03_113/ov_SC03_113_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801833DC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801833DC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80183420; -extern u8 D_80183464; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80183420; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183464 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801834A8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801834E4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801834E4; - if (((s16)a1) < 0xC00) { - tbl = D_801834A8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80183520, D_80183522, D_80183524, D_80183526, D_80183528, D_8018352A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80183522 < ang)) goto outer_else; - if (!(ang < D_80183528)) goto inner_else; - if (ang < D_80183524) { *(s16 *)L = D_80183524; goto done; } - if (D_80183526 < ang) { *(s16 *)L = D_80183526; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80183520) { *(s16 *)L = D_80183520; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018352A < ang) { *(s16 *)L = D_8018352A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A4788; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A4788, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A4788; -extern s8 D_801A478C; -extern s8 D_801A478D; - -void func_8013C9C4(void * arg0) -{ - D_801A4788 = arg0; - D_801A478C = 0; - D_801A478D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A4788; -extern s8 D_801A478C; -extern s8 D_801A478D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A4788; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A478D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A478C)) * 2) + D_801A4788); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A478D = (unsigned char) p[1]; - D_801A478C = D_801A478C + 1; - if (D_801A478D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A478C = 0; - *base = 0; - } - } - else - { - D_801A478D = c - 1; - } - } - return; -} - - - -extern s32 D_801A47AC; -extern s32 D_801A47A0; -extern s32 D_801A47A4; -extern s32 D_801A47B0; - -void func_8013CABC(void) { - D_801A47AC = 1; - D_801A47A0 = 1; - D_801A47A4 = 0; - D_801A47B0 = 1; -} - - - -extern s32 D_801A47A0; -extern s32 D_801A47A4; -extern s32 D_801A47A8; -extern s32 D_801A47AC; -extern s32 D_801A47B0; - -void func_8013CAE8(void) { - D_801A47A0 = 1; - D_801A47AC = 0; - D_801A47A4 = 0; - D_801A47A8 = -1; - D_801A47B0 = 0; -} - - - -extern s32 D_801A47AC; -extern s32 D_801A47B0; -extern s32 D_801A47D8; -extern s32 D_801A47DC; - -void func_8013CB20(void) -{ - D_801A47D8 = D_801A47B0; - D_801A47DC = D_801A47AC; - D_801A47B0 = 1; - D_801A47AC = 0; -} - - - -extern s32 D_801A47D8; -extern s32 D_801A47DC; -extern s32 D_801A47B0; -extern s32 D_801A47AC; - -void func_8013CB5C(void) { - D_801A47B0 = D_801A47D8; - D_801A47AC = D_801A47DC; -} - - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A5B98; - extern u8 D_801A5B99; - extern u8 D_801A5B9A; - extern u8 D_801A5B9B; - extern u8 D_801A5B9C; - extern u8 D_801A5B9D; - extern u8 D_801A5B9E; - extern u8 D_801A5B9F; - extern u8 D_801A5BA0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A5B98; t1 = D_801A5B99; t2 = D_801A5B9A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A5B9B; t1 = D_801A5B9C; t2 = D_801A5B9D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A5B9E; t1 = D_801A5B9F; t2 = D_801A5BA0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A47B8; -extern s32 D_801A47A0; -extern s32 D_801A47BC; -extern s32 D_801A47AC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A47B8 != 0) { - if (D_801A47B8 != 2) { - if (((D_801A47B8 < 3) && (D_801A47B8 == 1)) && - (D_801A47BC = D_801A47BC + 1, 0x23a < D_801A47BC)) { - D_801A47A0 = D_801A47B8; - D_801A47B8 = 2; - } - } else { - D_801A47A0 = D_801A47A0 + -1; - if (D_801A47A0 == 0) { - D_801A47A0 = D_801A47B8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A47AC == 0) { - D_801A47B8 = D_801A47B8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A47AC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A47AC; -} - - - -extern s32 D_801A47B8; - -void func_8013D164(void) { - D_801A47B8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A5C7A; -extern u8 D_801A5CEE; -extern u8 D_801A5BA2; -extern u8 D_801A5C5C; -extern u8 D_801A5B80; -extern u8 D_801A5BA1; -extern s32 D_801A5C60; - -void func_8013D330(void) { - if ((D_801A5C7A & 0xff) != D_801A5CEE) { - D_801A5C7A = ((D_801A5C7A & 0xff) < D_801A5CEE) ? (D_801A5C7A + 1) : (D_801A5C7A - 1); - } - if ((D_801A5BA2 & 0xff) != D_801A5C5C) { - D_801A5BA2 = ((D_801A5BA2 & 0xff) < D_801A5C5C) ? (D_801A5BA2 + 1) : (D_801A5BA2 - 1); - } - if ((D_801A5B80 & 0xff) != D_801A5BA1) { - D_801A5B80 = ((D_801A5B80 & 0xff) < D_801A5BA1) ? (D_801A5B80 + 1) : (D_801A5B80 - 1); - } - D_801A5C60 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A4790; -extern void *D_801A4794; -extern void *D_801A4798; -extern s32 D_801A47C0; -extern s32 D_801A47C4; -extern s32 D_801A47C8; -extern s32 D_801A5BD4[]; - -extern u8 D_80183618[]; -extern u8 D_801836C0[]; -extern u8 D_80183570[]; -extern u8 D_8018366C[]; -extern u8 D_801836EC[]; -extern u8 D_801835C4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A47C0 = param_2; - D_801A47C4 = (param_2 >> 2) & 3; - D_801A47C8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A4790 = D_80183618; - D_801A4794 = D_801836C0; - D_801A4798 = D_80183570; - } else { - D_801A4790 = D_8018366C; - D_801A4794 = D_801836EC; - D_801A4798 = D_801835C4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A47C8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A47C0 & 2) != 0) { - D_801A5BD4[0] = 0x140; - D_801A5BD4[3] = 0x80; - if (p[0x37] == 4) { - D_801A5BD4[0] = 0x140; - D_801A5BD4[3] = 0; - } - if (p[0x37] == 0) { - D_801A5BD4[0] = 0x140; - D_801A5BD4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A4798)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A4798; -extern s16 *D_801A479C; -extern s32 D_801A47AC; -extern s32 D_801A47CC; -extern s32 D_801A47D0; -extern s32 D_801A47D4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A479C != 0) { - D_801A47AC = 0; - p = (int *)(param_1 * 12 + (int)D_801A4798); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A47CC != x) { - flag = 1; - if (D_801A47CC < x) { - if (x - D_801A47CC < 5) { - D_801A47CC = x; - } else { - D_801A47CC = D_801A47CC + 4; - } - } else { - if (D_801A47CC - x < 5) { - D_801A47CC = x; - } else { - D_801A47CC = D_801A47CC - 4; - } - } - } - if (D_801A47D0 != y) { - flag = 1; - if (D_801A47D0 < y) { - if (y - D_801A47D0 < 5) { - D_801A47D0 = y; - } else { - D_801A47D0 = D_801A47D0 + 4; - } - } else { - if (D_801A47D0 - y < 5) { - D_801A47D0 = y; - } else { - D_801A47D0 = D_801A47D0 - 4; - } - } - } - if (D_801A47D4 != z) { - flag = 1; - if (D_801A47D4 < z) { - if (z - D_801A47D4 < 5) { - D_801A47D4 = z; - } else { - D_801A47D4 = D_801A47D4 + 4; - } - } else { - if (D_801A47D4 - z < 5) { - D_801A47D4 = z; - } else { - D_801A47D4 = D_801A47D4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A47AC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018377C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A479C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A47CC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A47D0); - uVar5 = (*(int*)&D_801A47D4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018377C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A47B4; - -s32 func_8013E054(void) { - return D_801A47B4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80184178; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80184150; -extern s16 D_80184152; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80184178; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80184150 = 2; - D_80184152 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80184152 = 0; - D_80184150 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A47E8; - extern void * D_801A47EC; - extern unsigned char D_80183DF0; - extern unsigned char D_80183E08; - extern unsigned char D_80183E7C; - extern unsigned char D_80183E84; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A47E8 = &D_80183DF0; - D_801A47EC = &D_80183E7C; - } else { - D_801A47E8 = &D_80183E08; - D_801A47EC = &D_80183E84; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80184178/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184178 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80184178)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80184154; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184154)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184154)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80184150; -extern s16 D_80184152; -extern unsigned char D_80184154; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80184152` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80184150` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80184152; - if (*r < 3) { - *r = *r + 1; - } - D_80184150 = (u16)D_80184150 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184154); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80184154; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184154); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_113/ov_SC03_113_jr_801380E0.c b/src/ov_SC03_113/ov_SC03_113_jr_801380E0.c new file mode 100644 index 000000000..fb180cf62 --- /dev/null +++ b/src/ov_SC03_113/ov_SC03_113_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A34AC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80183070[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A46A4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A5C80; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A34AC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182DAC)(); +extern s16 (*D_80182DB0)(); +extern M2C_UNK (*D_80182DB8)(); +extern s32 (*D_80182DBC)(); +extern s32 D_801A46A0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A34B0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80183104; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801865E8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018311C; +extern M2C_UNK D_80183124; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018312C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80183148[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80183154[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80183168[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801831B8[]; +extern s16 D_801831E8[]; +extern s16 D_80183248[]; +extern s16 D_80183250[]; +extern s16 D_80183270[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801832A8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80183300[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80183348[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80183350[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80183358[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80183360[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80183308; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80183328; +extern void func_801321B0(int param_1); +extern int D_80183338; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A4710; +extern s32 D_801A4714[]; +extern int D_801A4718; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018336C; +extern u8 D_80183368; +extern s16 *D_80183370; +extern u8 D_80183374; +extern int D_801A4710; +extern u16 D_801A4720; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80183370; /* holds a pointer value (*(u16**)&D_80183370) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80183384[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801833D8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801833DC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801833DC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80183420; +extern u8 D_80183464; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80183420; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183464 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801834A8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801834E4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801834E4; + if (((s16)a1) < 0xC00) { + tbl = D_801834A8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80183520, D_80183522, D_80183524, D_80183526, D_80183528, D_8018352A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183522 < ang)) goto outer_else; + if (!(ang < D_80183528)) goto inner_else; + if (ang < D_80183524) { *(s16 *)L = D_80183524; goto done; } + if (D_80183526 < ang) { *(s16 *)L = D_80183526; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183520) { *(s16 *)L = D_80183520; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018352A < ang) { *(s16 *)L = D_8018352A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A4788; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A4788, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A4788; +extern s8 D_801A478C; +extern s8 D_801A478D; + +void func_8013C9C4(void * arg0) +{ + D_801A4788 = arg0; + D_801A478C = 0; + D_801A478D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A4788; +extern s8 D_801A478C; +extern s8 D_801A478D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A4788; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A478D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A478C)) * 2) + D_801A4788); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A478D = (unsigned char) p[1]; + D_801A478C = D_801A478C + 1; + if (D_801A478D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A478C = 0; + *base = 0; + } + } + else + { + D_801A478D = c - 1; + } + } + return; +} + + + +extern s32 D_801A47AC; +extern s32 D_801A47A0; +extern s32 D_801A47A4; +extern s32 D_801A47B0; + +void func_8013CABC(void) { + D_801A47AC = 1; + D_801A47A0 = 1; + D_801A47A4 = 0; + D_801A47B0 = 1; +} + + + +extern s32 D_801A47A0; +extern s32 D_801A47A4; +extern s32 D_801A47A8; +extern s32 D_801A47AC; +extern s32 D_801A47B0; + +void func_8013CAE8(void) { + D_801A47A0 = 1; + D_801A47AC = 0; + D_801A47A4 = 0; + D_801A47A8 = -1; + D_801A47B0 = 0; +} + + + +extern s32 D_801A47AC; +extern s32 D_801A47B0; +extern s32 D_801A47D8; +extern s32 D_801A47DC; + +void func_8013CB20(void) +{ + D_801A47D8 = D_801A47B0; + D_801A47DC = D_801A47AC; + D_801A47B0 = 1; + D_801A47AC = 0; +} + + + +extern s32 D_801A47D8; +extern s32 D_801A47DC; +extern s32 D_801A47B0; +extern s32 D_801A47AC; + +void func_8013CB5C(void) { + D_801A47B0 = D_801A47D8; + D_801A47AC = D_801A47DC; +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A5B98; + extern u8 D_801A5B99; + extern u8 D_801A5B9A; + extern u8 D_801A5B9B; + extern u8 D_801A5B9C; + extern u8 D_801A5B9D; + extern u8 D_801A5B9E; + extern u8 D_801A5B9F; + extern u8 D_801A5BA0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A5B98; t1 = D_801A5B99; t2 = D_801A5B9A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A5B9B; t1 = D_801A5B9C; t2 = D_801A5B9D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A5B9E; t1 = D_801A5B9F; t2 = D_801A5BA0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A47B8; +extern s32 D_801A47A0; +extern s32 D_801A47BC; +extern s32 D_801A47AC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A47B8 != 0) { + if (D_801A47B8 != 2) { + if (((D_801A47B8 < 3) && (D_801A47B8 == 1)) && + (D_801A47BC = D_801A47BC + 1, 0x23a < D_801A47BC)) { + D_801A47A0 = D_801A47B8; + D_801A47B8 = 2; + } + } else { + D_801A47A0 = D_801A47A0 + -1; + if (D_801A47A0 == 0) { + D_801A47A0 = D_801A47B8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A47AC == 0) { + D_801A47B8 = D_801A47B8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A47AC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A47AC; +} + + + +extern s32 D_801A47B8; + +void func_8013D164(void) { + D_801A47B8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A5C7A; +extern u8 D_801A5CEE; +extern u8 D_801A5BA2; +extern u8 D_801A5C5C; +extern u8 D_801A5B80; +extern u8 D_801A5BA1; +extern s32 D_801A5C60; + +void func_8013D330(void) { + if ((D_801A5C7A & 0xff) != D_801A5CEE) { + D_801A5C7A = ((D_801A5C7A & 0xff) < D_801A5CEE) ? (D_801A5C7A + 1) : (D_801A5C7A - 1); + } + if ((D_801A5BA2 & 0xff) != D_801A5C5C) { + D_801A5BA2 = ((D_801A5BA2 & 0xff) < D_801A5C5C) ? (D_801A5BA2 + 1) : (D_801A5BA2 - 1); + } + if ((D_801A5B80 & 0xff) != D_801A5BA1) { + D_801A5B80 = ((D_801A5B80 & 0xff) < D_801A5BA1) ? (D_801A5B80 + 1) : (D_801A5B80 - 1); + } + D_801A5C60 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A4790; +extern void *D_801A4794; +extern void *D_801A4798; +extern s32 D_801A47C0; +extern s32 D_801A47C4; +extern s32 D_801A47C8; +extern s32 D_801A5BD4[]; + +extern u8 D_80183618[]; +extern u8 D_801836C0[]; +extern u8 D_80183570[]; +extern u8 D_8018366C[]; +extern u8 D_801836EC[]; +extern u8 D_801835C4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A47C0 = param_2; + D_801A47C4 = (param_2 >> 2) & 3; + D_801A47C8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A4790 = D_80183618; + D_801A4794 = D_801836C0; + D_801A4798 = D_80183570; + } else { + D_801A4790 = D_8018366C; + D_801A4794 = D_801836EC; + D_801A4798 = D_801835C4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A47C8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A47C0 & 2) != 0) { + D_801A5BD4[0] = 0x140; + D_801A5BD4[3] = 0x80; + if (p[0x37] == 4) { + D_801A5BD4[0] = 0x140; + D_801A5BD4[3] = 0; + } + if (p[0x37] == 0) { + D_801A5BD4[0] = 0x140; + D_801A5BD4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A4798)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A4798; +extern s16 *D_801A479C; +extern s32 D_801A47AC; +extern s32 D_801A47CC; +extern s32 D_801A47D0; +extern s32 D_801A47D4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A479C != 0) { + D_801A47AC = 0; + p = (int *)(param_1 * 12 + (int)D_801A4798); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A47CC != x) { + flag = 1; + if (D_801A47CC < x) { + if (x - D_801A47CC < 5) { + D_801A47CC = x; + } else { + D_801A47CC = D_801A47CC + 4; + } + } else { + if (D_801A47CC - x < 5) { + D_801A47CC = x; + } else { + D_801A47CC = D_801A47CC - 4; + } + } + } + if (D_801A47D0 != y) { + flag = 1; + if (D_801A47D0 < y) { + if (y - D_801A47D0 < 5) { + D_801A47D0 = y; + } else { + D_801A47D0 = D_801A47D0 + 4; + } + } else { + if (D_801A47D0 - y < 5) { + D_801A47D0 = y; + } else { + D_801A47D0 = D_801A47D0 - 4; + } + } + } + if (D_801A47D4 != z) { + flag = 1; + if (D_801A47D4 < z) { + if (z - D_801A47D4 < 5) { + D_801A47D4 = z; + } else { + D_801A47D4 = D_801A47D4 + 4; + } + } else { + if (D_801A47D4 - z < 5) { + D_801A47D4 = z; + } else { + D_801A47D4 = D_801A47D4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A47AC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018377C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A479C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A47CC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A47D0); + uVar5 = (*(int*)&D_801A47D4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018377C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A47B4; + +s32 func_8013E054(void) { + return D_801A47B4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80184178; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80184150; +extern s16 D_80184152; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80184178; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80184150 = 2; + D_80184152 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80184152 = 0; + D_80184150 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A47E8; + extern void * D_801A47EC; + extern unsigned char D_80183DF0; + extern unsigned char D_80183E08; + extern unsigned char D_80183E7C; + extern unsigned char D_80183E84; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A47E8 = &D_80183DF0; + D_801A47EC = &D_80183E7C; + } else { + D_801A47E8 = &D_80183E08; + D_801A47EC = &D_80183E84; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80184178/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184178 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80184178)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80184154; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184154)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184154)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80184150; +extern s16 D_80184152; +extern unsigned char D_80184154; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80184152` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80184150` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80184152; + if (*r < 3) { + *r = *r + 1; + } + D_80184150 = (u16)D_80184150 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184154); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80184154; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184154); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_113/nonmatchings/ov_SC03_113_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_114/ov_SC03_114_jr_8012ACE0.c b/src/ov_SC03_114/ov_SC03_114_jr_8012ACE0.c index 90689b4eb..109b6bfa7 100644 --- a/src/ov_SC03_114/ov_SC03_114_jr_8012ACE0.c +++ b/src/ov_SC03_114/ov_SC03_114_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F044[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F044[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F088; -extern u8 D_8017F0CC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F088; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F0CC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F110[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F14C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F14C; - if (((s16)a1) < 0xC00) { - tbl = D_8017F110; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F188, D_8017F18A, D_8017F18C, D_8017F18E, D_8017F190, D_8017F192; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F18A < ang)) goto outer_else; - if (!(ang < D_8017F190)) goto inner_else; - if (ang < D_8017F18C) { *(s16 *)L = D_8017F18C; goto done; } - if (D_8017F18E < ang) { *(s16 *)L = D_8017F18E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F188) { *(s16 *)L = D_8017F188; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F192 < ang) { *(s16 *)L = D_8017F192; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A8420; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A8420, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A8420; -extern s8 D_801A8424; -extern s8 D_801A8425; - -void func_8013C9C4(void * arg0) -{ - D_801A8420 = arg0; - D_801A8424 = 0; - D_801A8425 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A8420; -extern s8 D_801A8424; -extern s8 D_801A8425; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A8420; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A8425; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A8424)) * 2) + D_801A8420); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A8425 = (unsigned char) p[1]; - D_801A8424 = D_801A8424 + 1; - if (D_801A8425 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A8424 = 0; - *base = 0; - } - } - else - { - D_801A8425 = c - 1; - } - } - return; -} - - - -extern s32 D_801A8444; -extern s32 D_801A8438; -extern s32 D_801A843C; -extern s32 D_801A8448; - -void func_8013CABC(void) { - D_801A8444 = 1; - D_801A8438 = 1; - D_801A843C = 0; - D_801A8448 = 1; -} - - - -extern s32 D_801A8438; -extern s32 D_801A843C; -extern s32 D_801A8440; -extern s32 D_801A8444; -extern s32 D_801A8448; - -void func_8013CAE8(void) { - D_801A8438 = 1; - D_801A8444 = 0; - D_801A843C = 0; - D_801A8440 = -1; - D_801A8448 = 0; -} - - - -extern s32 D_801A8444; -extern s32 D_801A8448; -extern s32 D_801A8470; -extern s32 D_801A8474; - -void func_8013CB20(void) -{ - D_801A8470 = D_801A8448; - D_801A8474 = D_801A8444; - D_801A8448 = 1; - D_801A8444 = 0; -} - - - -extern s32 D_801A8470; -extern s32 D_801A8474; -extern s32 D_801A8448; -extern s32 D_801A8444; - -void func_8013CB5C(void) { - D_801A8448 = D_801A8470; - D_801A8444 = D_801A8474; -} - - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A9710; - extern u8 D_801A9711; - extern u8 D_801A9712; - extern u8 D_801A9713; - extern u8 D_801A9714; - extern u8 D_801A9715; - extern u8 D_801A9716; - extern u8 D_801A9717; - extern u8 D_801A9718; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A9710; t1 = D_801A9711; t2 = D_801A9712; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A9713; t1 = D_801A9714; t2 = D_801A9715; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A9716; t1 = D_801A9717; t2 = D_801A9718; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A8450; -extern s32 D_801A8438; -extern s32 D_801A8454; -extern s32 D_801A8444; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A8450 != 0) { - if (D_801A8450 != 2) { - if (((D_801A8450 < 3) && (D_801A8450 == 1)) && - (D_801A8454 = D_801A8454 + 1, 0x23a < D_801A8454)) { - D_801A8438 = D_801A8450; - D_801A8450 = 2; - } - } else { - D_801A8438 = D_801A8438 + -1; - if (D_801A8438 == 0) { - D_801A8438 = D_801A8450; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A8444 == 0) { - D_801A8450 = D_801A8450 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A8444; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A8444; -} - - - -extern s32 D_801A8450; - -void func_8013D164(void) { - D_801A8450 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A97F2; -extern u8 D_801A9866; -extern u8 D_801A971A; -extern u8 D_801A97D4; -extern u8 D_801A96F8; -extern u8 D_801A9719; -extern s32 D_801A97D8; - -void func_8013D330(void) { - if ((D_801A97F2 & 0xff) != D_801A9866) { - D_801A97F2 = ((D_801A97F2 & 0xff) < D_801A9866) ? (D_801A97F2 + 1) : (D_801A97F2 - 1); - } - if ((D_801A971A & 0xff) != D_801A97D4) { - D_801A971A = ((D_801A971A & 0xff) < D_801A97D4) ? (D_801A971A + 1) : (D_801A971A - 1); - } - if ((D_801A96F8 & 0xff) != D_801A9719) { - D_801A96F8 = ((D_801A96F8 & 0xff) < D_801A9719) ? (D_801A96F8 + 1) : (D_801A96F8 - 1); - } - D_801A97D8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A8428; -extern void *D_801A842C; -extern void *D_801A8430; -extern s32 D_801A8458; -extern s32 D_801A845C; -extern s32 D_801A8460; -extern s32 D_801A974C[]; - -extern u8 D_8017F280[]; -extern u8 D_8017F328[]; -extern u8 D_8017F1D8[]; -extern u8 D_8017F2D4[]; -extern u8 D_8017F354[]; -extern u8 D_8017F22C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A8458 = param_2; - D_801A845C = (param_2 >> 2) & 3; - D_801A8460 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A8428 = D_8017F280; - D_801A842C = D_8017F328; - D_801A8430 = D_8017F1D8; - } else { - D_801A8428 = D_8017F2D4; - D_801A842C = D_8017F354; - D_801A8430 = D_8017F22C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A8460 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A8458 & 2) != 0) { - D_801A974C[0] = 0x140; - D_801A974C[3] = 0x80; - if (p[0x37] == 4) { - D_801A974C[0] = 0x140; - D_801A974C[3] = 0; - } - if (p[0x37] == 0) { - D_801A974C[0] = 0x140; - D_801A974C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A8430)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A8430; -extern s16 *D_801A8434; -extern s32 D_801A8444; -extern s32 D_801A8464; -extern s32 D_801A8468; -extern s32 D_801A846C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A8434 != 0) { - D_801A8444 = 0; - p = (int *)(param_1 * 12 + (int)D_801A8430); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A8464 != x) { - flag = 1; - if (D_801A8464 < x) { - if (x - D_801A8464 < 5) { - D_801A8464 = x; - } else { - D_801A8464 = D_801A8464 + 4; - } - } else { - if (D_801A8464 - x < 5) { - D_801A8464 = x; - } else { - D_801A8464 = D_801A8464 - 4; - } - } - } - if (D_801A8468 != y) { - flag = 1; - if (D_801A8468 < y) { - if (y - D_801A8468 < 5) { - D_801A8468 = y; - } else { - D_801A8468 = D_801A8468 + 4; - } - } else { - if (D_801A8468 - y < 5) { - D_801A8468 = y; - } else { - D_801A8468 = D_801A8468 - 4; - } - } - } - if (D_801A846C != z) { - flag = 1; - if (D_801A846C < z) { - if (z - D_801A846C < 5) { - D_801A846C = z; - } else { - D_801A846C = D_801A846C + 4; - } - } else { - if (D_801A846C - z < 5) { - D_801A846C = z; - } else { - D_801A846C = D_801A846C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A8444 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F3E4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A8434); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A8464); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A8468); - uVar5 = (*(int*)&D_801A846C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F3E4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A844C; - -s32 func_8013E054(void) { - return D_801A844C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FDE0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FDB8; -extern s16 D_8017FDBA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FDE0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FDB8 = 2; - D_8017FDBA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FDBA = 0; - D_8017FDB8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A8480; - extern void * D_801A8484; - extern unsigned char D_8017FA58; - extern unsigned char D_8017FA70; - extern unsigned char D_8017FAE4; - extern unsigned char D_8017FAEC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A8480 = &D_8017FA58; - D_801A8484 = &D_8017FAE4; - } else { - D_801A8480 = &D_8017FA70; - D_801A8484 = &D_8017FAEC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FDE0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FDE0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FDE0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FDBC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FDBC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FDBC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FDB8; -extern s16 D_8017FDBA; -extern unsigned char D_8017FDBC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FDBA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FDB8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FDBA; - if (*r < 3) { - *r = *r + 1; - } - D_8017FDB8 = (u16)D_8017FDB8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FDBC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FDBC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FDBC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_114/ov_SC03_114_jr_801380E0.c b/src/ov_SC03_114/ov_SC03_114_jr_801380E0.c new file mode 100644 index 000000000..f81d666ee --- /dev/null +++ b/src/ov_SC03_114/ov_SC03_114_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A71B8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017ECD8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A833C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A97F8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A71B8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EA14)(); +extern s16 (*D_8017EA18)(); +extern M2C_UNK (*D_8017EA20)(); +extern s32 (*D_8017EA24)(); +extern s32 D_801A8338; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A71BC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017ED6C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182250; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017ED84; +extern M2C_UNK D_8017ED8C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017ED94; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EDB0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EDBC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EDD0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EE20[]; +extern s16 D_8017EE50[]; +extern s16 D_8017EEB0[]; +extern s16 D_8017EEB8[]; +extern s16 D_8017EED8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EF10[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017EF68[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017EFB0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017EFB8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017EFC0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017EFC8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017EF70; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017EF90; +extern void func_801321B0(int param_1); +extern int D_8017EFA0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A83A8; +extern s32 D_801A83AC[]; +extern int D_801A83B0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017EFD4; +extern u8 D_8017EFD0; +extern s16 *D_8017EFD8; +extern u8 D_8017EFDC; +extern int D_801A83A8; +extern u16 D_801A83B8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017EFD8; /* holds a pointer value (*(u16**)&D_8017EFD8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017EFEC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F040; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F044[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F044[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F088; +extern u8 D_8017F0CC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F088; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F0CC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F110[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F14C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F14C; + if (((s16)a1) < 0xC00) { + tbl = D_8017F110; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F188, D_8017F18A, D_8017F18C, D_8017F18E, D_8017F190, D_8017F192; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F18A < ang)) goto outer_else; + if (!(ang < D_8017F190)) goto inner_else; + if (ang < D_8017F18C) { *(s16 *)L = D_8017F18C; goto done; } + if (D_8017F18E < ang) { *(s16 *)L = D_8017F18E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F188) { *(s16 *)L = D_8017F188; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F192 < ang) { *(s16 *)L = D_8017F192; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A8420; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A8420, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A8420; +extern s8 D_801A8424; +extern s8 D_801A8425; + +void func_8013C9C4(void * arg0) +{ + D_801A8420 = arg0; + D_801A8424 = 0; + D_801A8425 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A8420; +extern s8 D_801A8424; +extern s8 D_801A8425; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A8420; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A8425; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A8424)) * 2) + D_801A8420); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A8425 = (unsigned char) p[1]; + D_801A8424 = D_801A8424 + 1; + if (D_801A8425 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A8424 = 0; + *base = 0; + } + } + else + { + D_801A8425 = c - 1; + } + } + return; +} + + + +extern s32 D_801A8444; +extern s32 D_801A8438; +extern s32 D_801A843C; +extern s32 D_801A8448; + +void func_8013CABC(void) { + D_801A8444 = 1; + D_801A8438 = 1; + D_801A843C = 0; + D_801A8448 = 1; +} + + + +extern s32 D_801A8438; +extern s32 D_801A843C; +extern s32 D_801A8440; +extern s32 D_801A8444; +extern s32 D_801A8448; + +void func_8013CAE8(void) { + D_801A8438 = 1; + D_801A8444 = 0; + D_801A843C = 0; + D_801A8440 = -1; + D_801A8448 = 0; +} + + + +extern s32 D_801A8444; +extern s32 D_801A8448; +extern s32 D_801A8470; +extern s32 D_801A8474; + +void func_8013CB20(void) +{ + D_801A8470 = D_801A8448; + D_801A8474 = D_801A8444; + D_801A8448 = 1; + D_801A8444 = 0; +} + + + +extern s32 D_801A8470; +extern s32 D_801A8474; +extern s32 D_801A8448; +extern s32 D_801A8444; + +void func_8013CB5C(void) { + D_801A8448 = D_801A8470; + D_801A8444 = D_801A8474; +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A9710; + extern u8 D_801A9711; + extern u8 D_801A9712; + extern u8 D_801A9713; + extern u8 D_801A9714; + extern u8 D_801A9715; + extern u8 D_801A9716; + extern u8 D_801A9717; + extern u8 D_801A9718; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A9710; t1 = D_801A9711; t2 = D_801A9712; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A9713; t1 = D_801A9714; t2 = D_801A9715; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A9716; t1 = D_801A9717; t2 = D_801A9718; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A8450; +extern s32 D_801A8438; +extern s32 D_801A8454; +extern s32 D_801A8444; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A8450 != 0) { + if (D_801A8450 != 2) { + if (((D_801A8450 < 3) && (D_801A8450 == 1)) && + (D_801A8454 = D_801A8454 + 1, 0x23a < D_801A8454)) { + D_801A8438 = D_801A8450; + D_801A8450 = 2; + } + } else { + D_801A8438 = D_801A8438 + -1; + if (D_801A8438 == 0) { + D_801A8438 = D_801A8450; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A8444 == 0) { + D_801A8450 = D_801A8450 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A8444; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A8444; +} + + + +extern s32 D_801A8450; + +void func_8013D164(void) { + D_801A8450 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A97F2; +extern u8 D_801A9866; +extern u8 D_801A971A; +extern u8 D_801A97D4; +extern u8 D_801A96F8; +extern u8 D_801A9719; +extern s32 D_801A97D8; + +void func_8013D330(void) { + if ((D_801A97F2 & 0xff) != D_801A9866) { + D_801A97F2 = ((D_801A97F2 & 0xff) < D_801A9866) ? (D_801A97F2 + 1) : (D_801A97F2 - 1); + } + if ((D_801A971A & 0xff) != D_801A97D4) { + D_801A971A = ((D_801A971A & 0xff) < D_801A97D4) ? (D_801A971A + 1) : (D_801A971A - 1); + } + if ((D_801A96F8 & 0xff) != D_801A9719) { + D_801A96F8 = ((D_801A96F8 & 0xff) < D_801A9719) ? (D_801A96F8 + 1) : (D_801A96F8 - 1); + } + D_801A97D8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A8428; +extern void *D_801A842C; +extern void *D_801A8430; +extern s32 D_801A8458; +extern s32 D_801A845C; +extern s32 D_801A8460; +extern s32 D_801A974C[]; + +extern u8 D_8017F280[]; +extern u8 D_8017F328[]; +extern u8 D_8017F1D8[]; +extern u8 D_8017F2D4[]; +extern u8 D_8017F354[]; +extern u8 D_8017F22C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A8458 = param_2; + D_801A845C = (param_2 >> 2) & 3; + D_801A8460 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A8428 = D_8017F280; + D_801A842C = D_8017F328; + D_801A8430 = D_8017F1D8; + } else { + D_801A8428 = D_8017F2D4; + D_801A842C = D_8017F354; + D_801A8430 = D_8017F22C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A8460 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A8458 & 2) != 0) { + D_801A974C[0] = 0x140; + D_801A974C[3] = 0x80; + if (p[0x37] == 4) { + D_801A974C[0] = 0x140; + D_801A974C[3] = 0; + } + if (p[0x37] == 0) { + D_801A974C[0] = 0x140; + D_801A974C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A8430)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A8430; +extern s16 *D_801A8434; +extern s32 D_801A8444; +extern s32 D_801A8464; +extern s32 D_801A8468; +extern s32 D_801A846C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A8434 != 0) { + D_801A8444 = 0; + p = (int *)(param_1 * 12 + (int)D_801A8430); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A8464 != x) { + flag = 1; + if (D_801A8464 < x) { + if (x - D_801A8464 < 5) { + D_801A8464 = x; + } else { + D_801A8464 = D_801A8464 + 4; + } + } else { + if (D_801A8464 - x < 5) { + D_801A8464 = x; + } else { + D_801A8464 = D_801A8464 - 4; + } + } + } + if (D_801A8468 != y) { + flag = 1; + if (D_801A8468 < y) { + if (y - D_801A8468 < 5) { + D_801A8468 = y; + } else { + D_801A8468 = D_801A8468 + 4; + } + } else { + if (D_801A8468 - y < 5) { + D_801A8468 = y; + } else { + D_801A8468 = D_801A8468 - 4; + } + } + } + if (D_801A846C != z) { + flag = 1; + if (D_801A846C < z) { + if (z - D_801A846C < 5) { + D_801A846C = z; + } else { + D_801A846C = D_801A846C + 4; + } + } else { + if (D_801A846C - z < 5) { + D_801A846C = z; + } else { + D_801A846C = D_801A846C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A8444 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F3E4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A8434); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A8464); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A8468); + uVar5 = (*(int*)&D_801A846C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F3E4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A844C; + +s32 func_8013E054(void) { + return D_801A844C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FDE0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FDB8; +extern s16 D_8017FDBA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FDE0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FDB8 = 2; + D_8017FDBA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FDBA = 0; + D_8017FDB8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A8480; + extern void * D_801A8484; + extern unsigned char D_8017FA58; + extern unsigned char D_8017FA70; + extern unsigned char D_8017FAE4; + extern unsigned char D_8017FAEC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A8480 = &D_8017FA58; + D_801A8484 = &D_8017FAE4; + } else { + D_801A8480 = &D_8017FA70; + D_801A8484 = &D_8017FAEC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FDE0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FDE0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FDE0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FDBC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FDBC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FDBC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FDB8; +extern s16 D_8017FDBA; +extern unsigned char D_8017FDBC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FDBA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FDB8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FDBA; + if (*r < 3) { + *r = *r + 1; + } + D_8017FDB8 = (u16)D_8017FDB8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FDBC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FDBC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FDBC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_114/nonmatchings/ov_SC03_114_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_115/ov_SC03_115_jr_8012ACE0.c b/src/ov_SC03_115/ov_SC03_115_jr_8012ACE0.c index 273780f05..c513a5f8b 100644 --- a/src/ov_SC03_115/ov_SC03_115_jr_8012ACE0.c +++ b/src/ov_SC03_115/ov_SC03_115_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80180AB0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80180AB0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180AF4; -extern u8 D_80180B38; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180AF4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80180B38 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80180B7C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80180BB8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80180BB8; - if (((s16)a1) < 0xC00) { - tbl = D_80180B7C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180BF4, D_80180BF6, D_80180BF8, D_80180BFA, D_80180BFC, D_80180BFE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80180BF6 < ang)) goto outer_else; - if (!(ang < D_80180BFC)) goto inner_else; - if (ang < D_80180BF8) { *(s16 *)L = D_80180BF8; goto done; } - if (D_80180BFA < ang) { *(s16 *)L = D_80180BFA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180BF4) { *(s16 *)L = D_80180BF4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80180BFE < ang) { *(s16 *)L = D_80180BFE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80193D78; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80193D78, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80193D78; -extern s8 D_80193D7C; -extern s8 D_80193D7D; - -void func_8013C9C4(void * arg0) -{ - D_80193D78 = arg0; - D_80193D7C = 0; - D_80193D7D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80193D78; -extern s8 D_80193D7C; -extern s8 D_80193D7D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80193D78; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80193D7D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80193D7C)) * 2) + D_80193D78); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80193D7D = (unsigned char) p[1]; - D_80193D7C = D_80193D7C + 1; - if (D_80193D7D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80193D7C = 0; - *base = 0; - } - } - else - { - D_80193D7D = c - 1; - } - } - return; -} - - - -extern s32 D_80193D9C; -extern s32 D_80193D90; -extern s32 D_80193D94; -extern s32 D_80193DA0; - -void func_8013CABC(void) { - D_80193D9C = 1; - D_80193D90 = 1; - D_80193D94 = 0; - D_80193DA0 = 1; -} - - - -extern s32 D_80193D90; -extern s32 D_80193D94; -extern s32 D_80193D98; -extern s32 D_80193D9C; -extern s32 D_80193DA0; - -void func_8013CAE8(void) { - D_80193D90 = 1; - D_80193D9C = 0; - D_80193D94 = 0; - D_80193D98 = -1; - D_80193DA0 = 0; -} - - - -extern s32 D_80193D9C; -extern s32 D_80193DA0; -extern s32 D_80193DC8; -extern s32 D_80193DCC; - -void func_8013CB20(void) -{ - D_80193DC8 = D_80193DA0; - D_80193DCC = D_80193D9C; - D_80193DA0 = 1; - D_80193D9C = 0; -} - - - -extern s32 D_80193DC8; -extern s32 D_80193DCC; -extern s32 D_80193DA0; -extern s32 D_80193D9C; - -void func_8013CB5C(void) { - D_80193DA0 = D_80193DC8; - D_80193D9C = D_80193DCC; -} - - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80194FE8; - extern u8 D_80194FE9; - extern u8 D_80194FEA; - extern u8 D_80194FEB; - extern u8 D_80194FEC; - extern u8 D_80194FED; - extern u8 D_80194FEE; - extern u8 D_80194FEF; - extern u8 D_80194FF0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80194FE8; t1 = D_80194FE9; t2 = D_80194FEA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_80194FEB; t1 = D_80194FEC; t2 = D_80194FED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_80194FEE; t1 = D_80194FEF; t2 = D_80194FF0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80193DA8; -extern s32 D_80193D90; -extern s32 D_80193DAC; -extern s32 D_80193D9C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80193DA8 != 0) { - if (D_80193DA8 != 2) { - if (((D_80193DA8 < 3) && (D_80193DA8 == 1)) && - (D_80193DAC = D_80193DAC + 1, 0x23a < D_80193DAC)) { - D_80193D90 = D_80193DA8; - D_80193DA8 = 2; - } - } else { - D_80193D90 = D_80193D90 + -1; - if (D_80193D90 == 0) { - D_80193D90 = D_80193DA8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80193D9C == 0) { - D_80193DA8 = D_80193DA8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80193D9C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80193D9C; -} - - - -extern s32 D_80193DA8; - -void func_8013D164(void) { - D_80193DA8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801950CA; -extern u8 D_8019513E; -extern u8 D_80194FF2; -extern u8 D_801950AC; -extern u8 D_80194FD0; -extern u8 D_80194FF1; -extern s32 D_801950B0; - -void func_8013D330(void) { - if ((D_801950CA & 0xff) != D_8019513E) { - D_801950CA = ((D_801950CA & 0xff) < D_8019513E) ? (D_801950CA + 1) : (D_801950CA - 1); - } - if ((D_80194FF2 & 0xff) != D_801950AC) { - D_80194FF2 = ((D_80194FF2 & 0xff) < D_801950AC) ? (D_80194FF2 + 1) : (D_80194FF2 - 1); - } - if ((D_80194FD0 & 0xff) != D_80194FF1) { - D_80194FD0 = ((D_80194FD0 & 0xff) < D_80194FF1) ? (D_80194FD0 + 1) : (D_80194FD0 - 1); - } - D_801950B0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80193D80; -extern void *D_80193D84; -extern void *D_80193D88; -extern s32 D_80193DB0; -extern s32 D_80193DB4; -extern s32 D_80193DB8; -extern s32 D_80195024[]; - -extern u8 D_80180CEC[]; -extern u8 D_80180D94[]; -extern u8 D_80180C44[]; -extern u8 D_80180D40[]; -extern u8 D_80180DC0[]; -extern u8 D_80180C98[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80193DB0 = param_2; - D_80193DB4 = (param_2 >> 2) & 3; - D_80193DB8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80193D80 = D_80180CEC; - D_80193D84 = D_80180D94; - D_80193D88 = D_80180C44; - } else { - D_80193D80 = D_80180D40; - D_80193D84 = D_80180DC0; - D_80193D88 = D_80180C98; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80193DB8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80193DB0 & 2) != 0) { - D_80195024[0] = 0x140; - D_80195024[3] = 0x80; - if (p[0x37] == 4) { - D_80195024[0] = 0x140; - D_80195024[3] = 0; - } - if (p[0x37] == 0) { - D_80195024[0] = 0x140; - D_80195024[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80193D88)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80193D88; -extern s16 *D_80193D8C; -extern s32 D_80193D9C; -extern s32 D_80193DBC; -extern s32 D_80193DC0; -extern s32 D_80193DC4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80193D8C != 0) { - D_80193D9C = 0; - p = (int *)(param_1 * 12 + (int)D_80193D88); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80193DBC != x) { - flag = 1; - if (D_80193DBC < x) { - if (x - D_80193DBC < 5) { - D_80193DBC = x; - } else { - D_80193DBC = D_80193DBC + 4; - } - } else { - if (D_80193DBC - x < 5) { - D_80193DBC = x; - } else { - D_80193DBC = D_80193DBC - 4; - } - } - } - if (D_80193DC0 != y) { - flag = 1; - if (D_80193DC0 < y) { - if (y - D_80193DC0 < 5) { - D_80193DC0 = y; - } else { - D_80193DC0 = D_80193DC0 + 4; - } - } else { - if (D_80193DC0 - y < 5) { - D_80193DC0 = y; - } else { - D_80193DC0 = D_80193DC0 - 4; - } - } - } - if (D_80193DC4 != z) { - flag = 1; - if (D_80193DC4 < z) { - if (z - D_80193DC4 < 5) { - D_80193DC4 = z; - } else { - D_80193DC4 = D_80193DC4 + 4; - } - } else { - if (D_80193DC4 - z < 5) { - D_80193DC4 = z; - } else { - D_80193DC4 = D_80193DC4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80193D9C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80180E50[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80193D8C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80193DBC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80193DC0); - uVar5 = (*(int*)&D_80193DC4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80180E50); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80193DA4; - -s32 func_8013E054(void) { - return D_80193DA4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018184C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80181824; -extern s16 D_80181826; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018184C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80181824 = 2; - D_80181826 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80181826 = 0; - D_80181824 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80193DD8; - extern void * D_80193DDC; - extern unsigned char D_801814C4; - extern unsigned char D_801814DC; - extern unsigned char D_80181550; - extern unsigned char D_80181558; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80193DD8 = &D_801814C4; - D_80193DDC = &D_80181550; - } else { - D_80193DD8 = &D_801814DC; - D_80193DDC = &D_80181558; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018184C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018184C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018184C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80181828; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181828)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181828)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80181824; -extern s16 D_80181826; -extern unsigned char D_80181828; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181826` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80181824` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80181826; - if (*r < 3) { - *r = *r + 1; - } - D_80181824 = (u16)D_80181824 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181828); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80181828; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181828); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_115/ov_SC03_115_jr_801380E0.c b/src/ov_SC03_115/ov_SC03_115_jr_801380E0.c new file mode 100644 index 000000000..b38ebf845 --- /dev/null +++ b/src/ov_SC03_115/ov_SC03_115_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80192B2C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80180744[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80193C94; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801950D0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80192B2C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180480)(); +extern s16 (*D_80180484)(); +extern M2C_UNK (*D_8018048C)(); +extern s32 (*D_80180490)(); +extern s32 D_80193C90; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80192B30; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801807D8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80183CBC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801807F0; +extern M2C_UNK D_801807F8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80180800; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018081C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80180828[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018083C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018088C[]; +extern s16 D_801808BC[]; +extern s16 D_8018091C[]; +extern s16 D_80180924[]; +extern s16 D_80180944[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018097C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801809D4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80180A1C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80180A24[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80180A2C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80180A34[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801809DC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801809FC; +extern void func_801321B0(int param_1); +extern int D_80180A0C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80193D00; +extern s32 D_80193D04[]; +extern int D_80193D08; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80180A40; +extern u8 D_80180A3C; +extern s16 *D_80180A44; +extern u8 D_80180A48; +extern int D_80193D00; +extern u16 D_80193D10; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80180A44; /* holds a pointer value (*(u16**)&D_80180A44) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80180A58[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80180AAC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80180AB0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80180AB0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180AF4; +extern u8 D_80180B38; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180AF4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80180B38 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80180B7C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80180BB8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80180BB8; + if (((s16)a1) < 0xC00) { + tbl = D_80180B7C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180BF4, D_80180BF6, D_80180BF8, D_80180BFA, D_80180BFC, D_80180BFE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180BF6 < ang)) goto outer_else; + if (!(ang < D_80180BFC)) goto inner_else; + if (ang < D_80180BF8) { *(s16 *)L = D_80180BF8; goto done; } + if (D_80180BFA < ang) { *(s16 *)L = D_80180BFA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180BF4) { *(s16 *)L = D_80180BF4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180BFE < ang) { *(s16 *)L = D_80180BFE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80193D78; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80193D78, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80193D78; +extern s8 D_80193D7C; +extern s8 D_80193D7D; + +void func_8013C9C4(void * arg0) +{ + D_80193D78 = arg0; + D_80193D7C = 0; + D_80193D7D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80193D78; +extern s8 D_80193D7C; +extern s8 D_80193D7D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80193D78; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80193D7D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80193D7C)) * 2) + D_80193D78); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80193D7D = (unsigned char) p[1]; + D_80193D7C = D_80193D7C + 1; + if (D_80193D7D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80193D7C = 0; + *base = 0; + } + } + else + { + D_80193D7D = c - 1; + } + } + return; +} + + + +extern s32 D_80193D9C; +extern s32 D_80193D90; +extern s32 D_80193D94; +extern s32 D_80193DA0; + +void func_8013CABC(void) { + D_80193D9C = 1; + D_80193D90 = 1; + D_80193D94 = 0; + D_80193DA0 = 1; +} + + + +extern s32 D_80193D90; +extern s32 D_80193D94; +extern s32 D_80193D98; +extern s32 D_80193D9C; +extern s32 D_80193DA0; + +void func_8013CAE8(void) { + D_80193D90 = 1; + D_80193D9C = 0; + D_80193D94 = 0; + D_80193D98 = -1; + D_80193DA0 = 0; +} + + + +extern s32 D_80193D9C; +extern s32 D_80193DA0; +extern s32 D_80193DC8; +extern s32 D_80193DCC; + +void func_8013CB20(void) +{ + D_80193DC8 = D_80193DA0; + D_80193DCC = D_80193D9C; + D_80193DA0 = 1; + D_80193D9C = 0; +} + + + +extern s32 D_80193DC8; +extern s32 D_80193DCC; +extern s32 D_80193DA0; +extern s32 D_80193D9C; + +void func_8013CB5C(void) { + D_80193DA0 = D_80193DC8; + D_80193D9C = D_80193DCC; +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80194FE8; + extern u8 D_80194FE9; + extern u8 D_80194FEA; + extern u8 D_80194FEB; + extern u8 D_80194FEC; + extern u8 D_80194FED; + extern u8 D_80194FEE; + extern u8 D_80194FEF; + extern u8 D_80194FF0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80194FE8; t1 = D_80194FE9; t2 = D_80194FEA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_80194FEB; t1 = D_80194FEC; t2 = D_80194FED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_80194FEE; t1 = D_80194FEF; t2 = D_80194FF0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80193DA8; +extern s32 D_80193D90; +extern s32 D_80193DAC; +extern s32 D_80193D9C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80193DA8 != 0) { + if (D_80193DA8 != 2) { + if (((D_80193DA8 < 3) && (D_80193DA8 == 1)) && + (D_80193DAC = D_80193DAC + 1, 0x23a < D_80193DAC)) { + D_80193D90 = D_80193DA8; + D_80193DA8 = 2; + } + } else { + D_80193D90 = D_80193D90 + -1; + if (D_80193D90 == 0) { + D_80193D90 = D_80193DA8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80193D9C == 0) { + D_80193DA8 = D_80193DA8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80193D9C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80193D9C; +} + + + +extern s32 D_80193DA8; + +void func_8013D164(void) { + D_80193DA8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801950CA; +extern u8 D_8019513E; +extern u8 D_80194FF2; +extern u8 D_801950AC; +extern u8 D_80194FD0; +extern u8 D_80194FF1; +extern s32 D_801950B0; + +void func_8013D330(void) { + if ((D_801950CA & 0xff) != D_8019513E) { + D_801950CA = ((D_801950CA & 0xff) < D_8019513E) ? (D_801950CA + 1) : (D_801950CA - 1); + } + if ((D_80194FF2 & 0xff) != D_801950AC) { + D_80194FF2 = ((D_80194FF2 & 0xff) < D_801950AC) ? (D_80194FF2 + 1) : (D_80194FF2 - 1); + } + if ((D_80194FD0 & 0xff) != D_80194FF1) { + D_80194FD0 = ((D_80194FD0 & 0xff) < D_80194FF1) ? (D_80194FD0 + 1) : (D_80194FD0 - 1); + } + D_801950B0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80193D80; +extern void *D_80193D84; +extern void *D_80193D88; +extern s32 D_80193DB0; +extern s32 D_80193DB4; +extern s32 D_80193DB8; +extern s32 D_80195024[]; + +extern u8 D_80180CEC[]; +extern u8 D_80180D94[]; +extern u8 D_80180C44[]; +extern u8 D_80180D40[]; +extern u8 D_80180DC0[]; +extern u8 D_80180C98[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80193DB0 = param_2; + D_80193DB4 = (param_2 >> 2) & 3; + D_80193DB8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80193D80 = D_80180CEC; + D_80193D84 = D_80180D94; + D_80193D88 = D_80180C44; + } else { + D_80193D80 = D_80180D40; + D_80193D84 = D_80180DC0; + D_80193D88 = D_80180C98; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80193DB8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80193DB0 & 2) != 0) { + D_80195024[0] = 0x140; + D_80195024[3] = 0x80; + if (p[0x37] == 4) { + D_80195024[0] = 0x140; + D_80195024[3] = 0; + } + if (p[0x37] == 0) { + D_80195024[0] = 0x140; + D_80195024[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80193D88)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80193D88; +extern s16 *D_80193D8C; +extern s32 D_80193D9C; +extern s32 D_80193DBC; +extern s32 D_80193DC0; +extern s32 D_80193DC4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80193D8C != 0) { + D_80193D9C = 0; + p = (int *)(param_1 * 12 + (int)D_80193D88); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80193DBC != x) { + flag = 1; + if (D_80193DBC < x) { + if (x - D_80193DBC < 5) { + D_80193DBC = x; + } else { + D_80193DBC = D_80193DBC + 4; + } + } else { + if (D_80193DBC - x < 5) { + D_80193DBC = x; + } else { + D_80193DBC = D_80193DBC - 4; + } + } + } + if (D_80193DC0 != y) { + flag = 1; + if (D_80193DC0 < y) { + if (y - D_80193DC0 < 5) { + D_80193DC0 = y; + } else { + D_80193DC0 = D_80193DC0 + 4; + } + } else { + if (D_80193DC0 - y < 5) { + D_80193DC0 = y; + } else { + D_80193DC0 = D_80193DC0 - 4; + } + } + } + if (D_80193DC4 != z) { + flag = 1; + if (D_80193DC4 < z) { + if (z - D_80193DC4 < 5) { + D_80193DC4 = z; + } else { + D_80193DC4 = D_80193DC4 + 4; + } + } else { + if (D_80193DC4 - z < 5) { + D_80193DC4 = z; + } else { + D_80193DC4 = D_80193DC4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80193D9C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80180E50[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80193D8C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80193DBC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80193DC0); + uVar5 = (*(int*)&D_80193DC4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80180E50); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80193DA4; + +s32 func_8013E054(void) { + return D_80193DA4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018184C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80181824; +extern s16 D_80181826; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018184C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80181824 = 2; + D_80181826 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80181826 = 0; + D_80181824 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80193DD8; + extern void * D_80193DDC; + extern unsigned char D_801814C4; + extern unsigned char D_801814DC; + extern unsigned char D_80181550; + extern unsigned char D_80181558; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80193DD8 = &D_801814C4; + D_80193DDC = &D_80181550; + } else { + D_80193DD8 = &D_801814DC; + D_80193DDC = &D_80181558; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018184C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018184C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018184C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80181828; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181828)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181828)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80181824; +extern s16 D_80181826; +extern unsigned char D_80181828; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181826` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80181824` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80181826; + if (*r < 3) { + *r = *r + 1; + } + D_80181824 = (u16)D_80181824 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181828); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80181828; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181828); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_115/nonmatchings/ov_SC03_115_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_116/ov_SC03_116_jr_8012ACE0.c b/src/ov_SC03_116/ov_SC03_116_jr_8012ACE0.c index 1b050d0ea..2cc1b22a7 100644 --- a/src/ov_SC03_116/ov_SC03_116_jr_8012ACE0.c +++ b/src/ov_SC03_116/ov_SC03_116_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182EB4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182EB4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182EF8; -extern u8 D_80182F3C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182EF8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182F3C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182F80[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182FBC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182FBC; - if (((s16)a1) < 0xC00) { - tbl = D_80182F80; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182FF8, D_80182FFA, D_80182FFC, D_80182FFE, D_80183000, D_80183002; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182FFA < ang)) goto outer_else; - if (!(ang < D_80183000)) goto inner_else; - if (ang < D_80182FFC) { *(s16 *)L = D_80182FFC; goto done; } - if (D_80182FFE < ang) { *(s16 *)L = D_80182FFE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182FF8) { *(s16 *)L = D_80182FF8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80183002 < ang) { *(s16 *)L = D_80183002; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80196908; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80196908, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80196908; -extern s8 D_8019690C; -extern s8 D_8019690D; - -void func_8013C9C4(void * arg0) -{ - D_80196908 = arg0; - D_8019690C = 0; - D_8019690D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80196908; -extern s8 D_8019690C; -extern s8 D_8019690D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80196908; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019690D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019690C)) * 2) + D_80196908); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019690D = (unsigned char) p[1]; - D_8019690C = D_8019690C + 1; - if (D_8019690D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019690C = 0; - *base = 0; - } - } - else - { - D_8019690D = c - 1; - } - } - return; -} - - - -extern s32 D_8019692C; -extern s32 D_80196920; -extern s32 D_80196924; -extern s32 D_80196930; - -void func_8013CABC(void) { - D_8019692C = 1; - D_80196920 = 1; - D_80196924 = 0; - D_80196930 = 1; -} - - - -extern s32 D_80196920; -extern s32 D_80196924; -extern s32 D_80196928; -extern s32 D_8019692C; -extern s32 D_80196930; - -void func_8013CAE8(void) { - D_80196920 = 1; - D_8019692C = 0; - D_80196924 = 0; - D_80196928 = -1; - D_80196930 = 0; -} - - - -extern s32 D_8019692C; -extern s32 D_80196930; -extern s32 D_80196958; -extern s32 D_8019695C; - -void func_8013CB20(void) -{ - D_80196958 = D_80196930; - D_8019695C = D_8019692C; - D_80196930 = 1; - D_8019692C = 0; -} - - - -extern s32 D_80196958; -extern s32 D_8019695C; -extern s32 D_80196930; -extern s32 D_8019692C; - -void func_8013CB5C(void) { - D_80196930 = D_80196958; - D_8019692C = D_8019695C; -} - - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80197BF8; - extern u8 D_80197BF9; - extern u8 D_80197BFA; - extern u8 D_80197BFB; - extern u8 D_80197BFC; - extern u8 D_80197BFD; - extern u8 D_80197BFE; - extern u8 D_80197BFF; - extern u8 D_80197C00; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80197BF8; t1 = D_80197BF9; t2 = D_80197BFA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_80197BFB; t1 = D_80197BFC; t2 = D_80197BFD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_80197BFE; t1 = D_80197BFF; t2 = D_80197C00; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80196938; -extern s32 D_80196920; -extern s32 D_8019693C; -extern s32 D_8019692C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80196938 != 0) { - if (D_80196938 != 2) { - if (((D_80196938 < 3) && (D_80196938 == 1)) && - (D_8019693C = D_8019693C + 1, 0x23a < D_8019693C)) { - D_80196920 = D_80196938; - D_80196938 = 2; - } - } else { - D_80196920 = D_80196920 + -1; - if (D_80196920 == 0) { - D_80196920 = D_80196938; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019692C == 0) { - D_80196938 = D_80196938 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019692C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019692C; -} - - - -extern s32 D_80196938; - -void func_8013D164(void) { - D_80196938 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_80197CDA; -extern u8 D_80197D4E; -extern u8 D_80197C02; -extern u8 D_80197CBC; -extern u8 D_80197BE0; -extern u8 D_80197C01; -extern s32 D_80197CC0; - -void func_8013D330(void) { - if ((D_80197CDA & 0xff) != D_80197D4E) { - D_80197CDA = ((D_80197CDA & 0xff) < D_80197D4E) ? (D_80197CDA + 1) : (D_80197CDA - 1); - } - if ((D_80197C02 & 0xff) != D_80197CBC) { - D_80197C02 = ((D_80197C02 & 0xff) < D_80197CBC) ? (D_80197C02 + 1) : (D_80197C02 - 1); - } - if ((D_80197BE0 & 0xff) != D_80197C01) { - D_80197BE0 = ((D_80197BE0 & 0xff) < D_80197C01) ? (D_80197BE0 + 1) : (D_80197BE0 - 1); - } - D_80197CC0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80196910; -extern void *D_80196914; -extern void *D_80196918; -extern s32 D_80196940; -extern s32 D_80196944; -extern s32 D_80196948; -extern s32 D_80197C34[]; - -extern u8 D_801830F0[]; -extern u8 D_80183198[]; -extern u8 D_80183048[]; -extern u8 D_80183144[]; -extern u8 D_801831C4[]; -extern u8 D_8018309C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80196940 = param_2; - D_80196944 = (param_2 >> 2) & 3; - D_80196948 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80196910 = D_801830F0; - D_80196914 = D_80183198; - D_80196918 = D_80183048; - } else { - D_80196910 = D_80183144; - D_80196914 = D_801831C4; - D_80196918 = D_8018309C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80196948 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80196940 & 2) != 0) { - D_80197C34[0] = 0x140; - D_80197C34[3] = 0x80; - if (p[0x37] == 4) { - D_80197C34[0] = 0x140; - D_80197C34[3] = 0; - } - if (p[0x37] == 0) { - D_80197C34[0] = 0x140; - D_80197C34[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80196918)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80196918; -extern s16 *D_8019691C; -extern s32 D_8019692C; -extern s32 D_8019694C; -extern s32 D_80196950; -extern s32 D_80196954; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019691C != 0) { - D_8019692C = 0; - p = (int *)(param_1 * 12 + (int)D_80196918); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019694C != x) { - flag = 1; - if (D_8019694C < x) { - if (x - D_8019694C < 5) { - D_8019694C = x; - } else { - D_8019694C = D_8019694C + 4; - } - } else { - if (D_8019694C - x < 5) { - D_8019694C = x; - } else { - D_8019694C = D_8019694C - 4; - } - } - } - if (D_80196950 != y) { - flag = 1; - if (D_80196950 < y) { - if (y - D_80196950 < 5) { - D_80196950 = y; - } else { - D_80196950 = D_80196950 + 4; - } - } else { - if (D_80196950 - y < 5) { - D_80196950 = y; - } else { - D_80196950 = D_80196950 - 4; - } - } - } - if (D_80196954 != z) { - flag = 1; - if (D_80196954 < z) { - if (z - D_80196954 < 5) { - D_80196954 = z; - } else { - D_80196954 = D_80196954 + 4; - } - } else { - if (D_80196954 - z < 5) { - D_80196954 = z; - } else { - D_80196954 = D_80196954 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019692C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183254[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019691C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019694C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80196950); - uVar5 = (*(int*)&D_80196954); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183254); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80196934; - -s32 func_8013E054(void) { - return D_80196934; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183C50; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183C28; -extern s16 D_80183C2A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183C50; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183C28 = 2; - D_80183C2A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80183C2A = 0; - D_80183C28 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80196968; - extern void * D_8019696C; - extern unsigned char D_801838C8; - extern unsigned char D_801838E0; - extern unsigned char D_80183954; - extern unsigned char D_8018395C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80196968 = &D_801838C8; - D_8019696C = &D_80183954; - } else { - D_80196968 = &D_801838E0; - D_8019696C = &D_8018395C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183C50/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183C50 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183C50)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80183C2C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183C2C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183C2C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183C28; -extern s16 D_80183C2A; -extern unsigned char D_80183C2C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183C2A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183C28` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80183C2A; - if (*r < 3) { - *r = *r + 1; - } - D_80183C28 = (u16)D_80183C28 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183C2C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80183C2C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183C2C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_116/ov_SC03_116_jr_801380E0.c b/src/ov_SC03_116/ov_SC03_116_jr_801380E0.c new file mode 100644 index 000000000..8e0c289a9 --- /dev/null +++ b/src/ov_SC03_116/ov_SC03_116_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801956C8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182B48[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80196824; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80197CE0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801956C8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182884)(); +extern s16 (*D_80182888)(); +extern M2C_UNK (*D_80182890)(); +extern s32 (*D_80182894)(); +extern s32 D_80196820; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801956CC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182BDC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801860C0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80182BF4; +extern M2C_UNK D_80182BFC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182C04; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80182C20[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80182C2C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182C40[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182C90[]; +extern s16 D_80182CC0[]; +extern s16 D_80182D20[]; +extern s16 D_80182D28[]; +extern s16 D_80182D48[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182D80[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182DD8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182E20[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182E28[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182E30[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182E38[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182DE0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182E00; +extern void func_801321B0(int param_1); +extern int D_80182E10; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80196890; +extern s32 D_80196894[]; +extern int D_80196898; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182E44; +extern u8 D_80182E40; +extern s16 *D_80182E48; +extern u8 D_80182E4C; +extern int D_80196890; +extern u16 D_801968A0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182E48; /* holds a pointer value (*(u16**)&D_80182E48) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182E5C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182EB0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182EB4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182EB4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182EF8; +extern u8 D_80182F3C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182EF8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182F3C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182F80[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182FBC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182FBC; + if (((s16)a1) < 0xC00) { + tbl = D_80182F80; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182FF8, D_80182FFA, D_80182FFC, D_80182FFE, D_80183000, D_80183002; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182FFA < ang)) goto outer_else; + if (!(ang < D_80183000)) goto inner_else; + if (ang < D_80182FFC) { *(s16 *)L = D_80182FFC; goto done; } + if (D_80182FFE < ang) { *(s16 *)L = D_80182FFE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182FF8) { *(s16 *)L = D_80182FF8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183002 < ang) { *(s16 *)L = D_80183002; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80196908; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80196908, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80196908; +extern s8 D_8019690C; +extern s8 D_8019690D; + +void func_8013C9C4(void * arg0) +{ + D_80196908 = arg0; + D_8019690C = 0; + D_8019690D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80196908; +extern s8 D_8019690C; +extern s8 D_8019690D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80196908; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019690D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019690C)) * 2) + D_80196908); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019690D = (unsigned char) p[1]; + D_8019690C = D_8019690C + 1; + if (D_8019690D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019690C = 0; + *base = 0; + } + } + else + { + D_8019690D = c - 1; + } + } + return; +} + + + +extern s32 D_8019692C; +extern s32 D_80196920; +extern s32 D_80196924; +extern s32 D_80196930; + +void func_8013CABC(void) { + D_8019692C = 1; + D_80196920 = 1; + D_80196924 = 0; + D_80196930 = 1; +} + + + +extern s32 D_80196920; +extern s32 D_80196924; +extern s32 D_80196928; +extern s32 D_8019692C; +extern s32 D_80196930; + +void func_8013CAE8(void) { + D_80196920 = 1; + D_8019692C = 0; + D_80196924 = 0; + D_80196928 = -1; + D_80196930 = 0; +} + + + +extern s32 D_8019692C; +extern s32 D_80196930; +extern s32 D_80196958; +extern s32 D_8019695C; + +void func_8013CB20(void) +{ + D_80196958 = D_80196930; + D_8019695C = D_8019692C; + D_80196930 = 1; + D_8019692C = 0; +} + + + +extern s32 D_80196958; +extern s32 D_8019695C; +extern s32 D_80196930; +extern s32 D_8019692C; + +void func_8013CB5C(void) { + D_80196930 = D_80196958; + D_8019692C = D_8019695C; +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80197BF8; + extern u8 D_80197BF9; + extern u8 D_80197BFA; + extern u8 D_80197BFB; + extern u8 D_80197BFC; + extern u8 D_80197BFD; + extern u8 D_80197BFE; + extern u8 D_80197BFF; + extern u8 D_80197C00; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80197BF8; t1 = D_80197BF9; t2 = D_80197BFA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_80197BFB; t1 = D_80197BFC; t2 = D_80197BFD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_80197BFE; t1 = D_80197BFF; t2 = D_80197C00; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80196938; +extern s32 D_80196920; +extern s32 D_8019693C; +extern s32 D_8019692C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80196938 != 0) { + if (D_80196938 != 2) { + if (((D_80196938 < 3) && (D_80196938 == 1)) && + (D_8019693C = D_8019693C + 1, 0x23a < D_8019693C)) { + D_80196920 = D_80196938; + D_80196938 = 2; + } + } else { + D_80196920 = D_80196920 + -1; + if (D_80196920 == 0) { + D_80196920 = D_80196938; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019692C == 0) { + D_80196938 = D_80196938 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019692C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019692C; +} + + + +extern s32 D_80196938; + +void func_8013D164(void) { + D_80196938 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_80197CDA; +extern u8 D_80197D4E; +extern u8 D_80197C02; +extern u8 D_80197CBC; +extern u8 D_80197BE0; +extern u8 D_80197C01; +extern s32 D_80197CC0; + +void func_8013D330(void) { + if ((D_80197CDA & 0xff) != D_80197D4E) { + D_80197CDA = ((D_80197CDA & 0xff) < D_80197D4E) ? (D_80197CDA + 1) : (D_80197CDA - 1); + } + if ((D_80197C02 & 0xff) != D_80197CBC) { + D_80197C02 = ((D_80197C02 & 0xff) < D_80197CBC) ? (D_80197C02 + 1) : (D_80197C02 - 1); + } + if ((D_80197BE0 & 0xff) != D_80197C01) { + D_80197BE0 = ((D_80197BE0 & 0xff) < D_80197C01) ? (D_80197BE0 + 1) : (D_80197BE0 - 1); + } + D_80197CC0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80196910; +extern void *D_80196914; +extern void *D_80196918; +extern s32 D_80196940; +extern s32 D_80196944; +extern s32 D_80196948; +extern s32 D_80197C34[]; + +extern u8 D_801830F0[]; +extern u8 D_80183198[]; +extern u8 D_80183048[]; +extern u8 D_80183144[]; +extern u8 D_801831C4[]; +extern u8 D_8018309C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80196940 = param_2; + D_80196944 = (param_2 >> 2) & 3; + D_80196948 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80196910 = D_801830F0; + D_80196914 = D_80183198; + D_80196918 = D_80183048; + } else { + D_80196910 = D_80183144; + D_80196914 = D_801831C4; + D_80196918 = D_8018309C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80196948 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80196940 & 2) != 0) { + D_80197C34[0] = 0x140; + D_80197C34[3] = 0x80; + if (p[0x37] == 4) { + D_80197C34[0] = 0x140; + D_80197C34[3] = 0; + } + if (p[0x37] == 0) { + D_80197C34[0] = 0x140; + D_80197C34[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80196918)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80196918; +extern s16 *D_8019691C; +extern s32 D_8019692C; +extern s32 D_8019694C; +extern s32 D_80196950; +extern s32 D_80196954; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019691C != 0) { + D_8019692C = 0; + p = (int *)(param_1 * 12 + (int)D_80196918); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019694C != x) { + flag = 1; + if (D_8019694C < x) { + if (x - D_8019694C < 5) { + D_8019694C = x; + } else { + D_8019694C = D_8019694C + 4; + } + } else { + if (D_8019694C - x < 5) { + D_8019694C = x; + } else { + D_8019694C = D_8019694C - 4; + } + } + } + if (D_80196950 != y) { + flag = 1; + if (D_80196950 < y) { + if (y - D_80196950 < 5) { + D_80196950 = y; + } else { + D_80196950 = D_80196950 + 4; + } + } else { + if (D_80196950 - y < 5) { + D_80196950 = y; + } else { + D_80196950 = D_80196950 - 4; + } + } + } + if (D_80196954 != z) { + flag = 1; + if (D_80196954 < z) { + if (z - D_80196954 < 5) { + D_80196954 = z; + } else { + D_80196954 = D_80196954 + 4; + } + } else { + if (D_80196954 - z < 5) { + D_80196954 = z; + } else { + D_80196954 = D_80196954 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019692C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183254[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019691C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019694C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80196950); + uVar5 = (*(int*)&D_80196954); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183254); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80196934; + +s32 func_8013E054(void) { + return D_80196934; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183C50; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183C28; +extern s16 D_80183C2A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183C50; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183C28 = 2; + D_80183C2A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80183C2A = 0; + D_80183C28 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80196968; + extern void * D_8019696C; + extern unsigned char D_801838C8; + extern unsigned char D_801838E0; + extern unsigned char D_80183954; + extern unsigned char D_8018395C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80196968 = &D_801838C8; + D_8019696C = &D_80183954; + } else { + D_80196968 = &D_801838E0; + D_8019696C = &D_8018395C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183C50/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183C50 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183C50)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80183C2C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183C2C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183C2C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183C28; +extern s16 D_80183C2A; +extern unsigned char D_80183C2C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183C2A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183C28` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80183C2A; + if (*r < 3) { + *r = *r + 1; + } + D_80183C28 = (u16)D_80183C28 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183C2C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80183C2C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183C2C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_117/ov_SC03_117_jr_8012ACE0.c b/src/ov_SC03_117/ov_SC03_117_jr_8012ACE0.c index a513a794c..14f3a5aed 100644 --- a/src/ov_SC03_117/ov_SC03_117_jr_8012ACE0.c +++ b/src/ov_SC03_117/ov_SC03_117_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184EC0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184EC0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184F04; -extern u8 D_80184F48; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184F04; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184F48 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184F8C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80184FC8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80184FC8; - if (((s16)a1) < 0xC00) { - tbl = D_80184F8C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185004, D_80185006, D_80185008, D_8018500A, D_8018500C, D_8018500E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185006 < ang)) goto outer_else; - if (!(ang < D_8018500C)) goto inner_else; - if (ang < D_80185008) { *(s16 *)L = D_80185008; goto done; } - if (D_8018500A < ang) { *(s16 *)L = D_8018500A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185004) { *(s16 *)L = D_80185004; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018500E < ang) { *(s16 *)L = D_8018500E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CD080; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CD080, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CD080; -extern s8 D_801CD084; -extern s8 D_801CD085; - -void func_8013C9C4(void * arg0) -{ - D_801CD080 = arg0; - D_801CD084 = 0; - D_801CD085 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CD080; -extern s8 D_801CD084; -extern s8 D_801CD085; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CD080; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CD085; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CD084)) * 2) + D_801CD080); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CD085 = (unsigned char) p[1]; - D_801CD084 = D_801CD084 + 1; - if (D_801CD085 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CD084 = 0; - *base = 0; - } - } - else - { - D_801CD085 = c - 1; - } - } - return; -} - - - -extern s32 D_801CD0A4; -extern s32 D_801CD098; -extern s32 D_801CD09C; -extern s32 D_801CD0A8; - -void func_8013CABC(void) { - D_801CD0A4 = 1; - D_801CD098 = 1; - D_801CD09C = 0; - D_801CD0A8 = 1; -} - - - -extern s32 D_801CD098; -extern s32 D_801CD09C; -extern s32 D_801CD0A0; -extern s32 D_801CD0A4; -extern s32 D_801CD0A8; - -void func_8013CAE8(void) { - D_801CD098 = 1; - D_801CD0A4 = 0; - D_801CD09C = 0; - D_801CD0A0 = -1; - D_801CD0A8 = 0; -} - - - -extern s32 D_801CD0A4; -extern s32 D_801CD0A8; -extern s32 D_801CD0D0; -extern s32 D_801CD0D4; - -void func_8013CB20(void) -{ - D_801CD0D0 = D_801CD0A8; - D_801CD0D4 = D_801CD0A4; - D_801CD0A8 = 1; - D_801CD0A4 = 0; -} - - - -extern s32 D_801CD0D0; -extern s32 D_801CD0D4; -extern s32 D_801CD0A8; -extern s32 D_801CD0A4; - -void func_8013CB5C(void) { - D_801CD0A8 = D_801CD0D0; - D_801CD0A4 = D_801CD0D4; -} - - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801CE7F0; - extern u8 D_801CE7F1; - extern u8 D_801CE7F2; - extern u8 D_801CE7F3; - extern u8 D_801CE7F4; - extern u8 D_801CE7F5; - extern u8 D_801CE7F6; - extern u8 D_801CE7F7; - extern u8 D_801CE7F8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801CE7F0; t1 = D_801CE7F1; t2 = D_801CE7F2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801CE7F3; t1 = D_801CE7F4; t2 = D_801CE7F5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801CE7F6; t1 = D_801CE7F7; t2 = D_801CE7F8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CD0B0; -extern s32 D_801CD098; -extern s32 D_801CD0B4; -extern s32 D_801CD0A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CD0B0 != 0) { - if (D_801CD0B0 != 2) { - if (((D_801CD0B0 < 3) && (D_801CD0B0 == 1)) && - (D_801CD0B4 = D_801CD0B4 + 1, 0x23a < D_801CD0B4)) { - D_801CD098 = D_801CD0B0; - D_801CD0B0 = 2; - } - } else { - D_801CD098 = D_801CD098 + -1; - if (D_801CD098 == 0) { - D_801CD098 = D_801CD0B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CD0A4 == 0) { - D_801CD0B0 = D_801CD0B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CD0A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CD0A4; -} - - - -extern s32 D_801CD0B0; - -void func_8013D164(void) { - D_801CD0B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801CE8D2; -extern u8 D_801CE946; -extern u8 D_801CE7FA; -extern u8 D_801CE8B4; -extern u8 D_801CE7D8; -extern u8 D_801CE7F9; -extern s32 D_801CE8B8; - -void func_8013D330(void) { - if ((D_801CE8D2 & 0xff) != D_801CE946) { - D_801CE8D2 = ((D_801CE8D2 & 0xff) < D_801CE946) ? (D_801CE8D2 + 1) : (D_801CE8D2 - 1); - } - if ((D_801CE7FA & 0xff) != D_801CE8B4) { - D_801CE7FA = ((D_801CE7FA & 0xff) < D_801CE8B4) ? (D_801CE7FA + 1) : (D_801CE7FA - 1); - } - if ((D_801CE7D8 & 0xff) != D_801CE7F9) { - D_801CE7D8 = ((D_801CE7D8 & 0xff) < D_801CE7F9) ? (D_801CE7D8 + 1) : (D_801CE7D8 - 1); - } - D_801CE8B8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CD088; -extern void *D_801CD08C; -extern void *D_801CD090; -extern s32 D_801CD0B8; -extern s32 D_801CD0BC; -extern s32 D_801CD0C0; -extern s32 D_801CE82C[]; - -extern u8 D_801850FC[]; -extern u8 D_801851A4[]; -extern u8 D_80185054[]; -extern u8 D_80185150[]; -extern u8 D_801851D0[]; -extern u8 D_801850A8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CD0B8 = param_2; - D_801CD0BC = (param_2 >> 2) & 3; - D_801CD0C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CD088 = D_801850FC; - D_801CD08C = D_801851A4; - D_801CD090 = D_80185054; - } else { - D_801CD088 = D_80185150; - D_801CD08C = D_801851D0; - D_801CD090 = D_801850A8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CD0C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CD0B8 & 2) != 0) { - D_801CE82C[0] = 0x140; - D_801CE82C[3] = 0x80; - if (p[0x37] == 4) { - D_801CE82C[0] = 0x140; - D_801CE82C[3] = 0; - } - if (p[0x37] == 0) { - D_801CE82C[0] = 0x140; - D_801CE82C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CD090)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CD090; -extern s16 *D_801CD094; -extern s32 D_801CD0A4; -extern s32 D_801CD0C4; -extern s32 D_801CD0C8; -extern s32 D_801CD0CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CD094 != 0) { - D_801CD0A4 = 0; - p = (int *)(param_1 * 12 + (int)D_801CD090); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CD0C4 != x) { - flag = 1; - if (D_801CD0C4 < x) { - if (x - D_801CD0C4 < 5) { - D_801CD0C4 = x; - } else { - D_801CD0C4 = D_801CD0C4 + 4; - } - } else { - if (D_801CD0C4 - x < 5) { - D_801CD0C4 = x; - } else { - D_801CD0C4 = D_801CD0C4 - 4; - } - } - } - if (D_801CD0C8 != y) { - flag = 1; - if (D_801CD0C8 < y) { - if (y - D_801CD0C8 < 5) { - D_801CD0C8 = y; - } else { - D_801CD0C8 = D_801CD0C8 + 4; - } - } else { - if (D_801CD0C8 - y < 5) { - D_801CD0C8 = y; - } else { - D_801CD0C8 = D_801CD0C8 - 4; - } - } - } - if (D_801CD0CC != z) { - flag = 1; - if (D_801CD0CC < z) { - if (z - D_801CD0CC < 5) { - D_801CD0CC = z; - } else { - D_801CD0CC = D_801CD0CC + 4; - } - } else { - if (D_801CD0CC - z < 5) { - D_801CD0CC = z; - } else { - D_801CD0CC = D_801CD0CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CD0A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185260[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CD094); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CD0C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CD0C8); - uVar5 = (*(int*)&D_801CD0CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185260); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CD0AC; - -s32 func_8013E054(void) { - return D_801CD0AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80185C5C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80185C34; -extern s16 D_80185C36; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80185C5C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80185C34 = 2; - D_80185C36 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80185C36 = 0; - D_80185C34 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CD0E0; - extern void * D_801CD0E4; - extern unsigned char D_801858D4; - extern unsigned char D_801858EC; - extern unsigned char D_80185960; - extern unsigned char D_80185968; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CD0E0 = &D_801858D4; - D_801CD0E4 = &D_80185960; - } else { - D_801CD0E0 = &D_801858EC; - D_801CD0E4 = &D_80185968; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80185C5C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185C5C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80185C5C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80185C38; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185C38)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185C38)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80185C34; -extern s16 D_80185C36; -extern unsigned char D_80185C38; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185C36` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80185C34` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80185C36; - if (*r < 3) { - *r = *r + 1; - } - D_80185C34 = (u16)D_80185C34 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C38); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80185C38; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C38); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_117/ov_SC03_117_jr_801380E0.c b/src/ov_SC03_117/ov_SC03_117_jr_801380E0.c new file mode 100644 index 000000000..5e8c21a55 --- /dev/null +++ b/src/ov_SC03_117/ov_SC03_117_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CBD68; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184B54[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CCF9C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801CE8D8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CBD68; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184890)(); +extern s16 (*D_80184894)(); +extern M2C_UNK (*D_8018489C)(); +extern s32 (*D_801848A0)(); +extern s32 D_801CCF98; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CBD6C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80184BE8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801880CC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184C00; +extern M2C_UNK D_80184C08; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184C10; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80184C2C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80184C38[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80184C4C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184C9C[]; +extern s16 D_80184CCC[]; +extern s16 D_80184D2C[]; +extern s16 D_80184D34[]; +extern s16 D_80184D54[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184D8C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80184DE4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80184E2C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80184E34[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184E3C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184E44[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184DEC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184E0C; +extern void func_801321B0(int param_1); +extern int D_80184E1C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CD008; +extern s32 D_801CD00C[]; +extern int D_801CD010; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184E50; +extern u8 D_80184E4C; +extern s16 *D_80184E54; +extern u8 D_80184E58; +extern int D_801CD008; +extern u16 D_801CD018; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184E54; /* holds a pointer value (*(u16**)&D_80184E54) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184E68[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184EBC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184EC0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184EC0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184F04; +extern u8 D_80184F48; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184F04; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184F48 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184F8C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80184FC8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80184FC8; + if (((s16)a1) < 0xC00) { + tbl = D_80184F8C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185004, D_80185006, D_80185008, D_8018500A, D_8018500C, D_8018500E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185006 < ang)) goto outer_else; + if (!(ang < D_8018500C)) goto inner_else; + if (ang < D_80185008) { *(s16 *)L = D_80185008; goto done; } + if (D_8018500A < ang) { *(s16 *)L = D_8018500A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185004) { *(s16 *)L = D_80185004; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018500E < ang) { *(s16 *)L = D_8018500E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CD080; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CD080, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CD080; +extern s8 D_801CD084; +extern s8 D_801CD085; + +void func_8013C9C4(void * arg0) +{ + D_801CD080 = arg0; + D_801CD084 = 0; + D_801CD085 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CD080; +extern s8 D_801CD084; +extern s8 D_801CD085; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CD080; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CD085; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CD084)) * 2) + D_801CD080); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CD085 = (unsigned char) p[1]; + D_801CD084 = D_801CD084 + 1; + if (D_801CD085 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CD084 = 0; + *base = 0; + } + } + else + { + D_801CD085 = c - 1; + } + } + return; +} + + + +extern s32 D_801CD0A4; +extern s32 D_801CD098; +extern s32 D_801CD09C; +extern s32 D_801CD0A8; + +void func_8013CABC(void) { + D_801CD0A4 = 1; + D_801CD098 = 1; + D_801CD09C = 0; + D_801CD0A8 = 1; +} + + + +extern s32 D_801CD098; +extern s32 D_801CD09C; +extern s32 D_801CD0A0; +extern s32 D_801CD0A4; +extern s32 D_801CD0A8; + +void func_8013CAE8(void) { + D_801CD098 = 1; + D_801CD0A4 = 0; + D_801CD09C = 0; + D_801CD0A0 = -1; + D_801CD0A8 = 0; +} + + + +extern s32 D_801CD0A4; +extern s32 D_801CD0A8; +extern s32 D_801CD0D0; +extern s32 D_801CD0D4; + +void func_8013CB20(void) +{ + D_801CD0D0 = D_801CD0A8; + D_801CD0D4 = D_801CD0A4; + D_801CD0A8 = 1; + D_801CD0A4 = 0; +} + + + +extern s32 D_801CD0D0; +extern s32 D_801CD0D4; +extern s32 D_801CD0A8; +extern s32 D_801CD0A4; + +void func_8013CB5C(void) { + D_801CD0A8 = D_801CD0D0; + D_801CD0A4 = D_801CD0D4; +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801CE7F0; + extern u8 D_801CE7F1; + extern u8 D_801CE7F2; + extern u8 D_801CE7F3; + extern u8 D_801CE7F4; + extern u8 D_801CE7F5; + extern u8 D_801CE7F6; + extern u8 D_801CE7F7; + extern u8 D_801CE7F8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801CE7F0; t1 = D_801CE7F1; t2 = D_801CE7F2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801CE7F3; t1 = D_801CE7F4; t2 = D_801CE7F5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801CE7F6; t1 = D_801CE7F7; t2 = D_801CE7F8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CD0B0; +extern s32 D_801CD098; +extern s32 D_801CD0B4; +extern s32 D_801CD0A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CD0B0 != 0) { + if (D_801CD0B0 != 2) { + if (((D_801CD0B0 < 3) && (D_801CD0B0 == 1)) && + (D_801CD0B4 = D_801CD0B4 + 1, 0x23a < D_801CD0B4)) { + D_801CD098 = D_801CD0B0; + D_801CD0B0 = 2; + } + } else { + D_801CD098 = D_801CD098 + -1; + if (D_801CD098 == 0) { + D_801CD098 = D_801CD0B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CD0A4 == 0) { + D_801CD0B0 = D_801CD0B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CD0A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CD0A4; +} + + + +extern s32 D_801CD0B0; + +void func_8013D164(void) { + D_801CD0B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801CE8D2; +extern u8 D_801CE946; +extern u8 D_801CE7FA; +extern u8 D_801CE8B4; +extern u8 D_801CE7D8; +extern u8 D_801CE7F9; +extern s32 D_801CE8B8; + +void func_8013D330(void) { + if ((D_801CE8D2 & 0xff) != D_801CE946) { + D_801CE8D2 = ((D_801CE8D2 & 0xff) < D_801CE946) ? (D_801CE8D2 + 1) : (D_801CE8D2 - 1); + } + if ((D_801CE7FA & 0xff) != D_801CE8B4) { + D_801CE7FA = ((D_801CE7FA & 0xff) < D_801CE8B4) ? (D_801CE7FA + 1) : (D_801CE7FA - 1); + } + if ((D_801CE7D8 & 0xff) != D_801CE7F9) { + D_801CE7D8 = ((D_801CE7D8 & 0xff) < D_801CE7F9) ? (D_801CE7D8 + 1) : (D_801CE7D8 - 1); + } + D_801CE8B8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CD088; +extern void *D_801CD08C; +extern void *D_801CD090; +extern s32 D_801CD0B8; +extern s32 D_801CD0BC; +extern s32 D_801CD0C0; +extern s32 D_801CE82C[]; + +extern u8 D_801850FC[]; +extern u8 D_801851A4[]; +extern u8 D_80185054[]; +extern u8 D_80185150[]; +extern u8 D_801851D0[]; +extern u8 D_801850A8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CD0B8 = param_2; + D_801CD0BC = (param_2 >> 2) & 3; + D_801CD0C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CD088 = D_801850FC; + D_801CD08C = D_801851A4; + D_801CD090 = D_80185054; + } else { + D_801CD088 = D_80185150; + D_801CD08C = D_801851D0; + D_801CD090 = D_801850A8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CD0C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CD0B8 & 2) != 0) { + D_801CE82C[0] = 0x140; + D_801CE82C[3] = 0x80; + if (p[0x37] == 4) { + D_801CE82C[0] = 0x140; + D_801CE82C[3] = 0; + } + if (p[0x37] == 0) { + D_801CE82C[0] = 0x140; + D_801CE82C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CD090)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CD090; +extern s16 *D_801CD094; +extern s32 D_801CD0A4; +extern s32 D_801CD0C4; +extern s32 D_801CD0C8; +extern s32 D_801CD0CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CD094 != 0) { + D_801CD0A4 = 0; + p = (int *)(param_1 * 12 + (int)D_801CD090); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CD0C4 != x) { + flag = 1; + if (D_801CD0C4 < x) { + if (x - D_801CD0C4 < 5) { + D_801CD0C4 = x; + } else { + D_801CD0C4 = D_801CD0C4 + 4; + } + } else { + if (D_801CD0C4 - x < 5) { + D_801CD0C4 = x; + } else { + D_801CD0C4 = D_801CD0C4 - 4; + } + } + } + if (D_801CD0C8 != y) { + flag = 1; + if (D_801CD0C8 < y) { + if (y - D_801CD0C8 < 5) { + D_801CD0C8 = y; + } else { + D_801CD0C8 = D_801CD0C8 + 4; + } + } else { + if (D_801CD0C8 - y < 5) { + D_801CD0C8 = y; + } else { + D_801CD0C8 = D_801CD0C8 - 4; + } + } + } + if (D_801CD0CC != z) { + flag = 1; + if (D_801CD0CC < z) { + if (z - D_801CD0CC < 5) { + D_801CD0CC = z; + } else { + D_801CD0CC = D_801CD0CC + 4; + } + } else { + if (D_801CD0CC - z < 5) { + D_801CD0CC = z; + } else { + D_801CD0CC = D_801CD0CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CD0A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185260[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CD094); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CD0C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CD0C8); + uVar5 = (*(int*)&D_801CD0CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185260); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CD0AC; + +s32 func_8013E054(void) { + return D_801CD0AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80185C5C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80185C34; +extern s16 D_80185C36; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80185C5C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80185C34 = 2; + D_80185C36 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80185C36 = 0; + D_80185C34 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CD0E0; + extern void * D_801CD0E4; + extern unsigned char D_801858D4; + extern unsigned char D_801858EC; + extern unsigned char D_80185960; + extern unsigned char D_80185968; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CD0E0 = &D_801858D4; + D_801CD0E4 = &D_80185960; + } else { + D_801CD0E0 = &D_801858EC; + D_801CD0E4 = &D_80185968; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80185C5C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185C5C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80185C5C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80185C38; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185C38)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185C38)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80185C34; +extern s16 D_80185C36; +extern unsigned char D_80185C38; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185C36` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80185C34` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80185C36; + if (*r < 3) { + *r = *r + 1; + } + D_80185C34 = (u16)D_80185C34 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C38); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80185C38; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185C38); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_117/nonmatchings/ov_SC03_117_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_118/ov_SC03_118_jr_8012ACE0.c b/src/ov_SC03_118/ov_SC03_118_jr_8012ACE0.c index 8012eb2d2..5fad8cdd1 100644 --- a/src/ov_SC03_118/ov_SC03_118_jr_8012ACE0.c +++ b/src/ov_SC03_118/ov_SC03_118_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80189F6C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80189F6C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80189FB0; -extern u8 D_80189FF4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80189FB0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80189FF4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018A038[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018A074[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018A074; - if (((s16)a1) < 0xC00) { - tbl = D_8018A038; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018A0B0, D_8018A0B2, D_8018A0B4, D_8018A0B6, D_8018A0B8, D_8018A0BA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018A0B2 < ang)) goto outer_else; - if (!(ang < D_8018A0B8)) goto inner_else; - if (ang < D_8018A0B4) { *(s16 *)L = D_8018A0B4; goto done; } - if (D_8018A0B6 < ang) { *(s16 *)L = D_8018A0B6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018A0B0) { *(s16 *)L = D_8018A0B0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018A0BA < ang) { *(s16 *)L = D_8018A0BA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D2FD0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D2FD0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D2FD0; -extern s8 D_801D2FD4; -extern s8 D_801D2FD5; - -void func_8013C9C4(void * arg0) -{ - D_801D2FD0 = arg0; - D_801D2FD4 = 0; - D_801D2FD5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D2FD0; -extern s8 D_801D2FD4; -extern s8 D_801D2FD5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D2FD0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D2FD5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D2FD4)) * 2) + D_801D2FD0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D2FD5 = (unsigned char) p[1]; - D_801D2FD4 = D_801D2FD4 + 1; - if (D_801D2FD5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D2FD4 = 0; - *base = 0; - } - } - else - { - D_801D2FD5 = c - 1; - } - } - return; -} - - - -extern s32 D_801D2FF4; -extern s32 D_801D2FE8; -extern s32 D_801D2FEC; -extern s32 D_801D2FF8; - -void func_8013CABC(void) { - D_801D2FF4 = 1; - D_801D2FE8 = 1; - D_801D2FEC = 0; - D_801D2FF8 = 1; -} - - - -extern s32 D_801D2FE8; -extern s32 D_801D2FEC; -extern s32 D_801D2FF0; -extern s32 D_801D2FF4; -extern s32 D_801D2FF8; - -void func_8013CAE8(void) { - D_801D2FE8 = 1; - D_801D2FF4 = 0; - D_801D2FEC = 0; - D_801D2FF0 = -1; - D_801D2FF8 = 0; -} - - - -extern s32 D_801D2FF4; -extern s32 D_801D2FF8; -extern s32 D_801D3020; -extern s32 D_801D3024; - -void func_8013CB20(void) -{ - D_801D3020 = D_801D2FF8; - D_801D3024 = D_801D2FF4; - D_801D2FF8 = 1; - D_801D2FF4 = 0; -} - - - -extern s32 D_801D3020; -extern s32 D_801D3024; -extern s32 D_801D2FF8; -extern s32 D_801D2FF4; - -void func_8013CB5C(void) { - D_801D2FF8 = D_801D3020; - D_801D2FF4 = D_801D3024; -} - - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D46F8; - extern u8 D_801D46F9; - extern u8 D_801D46FA; - extern u8 D_801D46FB; - extern u8 D_801D46FC; - extern u8 D_801D46FD; - extern u8 D_801D46FE; - extern u8 D_801D46FF; - extern u8 D_801D4700; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D46F8; t1 = D_801D46F9; t2 = D_801D46FA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D46FB; t1 = D_801D46FC; t2 = D_801D46FD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D46FE; t1 = D_801D46FF; t2 = D_801D4700; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D3000; -extern s32 D_801D2FE8; -extern s32 D_801D3004; -extern s32 D_801D2FF4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D3000 != 0) { - if (D_801D3000 != 2) { - if (((D_801D3000 < 3) && (D_801D3000 == 1)) && - (D_801D3004 = D_801D3004 + 1, 0x23a < D_801D3004)) { - D_801D2FE8 = D_801D3000; - D_801D3000 = 2; - } - } else { - D_801D2FE8 = D_801D2FE8 + -1; - if (D_801D2FE8 == 0) { - D_801D2FE8 = D_801D3000; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D2FF4 == 0) { - D_801D3000 = D_801D3000 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D2FF4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D2FF4; -} - - - -extern s32 D_801D3000; - -void func_8013D164(void) { - D_801D3000 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D47DA; -extern u8 D_801D484E; -extern u8 D_801D4702; -extern u8 D_801D47BC; -extern u8 D_801D46E0; -extern u8 D_801D4701; -extern s32 D_801D47C0; - -void func_8013D330(void) { - if ((D_801D47DA & 0xff) != D_801D484E) { - D_801D47DA = ((D_801D47DA & 0xff) < D_801D484E) ? (D_801D47DA + 1) : (D_801D47DA - 1); - } - if ((D_801D4702 & 0xff) != D_801D47BC) { - D_801D4702 = ((D_801D4702 & 0xff) < D_801D47BC) ? (D_801D4702 + 1) : (D_801D4702 - 1); - } - if ((D_801D46E0 & 0xff) != D_801D4701) { - D_801D46E0 = ((D_801D46E0 & 0xff) < D_801D4701) ? (D_801D46E0 + 1) : (D_801D46E0 - 1); - } - D_801D47C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D2FD8; -extern void *D_801D2FDC; -extern void *D_801D2FE0; -extern s32 D_801D3008; -extern s32 D_801D300C; -extern s32 D_801D3010; -extern s32 D_801D4734[]; - -extern u8 D_8018A1A8[]; -extern u8 D_8018A250[]; -extern u8 D_8018A100[]; -extern u8 D_8018A1FC[]; -extern u8 D_8018A27C[]; -extern u8 D_8018A154[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D3008 = param_2; - D_801D300C = (param_2 >> 2) & 3; - D_801D3010 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D2FD8 = D_8018A1A8; - D_801D2FDC = D_8018A250; - D_801D2FE0 = D_8018A100; - } else { - D_801D2FD8 = D_8018A1FC; - D_801D2FDC = D_8018A27C; - D_801D2FE0 = D_8018A154; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D3010 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D3008 & 2) != 0) { - D_801D4734[0] = 0x140; - D_801D4734[3] = 0x80; - if (p[0x37] == 4) { - D_801D4734[0] = 0x140; - D_801D4734[3] = 0; - } - if (p[0x37] == 0) { - D_801D4734[0] = 0x140; - D_801D4734[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D2FE0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D2FE0; -extern s16 *D_801D2FE4; -extern s32 D_801D2FF4; -extern s32 D_801D3014; -extern s32 D_801D3018; -extern s32 D_801D301C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D2FE4 != 0) { - D_801D2FF4 = 0; - p = (int *)(param_1 * 12 + (int)D_801D2FE0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D3014 != x) { - flag = 1; - if (D_801D3014 < x) { - if (x - D_801D3014 < 5) { - D_801D3014 = x; - } else { - D_801D3014 = D_801D3014 + 4; - } - } else { - if (D_801D3014 - x < 5) { - D_801D3014 = x; - } else { - D_801D3014 = D_801D3014 - 4; - } - } - } - if (D_801D3018 != y) { - flag = 1; - if (D_801D3018 < y) { - if (y - D_801D3018 < 5) { - D_801D3018 = y; - } else { - D_801D3018 = D_801D3018 + 4; - } - } else { - if (D_801D3018 - y < 5) { - D_801D3018 = y; - } else { - D_801D3018 = D_801D3018 - 4; - } - } - } - if (D_801D301C != z) { - flag = 1; - if (D_801D301C < z) { - if (z - D_801D301C < 5) { - D_801D301C = z; - } else { - D_801D301C = D_801D301C + 4; - } - } else { - if (D_801D301C - z < 5) { - D_801D301C = z; - } else { - D_801D301C = D_801D301C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D2FF4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018A30C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D2FE4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D3014); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D3018); - uVar5 = (*(int*)&D_801D301C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018A30C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D2FFC; - -s32 func_8013E054(void) { - return D_801D2FFC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018AD08; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018ACE0; -extern s16 D_8018ACE2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018AD08; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018ACE0 = 2; - D_8018ACE2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018ACE2 = 0; - D_8018ACE0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D3030; - extern void * D_801D3034; - extern unsigned char D_8018A980; - extern unsigned char D_8018A998; - extern unsigned char D_8018AA0C; - extern unsigned char D_8018AA14; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D3030 = &D_8018A980; - D_801D3034 = &D_8018AA0C; - } else { - D_801D3030 = &D_8018A998; - D_801D3034 = &D_8018AA14; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018AD08/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018AD08 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018AD08)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018ACE4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018ACE4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018ACE4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018ACE0; -extern s16 D_8018ACE2; -extern unsigned char D_8018ACE4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018ACE2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018ACE0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018ACE2; - if (*r < 3) { - *r = *r + 1; - } - D_8018ACE0 = (u16)D_8018ACE0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018ACE4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_118/ov_SC03_118_jr_801380E0.c b/src/ov_SC03_118/ov_SC03_118_jr_801380E0.c new file mode 100644 index 000000000..0443167cd --- /dev/null +++ b/src/ov_SC03_118/ov_SC03_118_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D1CC4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80189C00[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D2EEC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D47E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D1CC4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018993C)(); +extern s16 (*D_80189940)(); +extern M2C_UNK (*D_80189948)(); +extern s32 (*D_8018994C)(); +extern s32 D_801D2EE8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D1CC8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80189C94; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018D178; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80189CAC; +extern M2C_UNK D_80189CB4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80189CBC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80189CD8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80189CE4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80189CF8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80189D48[]; +extern s16 D_80189D78[]; +extern s16 D_80189DD8[]; +extern s16 D_80189DE0[]; +extern s16 D_80189E00[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80189E38[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80189E90[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80189ED8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80189EE0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80189EE8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80189EF0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80189E98; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80189EB8; +extern void func_801321B0(int param_1); +extern int D_80189EC8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D2F58; +extern s32 D_801D2F5C[]; +extern int D_801D2F60; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80189EFC; +extern u8 D_80189EF8; +extern s16 *D_80189F00; +extern u8 D_80189F04; +extern int D_801D2F58; +extern u16 D_801D2F68; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80189F00; /* holds a pointer value (*(u16**)&D_80189F00) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80189F14[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80189F68; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80189F6C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80189F6C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80189FB0; +extern u8 D_80189FF4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80189FB0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80189FF4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018A038[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018A074[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018A074; + if (((s16)a1) < 0xC00) { + tbl = D_8018A038; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018A0B0, D_8018A0B2, D_8018A0B4, D_8018A0B6, D_8018A0B8, D_8018A0BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018A0B2 < ang)) goto outer_else; + if (!(ang < D_8018A0B8)) goto inner_else; + if (ang < D_8018A0B4) { *(s16 *)L = D_8018A0B4; goto done; } + if (D_8018A0B6 < ang) { *(s16 *)L = D_8018A0B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018A0B0) { *(s16 *)L = D_8018A0B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018A0BA < ang) { *(s16 *)L = D_8018A0BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D2FD0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D2FD0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D2FD0; +extern s8 D_801D2FD4; +extern s8 D_801D2FD5; + +void func_8013C9C4(void * arg0) +{ + D_801D2FD0 = arg0; + D_801D2FD4 = 0; + D_801D2FD5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D2FD0; +extern s8 D_801D2FD4; +extern s8 D_801D2FD5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D2FD0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D2FD5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D2FD4)) * 2) + D_801D2FD0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D2FD5 = (unsigned char) p[1]; + D_801D2FD4 = D_801D2FD4 + 1; + if (D_801D2FD5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D2FD4 = 0; + *base = 0; + } + } + else + { + D_801D2FD5 = c - 1; + } + } + return; +} + + + +extern s32 D_801D2FF4; +extern s32 D_801D2FE8; +extern s32 D_801D2FEC; +extern s32 D_801D2FF8; + +void func_8013CABC(void) { + D_801D2FF4 = 1; + D_801D2FE8 = 1; + D_801D2FEC = 0; + D_801D2FF8 = 1; +} + + + +extern s32 D_801D2FE8; +extern s32 D_801D2FEC; +extern s32 D_801D2FF0; +extern s32 D_801D2FF4; +extern s32 D_801D2FF8; + +void func_8013CAE8(void) { + D_801D2FE8 = 1; + D_801D2FF4 = 0; + D_801D2FEC = 0; + D_801D2FF0 = -1; + D_801D2FF8 = 0; +} + + + +extern s32 D_801D2FF4; +extern s32 D_801D2FF8; +extern s32 D_801D3020; +extern s32 D_801D3024; + +void func_8013CB20(void) +{ + D_801D3020 = D_801D2FF8; + D_801D3024 = D_801D2FF4; + D_801D2FF8 = 1; + D_801D2FF4 = 0; +} + + + +extern s32 D_801D3020; +extern s32 D_801D3024; +extern s32 D_801D2FF8; +extern s32 D_801D2FF4; + +void func_8013CB5C(void) { + D_801D2FF8 = D_801D3020; + D_801D2FF4 = D_801D3024; +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D46F8; + extern u8 D_801D46F9; + extern u8 D_801D46FA; + extern u8 D_801D46FB; + extern u8 D_801D46FC; + extern u8 D_801D46FD; + extern u8 D_801D46FE; + extern u8 D_801D46FF; + extern u8 D_801D4700; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D46F8; t1 = D_801D46F9; t2 = D_801D46FA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D46FB; t1 = D_801D46FC; t2 = D_801D46FD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D46FE; t1 = D_801D46FF; t2 = D_801D4700; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D3000; +extern s32 D_801D2FE8; +extern s32 D_801D3004; +extern s32 D_801D2FF4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D3000 != 0) { + if (D_801D3000 != 2) { + if (((D_801D3000 < 3) && (D_801D3000 == 1)) && + (D_801D3004 = D_801D3004 + 1, 0x23a < D_801D3004)) { + D_801D2FE8 = D_801D3000; + D_801D3000 = 2; + } + } else { + D_801D2FE8 = D_801D2FE8 + -1; + if (D_801D2FE8 == 0) { + D_801D2FE8 = D_801D3000; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D2FF4 == 0) { + D_801D3000 = D_801D3000 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D2FF4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D2FF4; +} + + + +extern s32 D_801D3000; + +void func_8013D164(void) { + D_801D3000 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D47DA; +extern u8 D_801D484E; +extern u8 D_801D4702; +extern u8 D_801D47BC; +extern u8 D_801D46E0; +extern u8 D_801D4701; +extern s32 D_801D47C0; + +void func_8013D330(void) { + if ((D_801D47DA & 0xff) != D_801D484E) { + D_801D47DA = ((D_801D47DA & 0xff) < D_801D484E) ? (D_801D47DA + 1) : (D_801D47DA - 1); + } + if ((D_801D4702 & 0xff) != D_801D47BC) { + D_801D4702 = ((D_801D4702 & 0xff) < D_801D47BC) ? (D_801D4702 + 1) : (D_801D4702 - 1); + } + if ((D_801D46E0 & 0xff) != D_801D4701) { + D_801D46E0 = ((D_801D46E0 & 0xff) < D_801D4701) ? (D_801D46E0 + 1) : (D_801D46E0 - 1); + } + D_801D47C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D2FD8; +extern void *D_801D2FDC; +extern void *D_801D2FE0; +extern s32 D_801D3008; +extern s32 D_801D300C; +extern s32 D_801D3010; +extern s32 D_801D4734[]; + +extern u8 D_8018A1A8[]; +extern u8 D_8018A250[]; +extern u8 D_8018A100[]; +extern u8 D_8018A1FC[]; +extern u8 D_8018A27C[]; +extern u8 D_8018A154[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D3008 = param_2; + D_801D300C = (param_2 >> 2) & 3; + D_801D3010 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D2FD8 = D_8018A1A8; + D_801D2FDC = D_8018A250; + D_801D2FE0 = D_8018A100; + } else { + D_801D2FD8 = D_8018A1FC; + D_801D2FDC = D_8018A27C; + D_801D2FE0 = D_8018A154; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D3010 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D3008 & 2) != 0) { + D_801D4734[0] = 0x140; + D_801D4734[3] = 0x80; + if (p[0x37] == 4) { + D_801D4734[0] = 0x140; + D_801D4734[3] = 0; + } + if (p[0x37] == 0) { + D_801D4734[0] = 0x140; + D_801D4734[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D2FE0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D2FE0; +extern s16 *D_801D2FE4; +extern s32 D_801D2FF4; +extern s32 D_801D3014; +extern s32 D_801D3018; +extern s32 D_801D301C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D2FE4 != 0) { + D_801D2FF4 = 0; + p = (int *)(param_1 * 12 + (int)D_801D2FE0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D3014 != x) { + flag = 1; + if (D_801D3014 < x) { + if (x - D_801D3014 < 5) { + D_801D3014 = x; + } else { + D_801D3014 = D_801D3014 + 4; + } + } else { + if (D_801D3014 - x < 5) { + D_801D3014 = x; + } else { + D_801D3014 = D_801D3014 - 4; + } + } + } + if (D_801D3018 != y) { + flag = 1; + if (D_801D3018 < y) { + if (y - D_801D3018 < 5) { + D_801D3018 = y; + } else { + D_801D3018 = D_801D3018 + 4; + } + } else { + if (D_801D3018 - y < 5) { + D_801D3018 = y; + } else { + D_801D3018 = D_801D3018 - 4; + } + } + } + if (D_801D301C != z) { + flag = 1; + if (D_801D301C < z) { + if (z - D_801D301C < 5) { + D_801D301C = z; + } else { + D_801D301C = D_801D301C + 4; + } + } else { + if (D_801D301C - z < 5) { + D_801D301C = z; + } else { + D_801D301C = D_801D301C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D2FF4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018A30C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D2FE4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D3014); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D3018); + uVar5 = (*(int*)&D_801D301C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018A30C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D2FFC; + +s32 func_8013E054(void) { + return D_801D2FFC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018AD08; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018ACE0; +extern s16 D_8018ACE2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018AD08; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018ACE0 = 2; + D_8018ACE2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018ACE2 = 0; + D_8018ACE0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D3030; + extern void * D_801D3034; + extern unsigned char D_8018A980; + extern unsigned char D_8018A998; + extern unsigned char D_8018AA0C; + extern unsigned char D_8018AA14; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D3030 = &D_8018A980; + D_801D3034 = &D_8018AA0C; + } else { + D_801D3030 = &D_8018A998; + D_801D3034 = &D_8018AA14; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018AD08/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018AD08 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018AD08)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018ACE4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018ACE4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018ACE4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018ACE0; +extern s16 D_8018ACE2; +extern unsigned char D_8018ACE4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018ACE2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018ACE0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018ACE2; + if (*r < 3) { + *r = *r + 1; + } + D_8018ACE0 = (u16)D_8018ACE0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018ACE4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_118/nonmatchings/ov_SC03_118_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_119/ov_SC03_119_jr_8012ACE0.c b/src/ov_SC03_119/ov_SC03_119_jr_8012ACE0.c index a17d8893f..60f2dcc92 100644 --- a/src/ov_SC03_119/ov_SC03_119_jr_8012ACE0.c +++ b/src/ov_SC03_119/ov_SC03_119_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80189F6C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80189F6C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80189FB0; -extern u8 D_80189FF4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80189FB0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80189FF4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018A038[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018A074[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018A074; - if (((s16)a1) < 0xC00) { - tbl = D_8018A038; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018A0B0, D_8018A0B2, D_8018A0B4, D_8018A0B6, D_8018A0B8, D_8018A0BA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018A0B2 < ang)) goto outer_else; - if (!(ang < D_8018A0B8)) goto inner_else; - if (ang < D_8018A0B4) { *(s16 *)L = D_8018A0B4; goto done; } - if (D_8018A0B6 < ang) { *(s16 *)L = D_8018A0B6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018A0B0) { *(s16 *)L = D_8018A0B0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018A0BA < ang) { *(s16 *)L = D_8018A0BA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D2FD0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D2FD0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D2FD0; -extern s8 D_801D2FD4; -extern s8 D_801D2FD5; - -void func_8013C9C4(void * arg0) -{ - D_801D2FD0 = arg0; - D_801D2FD4 = 0; - D_801D2FD5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D2FD0; -extern s8 D_801D2FD4; -extern s8 D_801D2FD5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D2FD0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D2FD5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D2FD4)) * 2) + D_801D2FD0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D2FD5 = (unsigned char) p[1]; - D_801D2FD4 = D_801D2FD4 + 1; - if (D_801D2FD5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D2FD4 = 0; - *base = 0; - } - } - else - { - D_801D2FD5 = c - 1; - } - } - return; -} - - - -extern s32 D_801D2FF4; -extern s32 D_801D2FE8; -extern s32 D_801D2FEC; -extern s32 D_801D2FF8; - -void func_8013CABC(void) { - D_801D2FF4 = 1; - D_801D2FE8 = 1; - D_801D2FEC = 0; - D_801D2FF8 = 1; -} - - - -extern s32 D_801D2FE8; -extern s32 D_801D2FEC; -extern s32 D_801D2FF0; -extern s32 D_801D2FF4; -extern s32 D_801D2FF8; - -void func_8013CAE8(void) { - D_801D2FE8 = 1; - D_801D2FF4 = 0; - D_801D2FEC = 0; - D_801D2FF0 = -1; - D_801D2FF8 = 0; -} - - - -extern s32 D_801D2FF4; -extern s32 D_801D2FF8; -extern s32 D_801D3020; -extern s32 D_801D3024; - -void func_8013CB20(void) -{ - D_801D3020 = D_801D2FF8; - D_801D3024 = D_801D2FF4; - D_801D2FF8 = 1; - D_801D2FF4 = 0; -} - - - -extern s32 D_801D3020; -extern s32 D_801D3024; -extern s32 D_801D2FF8; -extern s32 D_801D2FF4; - -void func_8013CB5C(void) { - D_801D2FF8 = D_801D3020; - D_801D2FF4 = D_801D3024; -} - - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D46F8; - extern u8 D_801D46F9; - extern u8 D_801D46FA; - extern u8 D_801D46FB; - extern u8 D_801D46FC; - extern u8 D_801D46FD; - extern u8 D_801D46FE; - extern u8 D_801D46FF; - extern u8 D_801D4700; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D46F8; t1 = D_801D46F9; t2 = D_801D46FA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D46FB; t1 = D_801D46FC; t2 = D_801D46FD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D46FE; t1 = D_801D46FF; t2 = D_801D4700; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D3000; -extern s32 D_801D2FE8; -extern s32 D_801D3004; -extern s32 D_801D2FF4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D3000 != 0) { - if (D_801D3000 != 2) { - if (((D_801D3000 < 3) && (D_801D3000 == 1)) && - (D_801D3004 = D_801D3004 + 1, 0x23a < D_801D3004)) { - D_801D2FE8 = D_801D3000; - D_801D3000 = 2; - } - } else { - D_801D2FE8 = D_801D2FE8 + -1; - if (D_801D2FE8 == 0) { - D_801D2FE8 = D_801D3000; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D2FF4 == 0) { - D_801D3000 = D_801D3000 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D2FF4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D2FF4; -} - - - -extern s32 D_801D3000; - -void func_8013D164(void) { - D_801D3000 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D47DA; -extern u8 D_801D484E; -extern u8 D_801D4702; -extern u8 D_801D47BC; -extern u8 D_801D46E0; -extern u8 D_801D4701; -extern s32 D_801D47C0; - -void func_8013D330(void) { - if ((D_801D47DA & 0xff) != D_801D484E) { - D_801D47DA = ((D_801D47DA & 0xff) < D_801D484E) ? (D_801D47DA + 1) : (D_801D47DA - 1); - } - if ((D_801D4702 & 0xff) != D_801D47BC) { - D_801D4702 = ((D_801D4702 & 0xff) < D_801D47BC) ? (D_801D4702 + 1) : (D_801D4702 - 1); - } - if ((D_801D46E0 & 0xff) != D_801D4701) { - D_801D46E0 = ((D_801D46E0 & 0xff) < D_801D4701) ? (D_801D46E0 + 1) : (D_801D46E0 - 1); - } - D_801D47C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D2FD8; -extern void *D_801D2FDC; -extern void *D_801D2FE0; -extern s32 D_801D3008; -extern s32 D_801D300C; -extern s32 D_801D3010; -extern s32 D_801D4734[]; - -extern u8 D_8018A1A8[]; -extern u8 D_8018A250[]; -extern u8 D_8018A100[]; -extern u8 D_8018A1FC[]; -extern u8 D_8018A27C[]; -extern u8 D_8018A154[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D3008 = param_2; - D_801D300C = (param_2 >> 2) & 3; - D_801D3010 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D2FD8 = D_8018A1A8; - D_801D2FDC = D_8018A250; - D_801D2FE0 = D_8018A100; - } else { - D_801D2FD8 = D_8018A1FC; - D_801D2FDC = D_8018A27C; - D_801D2FE0 = D_8018A154; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D3010 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D3008 & 2) != 0) { - D_801D4734[0] = 0x140; - D_801D4734[3] = 0x80; - if (p[0x37] == 4) { - D_801D4734[0] = 0x140; - D_801D4734[3] = 0; - } - if (p[0x37] == 0) { - D_801D4734[0] = 0x140; - D_801D4734[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D2FE0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D2FE0; -extern s16 *D_801D2FE4; -extern s32 D_801D2FF4; -extern s32 D_801D3014; -extern s32 D_801D3018; -extern s32 D_801D301C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D2FE4 != 0) { - D_801D2FF4 = 0; - p = (int *)(param_1 * 12 + (int)D_801D2FE0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D3014 != x) { - flag = 1; - if (D_801D3014 < x) { - if (x - D_801D3014 < 5) { - D_801D3014 = x; - } else { - D_801D3014 = D_801D3014 + 4; - } - } else { - if (D_801D3014 - x < 5) { - D_801D3014 = x; - } else { - D_801D3014 = D_801D3014 - 4; - } - } - } - if (D_801D3018 != y) { - flag = 1; - if (D_801D3018 < y) { - if (y - D_801D3018 < 5) { - D_801D3018 = y; - } else { - D_801D3018 = D_801D3018 + 4; - } - } else { - if (D_801D3018 - y < 5) { - D_801D3018 = y; - } else { - D_801D3018 = D_801D3018 - 4; - } - } - } - if (D_801D301C != z) { - flag = 1; - if (D_801D301C < z) { - if (z - D_801D301C < 5) { - D_801D301C = z; - } else { - D_801D301C = D_801D301C + 4; - } - } else { - if (D_801D301C - z < 5) { - D_801D301C = z; - } else { - D_801D301C = D_801D301C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D2FF4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018A30C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D2FE4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D3014); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D3018); - uVar5 = (*(int*)&D_801D301C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018A30C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D2FFC; - -s32 func_8013E054(void) { - return D_801D2FFC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018AD08; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018ACE0; -extern s16 D_8018ACE2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018AD08; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018ACE0 = 2; - D_8018ACE2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018ACE2 = 0; - D_8018ACE0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D3030; - extern void * D_801D3034; - extern unsigned char D_8018A980; - extern unsigned char D_8018A998; - extern unsigned char D_8018AA0C; - extern unsigned char D_8018AA14; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D3030 = &D_8018A980; - D_801D3034 = &D_8018AA0C; - } else { - D_801D3030 = &D_8018A998; - D_801D3034 = &D_8018AA14; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018AD08/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018AD08 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018AD08)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018ACE4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018ACE4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018ACE4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018ACE0; -extern s16 D_8018ACE2; -extern unsigned char D_8018ACE4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018ACE2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018ACE0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018ACE2; - if (*r < 3) { - *r = *r + 1; - } - D_8018ACE0 = (u16)D_8018ACE0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018ACE4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_119/ov_SC03_119_jr_801380E0.c b/src/ov_SC03_119/ov_SC03_119_jr_801380E0.c new file mode 100644 index 000000000..d5447b1d0 --- /dev/null +++ b/src/ov_SC03_119/ov_SC03_119_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D1CC4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80189C00[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D2EEC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D47E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D1CC4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018993C)(); +extern s16 (*D_80189940)(); +extern M2C_UNK (*D_80189948)(); +extern s32 (*D_8018994C)(); +extern s32 D_801D2EE8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D1CC8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80189C94; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018D178; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80189CAC; +extern M2C_UNK D_80189CB4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80189CBC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80189CD8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80189CE4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80189CF8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80189D48[]; +extern s16 D_80189D78[]; +extern s16 D_80189DD8[]; +extern s16 D_80189DE0[]; +extern s16 D_80189E00[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80189E38[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80189E90[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80189ED8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80189EE0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80189EE8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80189EF0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80189E98; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80189EB8; +extern void func_801321B0(int param_1); +extern int D_80189EC8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D2F58; +extern s32 D_801D2F5C[]; +extern int D_801D2F60; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80189EFC; +extern u8 D_80189EF8; +extern s16 *D_80189F00; +extern u8 D_80189F04; +extern int D_801D2F58; +extern u16 D_801D2F68; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80189F00; /* holds a pointer value (*(u16**)&D_80189F00) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80189F14[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80189F68; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80189F6C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80189F6C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80189FB0; +extern u8 D_80189FF4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80189FB0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80189FF4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018A038[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018A074[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018A074; + if (((s16)a1) < 0xC00) { + tbl = D_8018A038; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018A0B0, D_8018A0B2, D_8018A0B4, D_8018A0B6, D_8018A0B8, D_8018A0BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018A0B2 < ang)) goto outer_else; + if (!(ang < D_8018A0B8)) goto inner_else; + if (ang < D_8018A0B4) { *(s16 *)L = D_8018A0B4; goto done; } + if (D_8018A0B6 < ang) { *(s16 *)L = D_8018A0B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018A0B0) { *(s16 *)L = D_8018A0B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018A0BA < ang) { *(s16 *)L = D_8018A0BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D2FD0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D2FD0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D2FD0; +extern s8 D_801D2FD4; +extern s8 D_801D2FD5; + +void func_8013C9C4(void * arg0) +{ + D_801D2FD0 = arg0; + D_801D2FD4 = 0; + D_801D2FD5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D2FD0; +extern s8 D_801D2FD4; +extern s8 D_801D2FD5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D2FD0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D2FD5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D2FD4)) * 2) + D_801D2FD0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D2FD5 = (unsigned char) p[1]; + D_801D2FD4 = D_801D2FD4 + 1; + if (D_801D2FD5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D2FD4 = 0; + *base = 0; + } + } + else + { + D_801D2FD5 = c - 1; + } + } + return; +} + + + +extern s32 D_801D2FF4; +extern s32 D_801D2FE8; +extern s32 D_801D2FEC; +extern s32 D_801D2FF8; + +void func_8013CABC(void) { + D_801D2FF4 = 1; + D_801D2FE8 = 1; + D_801D2FEC = 0; + D_801D2FF8 = 1; +} + + + +extern s32 D_801D2FE8; +extern s32 D_801D2FEC; +extern s32 D_801D2FF0; +extern s32 D_801D2FF4; +extern s32 D_801D2FF8; + +void func_8013CAE8(void) { + D_801D2FE8 = 1; + D_801D2FF4 = 0; + D_801D2FEC = 0; + D_801D2FF0 = -1; + D_801D2FF8 = 0; +} + + + +extern s32 D_801D2FF4; +extern s32 D_801D2FF8; +extern s32 D_801D3020; +extern s32 D_801D3024; + +void func_8013CB20(void) +{ + D_801D3020 = D_801D2FF8; + D_801D3024 = D_801D2FF4; + D_801D2FF8 = 1; + D_801D2FF4 = 0; +} + + + +extern s32 D_801D3020; +extern s32 D_801D3024; +extern s32 D_801D2FF8; +extern s32 D_801D2FF4; + +void func_8013CB5C(void) { + D_801D2FF8 = D_801D3020; + D_801D2FF4 = D_801D3024; +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D46F8; + extern u8 D_801D46F9; + extern u8 D_801D46FA; + extern u8 D_801D46FB; + extern u8 D_801D46FC; + extern u8 D_801D46FD; + extern u8 D_801D46FE; + extern u8 D_801D46FF; + extern u8 D_801D4700; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D46F8; t1 = D_801D46F9; t2 = D_801D46FA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D46FB; t1 = D_801D46FC; t2 = D_801D46FD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D46FE; t1 = D_801D46FF; t2 = D_801D4700; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D3000; +extern s32 D_801D2FE8; +extern s32 D_801D3004; +extern s32 D_801D2FF4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D3000 != 0) { + if (D_801D3000 != 2) { + if (((D_801D3000 < 3) && (D_801D3000 == 1)) && + (D_801D3004 = D_801D3004 + 1, 0x23a < D_801D3004)) { + D_801D2FE8 = D_801D3000; + D_801D3000 = 2; + } + } else { + D_801D2FE8 = D_801D2FE8 + -1; + if (D_801D2FE8 == 0) { + D_801D2FE8 = D_801D3000; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D2FF4 == 0) { + D_801D3000 = D_801D3000 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D2FF4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D2FF4; +} + + + +extern s32 D_801D3000; + +void func_8013D164(void) { + D_801D3000 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D47DA; +extern u8 D_801D484E; +extern u8 D_801D4702; +extern u8 D_801D47BC; +extern u8 D_801D46E0; +extern u8 D_801D4701; +extern s32 D_801D47C0; + +void func_8013D330(void) { + if ((D_801D47DA & 0xff) != D_801D484E) { + D_801D47DA = ((D_801D47DA & 0xff) < D_801D484E) ? (D_801D47DA + 1) : (D_801D47DA - 1); + } + if ((D_801D4702 & 0xff) != D_801D47BC) { + D_801D4702 = ((D_801D4702 & 0xff) < D_801D47BC) ? (D_801D4702 + 1) : (D_801D4702 - 1); + } + if ((D_801D46E0 & 0xff) != D_801D4701) { + D_801D46E0 = ((D_801D46E0 & 0xff) < D_801D4701) ? (D_801D46E0 + 1) : (D_801D46E0 - 1); + } + D_801D47C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D2FD8; +extern void *D_801D2FDC; +extern void *D_801D2FE0; +extern s32 D_801D3008; +extern s32 D_801D300C; +extern s32 D_801D3010; +extern s32 D_801D4734[]; + +extern u8 D_8018A1A8[]; +extern u8 D_8018A250[]; +extern u8 D_8018A100[]; +extern u8 D_8018A1FC[]; +extern u8 D_8018A27C[]; +extern u8 D_8018A154[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D3008 = param_2; + D_801D300C = (param_2 >> 2) & 3; + D_801D3010 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D2FD8 = D_8018A1A8; + D_801D2FDC = D_8018A250; + D_801D2FE0 = D_8018A100; + } else { + D_801D2FD8 = D_8018A1FC; + D_801D2FDC = D_8018A27C; + D_801D2FE0 = D_8018A154; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D3010 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D3008 & 2) != 0) { + D_801D4734[0] = 0x140; + D_801D4734[3] = 0x80; + if (p[0x37] == 4) { + D_801D4734[0] = 0x140; + D_801D4734[3] = 0; + } + if (p[0x37] == 0) { + D_801D4734[0] = 0x140; + D_801D4734[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D2FE0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D2FE0; +extern s16 *D_801D2FE4; +extern s32 D_801D2FF4; +extern s32 D_801D3014; +extern s32 D_801D3018; +extern s32 D_801D301C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D2FE4 != 0) { + D_801D2FF4 = 0; + p = (int *)(param_1 * 12 + (int)D_801D2FE0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D3014 != x) { + flag = 1; + if (D_801D3014 < x) { + if (x - D_801D3014 < 5) { + D_801D3014 = x; + } else { + D_801D3014 = D_801D3014 + 4; + } + } else { + if (D_801D3014 - x < 5) { + D_801D3014 = x; + } else { + D_801D3014 = D_801D3014 - 4; + } + } + } + if (D_801D3018 != y) { + flag = 1; + if (D_801D3018 < y) { + if (y - D_801D3018 < 5) { + D_801D3018 = y; + } else { + D_801D3018 = D_801D3018 + 4; + } + } else { + if (D_801D3018 - y < 5) { + D_801D3018 = y; + } else { + D_801D3018 = D_801D3018 - 4; + } + } + } + if (D_801D301C != z) { + flag = 1; + if (D_801D301C < z) { + if (z - D_801D301C < 5) { + D_801D301C = z; + } else { + D_801D301C = D_801D301C + 4; + } + } else { + if (D_801D301C - z < 5) { + D_801D301C = z; + } else { + D_801D301C = D_801D301C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D2FF4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018A30C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D2FE4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D3014); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D3018); + uVar5 = (*(int*)&D_801D301C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018A30C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D2FFC; + +s32 func_8013E054(void) { + return D_801D2FFC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018AD08; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018ACE0; +extern s16 D_8018ACE2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018AD08; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018ACE0 = 2; + D_8018ACE2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018ACE2 = 0; + D_8018ACE0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D3030; + extern void * D_801D3034; + extern unsigned char D_8018A980; + extern unsigned char D_8018A998; + extern unsigned char D_8018AA0C; + extern unsigned char D_8018AA14; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D3030 = &D_8018A980; + D_801D3034 = &D_8018AA0C; + } else { + D_801D3030 = &D_8018A998; + D_801D3034 = &D_8018AA14; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018AD08/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018AD08 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018AD08)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018ACE4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018ACE4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018ACE4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018ACE0; +extern s16 D_8018ACE2; +extern unsigned char D_8018ACE4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018ACE2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018ACE0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018ACE2; + if (*r < 3) { + *r = *r + 1; + } + D_8018ACE0 = (u16)D_8018ACE0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018ACE4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018ACE4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_121/ov_SC03_121_jr_8012ACE0.c b/src/ov_SC03_121/ov_SC03_121_jr_8012ACE0.c index 35acb87e8..02cba09a8 100644 --- a/src/ov_SC03_121/ov_SC03_121_jr_8012ACE0.c +++ b/src/ov_SC03_121/ov_SC03_121_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182788[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182788[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801827CC; -extern u8 D_80182810; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801827CC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182810 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182854[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182890[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182890; - if (((s16)a1) < 0xC00) { - tbl = D_80182854; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801828CC, D_801828CE, D_801828D0, D_801828D2, D_801828D4, D_801828D6; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801828CE < ang)) goto outer_else; - if (!(ang < D_801828D4)) goto inner_else; - if (ang < D_801828D0) { *(s16 *)L = D_801828D0; goto done; } - if (D_801828D2 < ang) { *(s16 *)L = D_801828D2; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801828CC) { *(s16 *)L = D_801828CC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801828D6 < ang) { *(s16 *)L = D_801828D6; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801ADA78; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801ADA78, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801ADA78; -extern s8 D_801ADA7C; -extern s8 D_801ADA7D; - -void func_8013C9C4(void * arg0) -{ - D_801ADA78 = arg0; - D_801ADA7C = 0; - D_801ADA7D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801ADA78; -extern s8 D_801ADA7C; -extern s8 D_801ADA7D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801ADA78; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801ADA7D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801ADA7C)) * 2) + D_801ADA78); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801ADA7D = (unsigned char) p[1]; - D_801ADA7C = D_801ADA7C + 1; - if (D_801ADA7D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801ADA7C = 0; - *base = 0; - } - } - else - { - D_801ADA7D = c - 1; - } - } - return; -} - - - -extern s32 D_801ADA9C; -extern s32 D_801ADA90; -extern s32 D_801ADA94; -extern s32 D_801ADAA0; - -void func_8013CABC(void) { - D_801ADA9C = 1; - D_801ADA90 = 1; - D_801ADA94 = 0; - D_801ADAA0 = 1; -} - - - -extern s32 D_801ADA90; -extern s32 D_801ADA94; -extern s32 D_801ADA98; -extern s32 D_801ADA9C; -extern s32 D_801ADAA0; - -void func_8013CAE8(void) { - D_801ADA90 = 1; - D_801ADA9C = 0; - D_801ADA94 = 0; - D_801ADA98 = -1; - D_801ADAA0 = 0; -} - - - -extern s32 D_801ADA9C; -extern s32 D_801ADAA0; -extern s32 D_801ADAC8; -extern s32 D_801ADACC; - -void func_8013CB20(void) -{ - D_801ADAC8 = D_801ADAA0; - D_801ADACC = D_801ADA9C; - D_801ADAA0 = 1; - D_801ADA9C = 0; -} - - - -extern s32 D_801ADAC8; -extern s32 D_801ADACC; -extern s32 D_801ADAA0; -extern s32 D_801ADA9C; - -void func_8013CB5C(void) { - D_801ADAA0 = D_801ADAC8; - D_801ADA9C = D_801ADACC; -} - - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AEE58; - extern u8 D_801AEE59; - extern u8 D_801AEE5A; - extern u8 D_801AEE5B; - extern u8 D_801AEE5C; - extern u8 D_801AEE5D; - extern u8 D_801AEE5E; - extern u8 D_801AEE5F; - extern u8 D_801AEE60; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AEE58; t1 = D_801AEE59; t2 = D_801AEE5A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AEE5B; t1 = D_801AEE5C; t2 = D_801AEE5D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AEE5E; t1 = D_801AEE5F; t2 = D_801AEE60; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801ADAA8; -extern s32 D_801ADA90; -extern s32 D_801ADAAC; -extern s32 D_801ADA9C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801ADAA8 != 0) { - if (D_801ADAA8 != 2) { - if (((D_801ADAA8 < 3) && (D_801ADAA8 == 1)) && - (D_801ADAAC = D_801ADAAC + 1, 0x23a < D_801ADAAC)) { - D_801ADA90 = D_801ADAA8; - D_801ADAA8 = 2; - } - } else { - D_801ADA90 = D_801ADA90 + -1; - if (D_801ADA90 == 0) { - D_801ADA90 = D_801ADAA8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801ADA9C == 0) { - D_801ADAA8 = D_801ADAA8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801ADA9C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801ADA9C; -} - - - -extern s32 D_801ADAA8; - -void func_8013D164(void) { - D_801ADAA8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AEF3A; -extern u8 D_801AEFAE; -extern u8 D_801AEE62; -extern u8 D_801AEF1C; -extern u8 D_801AEE40; -extern u8 D_801AEE61; -extern s32 D_801AEF20; - -void func_8013D330(void) { - if ((D_801AEF3A & 0xff) != D_801AEFAE) { - D_801AEF3A = ((D_801AEF3A & 0xff) < D_801AEFAE) ? (D_801AEF3A + 1) : (D_801AEF3A - 1); - } - if ((D_801AEE62 & 0xff) != D_801AEF1C) { - D_801AEE62 = ((D_801AEE62 & 0xff) < D_801AEF1C) ? (D_801AEE62 + 1) : (D_801AEE62 - 1); - } - if ((D_801AEE40 & 0xff) != D_801AEE61) { - D_801AEE40 = ((D_801AEE40 & 0xff) < D_801AEE61) ? (D_801AEE40 + 1) : (D_801AEE40 - 1); - } - D_801AEF20 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801ADA80; -extern void *D_801ADA84; -extern void *D_801ADA88; -extern s32 D_801ADAB0; -extern s32 D_801ADAB4; -extern s32 D_801ADAB8; -extern s32 D_801AEE94[]; - -extern u8 D_801829C4[]; -extern u8 D_80182A6C[]; -extern u8 D_8018291C[]; -extern u8 D_80182A18[]; -extern u8 D_80182A98[]; -extern u8 D_80182970[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801ADAB0 = param_2; - D_801ADAB4 = (param_2 >> 2) & 3; - D_801ADAB8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801ADA80 = D_801829C4; - D_801ADA84 = D_80182A6C; - D_801ADA88 = D_8018291C; - } else { - D_801ADA80 = D_80182A18; - D_801ADA84 = D_80182A98; - D_801ADA88 = D_80182970; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801ADAB8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801ADAB0 & 2) != 0) { - D_801AEE94[0] = 0x140; - D_801AEE94[3] = 0x80; - if (p[0x37] == 4) { - D_801AEE94[0] = 0x140; - D_801AEE94[3] = 0; - } - if (p[0x37] == 0) { - D_801AEE94[0] = 0x140; - D_801AEE94[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801ADA88)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801ADA88; -extern s16 *D_801ADA8C; -extern s32 D_801ADA9C; -extern s32 D_801ADABC; -extern s32 D_801ADAC0; -extern s32 D_801ADAC4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801ADA8C != 0) { - D_801ADA9C = 0; - p = (int *)(param_1 * 12 + (int)D_801ADA88); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801ADABC != x) { - flag = 1; - if (D_801ADABC < x) { - if (x - D_801ADABC < 5) { - D_801ADABC = x; - } else { - D_801ADABC = D_801ADABC + 4; - } - } else { - if (D_801ADABC - x < 5) { - D_801ADABC = x; - } else { - D_801ADABC = D_801ADABC - 4; - } - } - } - if (D_801ADAC0 != y) { - flag = 1; - if (D_801ADAC0 < y) { - if (y - D_801ADAC0 < 5) { - D_801ADAC0 = y; - } else { - D_801ADAC0 = D_801ADAC0 + 4; - } - } else { - if (D_801ADAC0 - y < 5) { - D_801ADAC0 = y; - } else { - D_801ADAC0 = D_801ADAC0 - 4; - } - } - } - if (D_801ADAC4 != z) { - flag = 1; - if (D_801ADAC4 < z) { - if (z - D_801ADAC4 < 5) { - D_801ADAC4 = z; - } else { - D_801ADAC4 = D_801ADAC4 + 4; - } - } else { - if (D_801ADAC4 - z < 5) { - D_801ADAC4 = z; - } else { - D_801ADAC4 = D_801ADAC4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801ADA9C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182B28[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801ADA8C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801ADABC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801ADAC0); - uVar5 = (*(int*)&D_801ADAC4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182B28); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801ADAA4; - -s32 func_8013E054(void) { - return D_801ADAA4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183524; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801834FC; -extern s16 D_801834FE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183524; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801834FC = 2; - D_801834FE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801834FE = 0; - D_801834FC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801ADAD8; - extern void * D_801ADADC; - extern unsigned char D_8018319C; - extern unsigned char D_801831B4; - extern unsigned char D_80183228; - extern unsigned char D_80183230; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801ADAD8 = &D_8018319C; - D_801ADADC = &D_80183228; - } else { - D_801ADAD8 = &D_801831B4; - D_801ADADC = &D_80183230; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183524/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183524 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183524)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80183500; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183500)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183500)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801834FC; -extern s16 D_801834FE; -extern unsigned char D_80183500; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801834FE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801834FC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801834FE; - if (*r < 3) { - *r = *r + 1; - } - D_801834FC = (u16)D_801834FC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183500); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80183500; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183500); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_121/ov_SC03_121_jr_801380E0.c b/src/ov_SC03_121/ov_SC03_121_jr_801380E0.c new file mode 100644 index 000000000..98220fcca --- /dev/null +++ b/src/ov_SC03_121/ov_SC03_121_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AC7CC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018241C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801AD994; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AEF40; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AC7CC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182158)(); +extern s16 (*D_8018215C)(); +extern M2C_UNK (*D_80182164)(); +extern s32 (*D_80182168)(); +extern s32 D_801AD990; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AC7D0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801824B0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185994; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801824C8; +extern M2C_UNK D_801824D0; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801824D8; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801824F4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80182500[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182514[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182564[]; +extern s16 D_80182594[]; +extern s16 D_801825F4[]; +extern s16 D_801825FC[]; +extern s16 D_8018261C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182654[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801826AC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801826F4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801826FC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182704[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018270C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801826B4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801826D4; +extern void func_801321B0(int param_1); +extern int D_801826E4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801ADA00; +extern s32 D_801ADA04[]; +extern int D_801ADA08; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182718; +extern u8 D_80182714; +extern s16 *D_8018271C; +extern u8 D_80182720; +extern int D_801ADA00; +extern u16 D_801ADA10; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018271C; /* holds a pointer value (*(u16**)&D_8018271C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182730[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182784; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182788[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182788[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801827CC; +extern u8 D_80182810; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801827CC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182810 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182854[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182890[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182890; + if (((s16)a1) < 0xC00) { + tbl = D_80182854; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801828CC, D_801828CE, D_801828D0, D_801828D2, D_801828D4, D_801828D6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801828CE < ang)) goto outer_else; + if (!(ang < D_801828D4)) goto inner_else; + if (ang < D_801828D0) { *(s16 *)L = D_801828D0; goto done; } + if (D_801828D2 < ang) { *(s16 *)L = D_801828D2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801828CC) { *(s16 *)L = D_801828CC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801828D6 < ang) { *(s16 *)L = D_801828D6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801ADA78; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801ADA78, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801ADA78; +extern s8 D_801ADA7C; +extern s8 D_801ADA7D; + +void func_8013C9C4(void * arg0) +{ + D_801ADA78 = arg0; + D_801ADA7C = 0; + D_801ADA7D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801ADA78; +extern s8 D_801ADA7C; +extern s8 D_801ADA7D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801ADA78; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801ADA7D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801ADA7C)) * 2) + D_801ADA78); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801ADA7D = (unsigned char) p[1]; + D_801ADA7C = D_801ADA7C + 1; + if (D_801ADA7D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801ADA7C = 0; + *base = 0; + } + } + else + { + D_801ADA7D = c - 1; + } + } + return; +} + + + +extern s32 D_801ADA9C; +extern s32 D_801ADA90; +extern s32 D_801ADA94; +extern s32 D_801ADAA0; + +void func_8013CABC(void) { + D_801ADA9C = 1; + D_801ADA90 = 1; + D_801ADA94 = 0; + D_801ADAA0 = 1; +} + + + +extern s32 D_801ADA90; +extern s32 D_801ADA94; +extern s32 D_801ADA98; +extern s32 D_801ADA9C; +extern s32 D_801ADAA0; + +void func_8013CAE8(void) { + D_801ADA90 = 1; + D_801ADA9C = 0; + D_801ADA94 = 0; + D_801ADA98 = -1; + D_801ADAA0 = 0; +} + + + +extern s32 D_801ADA9C; +extern s32 D_801ADAA0; +extern s32 D_801ADAC8; +extern s32 D_801ADACC; + +void func_8013CB20(void) +{ + D_801ADAC8 = D_801ADAA0; + D_801ADACC = D_801ADA9C; + D_801ADAA0 = 1; + D_801ADA9C = 0; +} + + + +extern s32 D_801ADAC8; +extern s32 D_801ADACC; +extern s32 D_801ADAA0; +extern s32 D_801ADA9C; + +void func_8013CB5C(void) { + D_801ADAA0 = D_801ADAC8; + D_801ADA9C = D_801ADACC; +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AEE58; + extern u8 D_801AEE59; + extern u8 D_801AEE5A; + extern u8 D_801AEE5B; + extern u8 D_801AEE5C; + extern u8 D_801AEE5D; + extern u8 D_801AEE5E; + extern u8 D_801AEE5F; + extern u8 D_801AEE60; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AEE58; t1 = D_801AEE59; t2 = D_801AEE5A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AEE5B; t1 = D_801AEE5C; t2 = D_801AEE5D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AEE5E; t1 = D_801AEE5F; t2 = D_801AEE60; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801ADAA8; +extern s32 D_801ADA90; +extern s32 D_801ADAAC; +extern s32 D_801ADA9C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801ADAA8 != 0) { + if (D_801ADAA8 != 2) { + if (((D_801ADAA8 < 3) && (D_801ADAA8 == 1)) && + (D_801ADAAC = D_801ADAAC + 1, 0x23a < D_801ADAAC)) { + D_801ADA90 = D_801ADAA8; + D_801ADAA8 = 2; + } + } else { + D_801ADA90 = D_801ADA90 + -1; + if (D_801ADA90 == 0) { + D_801ADA90 = D_801ADAA8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801ADA9C == 0) { + D_801ADAA8 = D_801ADAA8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801ADA9C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801ADA9C; +} + + + +extern s32 D_801ADAA8; + +void func_8013D164(void) { + D_801ADAA8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AEF3A; +extern u8 D_801AEFAE; +extern u8 D_801AEE62; +extern u8 D_801AEF1C; +extern u8 D_801AEE40; +extern u8 D_801AEE61; +extern s32 D_801AEF20; + +void func_8013D330(void) { + if ((D_801AEF3A & 0xff) != D_801AEFAE) { + D_801AEF3A = ((D_801AEF3A & 0xff) < D_801AEFAE) ? (D_801AEF3A + 1) : (D_801AEF3A - 1); + } + if ((D_801AEE62 & 0xff) != D_801AEF1C) { + D_801AEE62 = ((D_801AEE62 & 0xff) < D_801AEF1C) ? (D_801AEE62 + 1) : (D_801AEE62 - 1); + } + if ((D_801AEE40 & 0xff) != D_801AEE61) { + D_801AEE40 = ((D_801AEE40 & 0xff) < D_801AEE61) ? (D_801AEE40 + 1) : (D_801AEE40 - 1); + } + D_801AEF20 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801ADA80; +extern void *D_801ADA84; +extern void *D_801ADA88; +extern s32 D_801ADAB0; +extern s32 D_801ADAB4; +extern s32 D_801ADAB8; +extern s32 D_801AEE94[]; + +extern u8 D_801829C4[]; +extern u8 D_80182A6C[]; +extern u8 D_8018291C[]; +extern u8 D_80182A18[]; +extern u8 D_80182A98[]; +extern u8 D_80182970[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801ADAB0 = param_2; + D_801ADAB4 = (param_2 >> 2) & 3; + D_801ADAB8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801ADA80 = D_801829C4; + D_801ADA84 = D_80182A6C; + D_801ADA88 = D_8018291C; + } else { + D_801ADA80 = D_80182A18; + D_801ADA84 = D_80182A98; + D_801ADA88 = D_80182970; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801ADAB8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801ADAB0 & 2) != 0) { + D_801AEE94[0] = 0x140; + D_801AEE94[3] = 0x80; + if (p[0x37] == 4) { + D_801AEE94[0] = 0x140; + D_801AEE94[3] = 0; + } + if (p[0x37] == 0) { + D_801AEE94[0] = 0x140; + D_801AEE94[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801ADA88)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801ADA88; +extern s16 *D_801ADA8C; +extern s32 D_801ADA9C; +extern s32 D_801ADABC; +extern s32 D_801ADAC0; +extern s32 D_801ADAC4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801ADA8C != 0) { + D_801ADA9C = 0; + p = (int *)(param_1 * 12 + (int)D_801ADA88); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801ADABC != x) { + flag = 1; + if (D_801ADABC < x) { + if (x - D_801ADABC < 5) { + D_801ADABC = x; + } else { + D_801ADABC = D_801ADABC + 4; + } + } else { + if (D_801ADABC - x < 5) { + D_801ADABC = x; + } else { + D_801ADABC = D_801ADABC - 4; + } + } + } + if (D_801ADAC0 != y) { + flag = 1; + if (D_801ADAC0 < y) { + if (y - D_801ADAC0 < 5) { + D_801ADAC0 = y; + } else { + D_801ADAC0 = D_801ADAC0 + 4; + } + } else { + if (D_801ADAC0 - y < 5) { + D_801ADAC0 = y; + } else { + D_801ADAC0 = D_801ADAC0 - 4; + } + } + } + if (D_801ADAC4 != z) { + flag = 1; + if (D_801ADAC4 < z) { + if (z - D_801ADAC4 < 5) { + D_801ADAC4 = z; + } else { + D_801ADAC4 = D_801ADAC4 + 4; + } + } else { + if (D_801ADAC4 - z < 5) { + D_801ADAC4 = z; + } else { + D_801ADAC4 = D_801ADAC4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801ADA9C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182B28[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801ADA8C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801ADABC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801ADAC0); + uVar5 = (*(int*)&D_801ADAC4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182B28); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801ADAA4; + +s32 func_8013E054(void) { + return D_801ADAA4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183524; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801834FC; +extern s16 D_801834FE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183524; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801834FC = 2; + D_801834FE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801834FE = 0; + D_801834FC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801ADAD8; + extern void * D_801ADADC; + extern unsigned char D_8018319C; + extern unsigned char D_801831B4; + extern unsigned char D_80183228; + extern unsigned char D_80183230; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801ADAD8 = &D_8018319C; + D_801ADADC = &D_80183228; + } else { + D_801ADAD8 = &D_801831B4; + D_801ADADC = &D_80183230; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183524/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183524 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183524)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80183500; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183500)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183500)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801834FC; +extern s16 D_801834FE; +extern unsigned char D_80183500; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801834FE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801834FC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801834FE; + if (*r < 3) { + *r = *r + 1; + } + D_801834FC = (u16)D_801834FC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183500); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80183500; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183500); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_121/nonmatchings/ov_SC03_121_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_124/ov_SC03_124_jr_8012ACE0.c b/src/ov_SC03_124/ov_SC03_124_jr_8012ACE0.c index dbdeed204..99720cdce 100644 --- a/src/ov_SC03_124/ov_SC03_124_jr_8012ACE0.c +++ b/src/ov_SC03_124/ov_SC03_124_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018B1B4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018B1B4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018B1F8; -extern u8 D_8018B23C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018B1F8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018B23C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018B280[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018B2BC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018B2BC; - if (((s16)a1) < 0xC00) { - tbl = D_8018B280; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018B2F8, D_8018B2FA, D_8018B2FC, D_8018B2FE, D_8018B300, D_8018B302; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018B2FA < ang)) goto outer_else; - if (!(ang < D_8018B300)) goto inner_else; - if (ang < D_8018B2FC) { *(s16 *)L = D_8018B2FC; goto done; } - if (D_8018B2FE < ang) { *(s16 *)L = D_8018B2FE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018B2F8) { *(s16 *)L = D_8018B2F8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018B302 < ang) { *(s16 *)L = D_8018B302; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E05A0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E05A0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E05A0; -extern s8 D_801E05A4; -extern s8 D_801E05A5; - -void func_8013C9C4(void * arg0) -{ - D_801E05A0 = arg0; - D_801E05A4 = 0; - D_801E05A5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E05A0; -extern s8 D_801E05A4; -extern s8 D_801E05A5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E05A0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E05A5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E05A4)) * 2) + D_801E05A0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E05A5 = (unsigned char) p[1]; - D_801E05A4 = D_801E05A4 + 1; - if (D_801E05A5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E05A4 = 0; - *base = 0; - } - } - else - { - D_801E05A5 = c - 1; - } - } - return; -} - - - -extern s32 D_801E05C4; -extern s32 D_801E05B8; -extern s32 D_801E05BC; -extern s32 D_801E05C8; - -void func_8013CABC(void) { - D_801E05C4 = 1; - D_801E05B8 = 1; - D_801E05BC = 0; - D_801E05C8 = 1; -} - - - -extern s32 D_801E05B8; -extern s32 D_801E05BC; -extern s32 D_801E05C0; -extern s32 D_801E05C4; -extern s32 D_801E05C8; - -void func_8013CAE8(void) { - D_801E05B8 = 1; - D_801E05C4 = 0; - D_801E05BC = 0; - D_801E05C0 = -1; - D_801E05C8 = 0; -} - - - -extern s32 D_801E05C4; -extern s32 D_801E05C8; -extern s32 D_801E05F0; -extern s32 D_801E05F4; - -void func_8013CB20(void) -{ - D_801E05F0 = D_801E05C8; - D_801E05F4 = D_801E05C4; - D_801E05C8 = 1; - D_801E05C4 = 0; -} - - - -extern s32 D_801E05F0; -extern s32 D_801E05F4; -extern s32 D_801E05C8; -extern s32 D_801E05C4; - -void func_8013CB5C(void) { - D_801E05C8 = D_801E05F0; - D_801E05C4 = D_801E05F4; -} - - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E2468; - extern u8 D_801E2469; - extern u8 D_801E246A; - extern u8 D_801E246B; - extern u8 D_801E246C; - extern u8 D_801E246D; - extern u8 D_801E246E; - extern u8 D_801E246F; - extern u8 D_801E2470; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E2468; t1 = D_801E2469; t2 = D_801E246A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E246B; t1 = D_801E246C; t2 = D_801E246D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E246E; t1 = D_801E246F; t2 = D_801E2470; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E05D0; -extern s32 D_801E05B8; -extern s32 D_801E05D4; -extern s32 D_801E05C4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E05D0 != 0) { - if (D_801E05D0 != 2) { - if (((D_801E05D0 < 3) && (D_801E05D0 == 1)) && - (D_801E05D4 = D_801E05D4 + 1, 0x23a < D_801E05D4)) { - D_801E05B8 = D_801E05D0; - D_801E05D0 = 2; - } - } else { - D_801E05B8 = D_801E05B8 + -1; - if (D_801E05B8 == 0) { - D_801E05B8 = D_801E05D0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E05C4 == 0) { - D_801E05D0 = D_801E05D0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E05C4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E05C4; -} - - - -extern s32 D_801E05D0; - -void func_8013D164(void) { - D_801E05D0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E2572; -extern u8 D_801E25E6; -extern u8 D_801E2472; -extern u8 D_801E253C; -extern u8 D_801E2448; -extern u8 D_801E2471; -extern s32 D_801E2540; - -void func_8013D330(void) { - if ((D_801E2572 & 0xff) != D_801E25E6) { - D_801E2572 = ((D_801E2572 & 0xff) < D_801E25E6) ? (D_801E2572 + 1) : (D_801E2572 - 1); - } - if ((D_801E2472 & 0xff) != D_801E253C) { - D_801E2472 = ((D_801E2472 & 0xff) < D_801E253C) ? (D_801E2472 + 1) : (D_801E2472 - 1); - } - if ((D_801E2448 & 0xff) != D_801E2471) { - D_801E2448 = ((D_801E2448 & 0xff) < D_801E2471) ? (D_801E2448 + 1) : (D_801E2448 - 1); - } - D_801E2540 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E05A8; -extern void *D_801E05AC; -extern void *D_801E05B0; -extern s32 D_801E05D8; -extern s32 D_801E05DC; -extern s32 D_801E05E0; -extern s32 D_801E24B4[]; - -extern u8 D_8018B3F0[]; -extern u8 D_8018B498[]; -extern u8 D_8018B348[]; -extern u8 D_8018B444[]; -extern u8 D_8018B4C4[]; -extern u8 D_8018B39C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E05D8 = param_2; - D_801E05DC = (param_2 >> 2) & 3; - D_801E05E0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E05A8 = D_8018B3F0; - D_801E05AC = D_8018B498; - D_801E05B0 = D_8018B348; - } else { - D_801E05A8 = D_8018B444; - D_801E05AC = D_8018B4C4; - D_801E05B0 = D_8018B39C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E05E0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E05D8 & 2) != 0) { - D_801E24B4[0] = 0x140; - D_801E24B4[3] = 0x80; - if (p[0x37] == 4) { - D_801E24B4[0] = 0x140; - D_801E24B4[3] = 0; - } - if (p[0x37] == 0) { - D_801E24B4[0] = 0x140; - D_801E24B4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E05B0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E05B0; -extern s16 *D_801E05B4; -extern s32 D_801E05C4; -extern s32 D_801E05E4; -extern s32 D_801E05E8; -extern s32 D_801E05EC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E05B4 != 0) { - D_801E05C4 = 0; - p = (int *)(param_1 * 12 + (int)D_801E05B0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E05E4 != x) { - flag = 1; - if (D_801E05E4 < x) { - if (x - D_801E05E4 < 5) { - D_801E05E4 = x; - } else { - D_801E05E4 = D_801E05E4 + 4; - } - } else { - if (D_801E05E4 - x < 5) { - D_801E05E4 = x; - } else { - D_801E05E4 = D_801E05E4 - 4; - } - } - } - if (D_801E05E8 != y) { - flag = 1; - if (D_801E05E8 < y) { - if (y - D_801E05E8 < 5) { - D_801E05E8 = y; - } else { - D_801E05E8 = D_801E05E8 + 4; - } - } else { - if (D_801E05E8 - y < 5) { - D_801E05E8 = y; - } else { - D_801E05E8 = D_801E05E8 - 4; - } - } - } - if (D_801E05EC != z) { - flag = 1; - if (D_801E05EC < z) { - if (z - D_801E05EC < 5) { - D_801E05EC = z; - } else { - D_801E05EC = D_801E05EC + 4; - } - } else { - if (D_801E05EC - z < 5) { - D_801E05EC = z; - } else { - D_801E05EC = D_801E05EC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E05C4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018B554[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E05B4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E05E4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E05E8); - uVar5 = (*(int*)&D_801E05EC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018B554); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E05CC; - -s32 func_8013E054(void) { - return D_801E05CC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018BF50; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018BF28; -extern s16 D_8018BF2A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018BF50; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018BF28 = 2; - D_8018BF2A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018BF2A = 0; - D_8018BF28 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E0600; - extern void * D_801E0604; - extern unsigned char D_8018BBC8; - extern unsigned char D_8018BBE0; - extern unsigned char D_8018BC54; - extern unsigned char D_8018BC5C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E0600 = &D_8018BBC8; - D_801E0604 = &D_8018BC54; - } else { - D_801E0600 = &D_8018BBE0; - D_801E0604 = &D_8018BC5C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018BF50/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018BF50 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018BF50)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018BF2C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018BF2C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018BF2C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018BF28; -extern s16 D_8018BF2A; -extern unsigned char D_8018BF2C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018BF2A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018BF28` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018BF2A; - if (*r < 3) { - *r = *r + 1; - } - D_8018BF28 = (u16)D_8018BF28 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF2C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018BF2C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF2C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c b/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c new file mode 100644 index 000000000..2588e6141 --- /dev/null +++ b/src/ov_SC03_124/ov_SC03_124_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801DEF20; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018AE48[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E04BC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E2578; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801DEF20; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018AB7C)(); +extern s16 (*D_8018AB80)(); +extern M2C_UNK (*D_8018AB88)(); +extern s32 (*D_8018AB8C)(); +extern s32 D_801E04B8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801DEF24; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018AEDC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018E3C0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018AEF4; +extern M2C_UNK D_8018AEFC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018AF04; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018AF20[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018AF2C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018AF40[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018AF90[]; +extern s16 D_8018AFC0[]; +extern s16 D_8018B020[]; +extern s16 D_8018B028[]; +extern s16 D_8018B048[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018B080[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018B0D8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018B120[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018B128[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018B130[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018B138[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018B0E0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018B100; +extern void func_801321B0(int param_1); +extern int D_8018B110; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E0528; +extern s32 D_801E052C[]; +extern int D_801E0530; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018B144; +extern u8 D_8018B140; +extern s16 *D_8018B148; +extern u8 D_8018B14C; +extern int D_801E0528; +extern u16 D_801E0538; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018B148; /* holds a pointer value (*(u16**)&D_8018B148) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018B15C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018B1B0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018B1B4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018B1B4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018B1F8; +extern u8 D_8018B23C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018B1F8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018B23C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018B280[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018B2BC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018B2BC; + if (((s16)a1) < 0xC00) { + tbl = D_8018B280; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018B2F8, D_8018B2FA, D_8018B2FC, D_8018B2FE, D_8018B300, D_8018B302; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018B2FA < ang)) goto outer_else; + if (!(ang < D_8018B300)) goto inner_else; + if (ang < D_8018B2FC) { *(s16 *)L = D_8018B2FC; goto done; } + if (D_8018B2FE < ang) { *(s16 *)L = D_8018B2FE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018B2F8) { *(s16 *)L = D_8018B2F8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018B302 < ang) { *(s16 *)L = D_8018B302; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E05A0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E05A0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E05A0; +extern s8 D_801E05A4; +extern s8 D_801E05A5; + +void func_8013C9C4(void * arg0) +{ + D_801E05A0 = arg0; + D_801E05A4 = 0; + D_801E05A5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E05A0; +extern s8 D_801E05A4; +extern s8 D_801E05A5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E05A0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E05A5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E05A4)) * 2) + D_801E05A0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E05A5 = (unsigned char) p[1]; + D_801E05A4 = D_801E05A4 + 1; + if (D_801E05A5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E05A4 = 0; + *base = 0; + } + } + else + { + D_801E05A5 = c - 1; + } + } + return; +} + + + +extern s32 D_801E05C4; +extern s32 D_801E05B8; +extern s32 D_801E05BC; +extern s32 D_801E05C8; + +void func_8013CABC(void) { + D_801E05C4 = 1; + D_801E05B8 = 1; + D_801E05BC = 0; + D_801E05C8 = 1; +} + + + +extern s32 D_801E05B8; +extern s32 D_801E05BC; +extern s32 D_801E05C0; +extern s32 D_801E05C4; +extern s32 D_801E05C8; + +void func_8013CAE8(void) { + D_801E05B8 = 1; + D_801E05C4 = 0; + D_801E05BC = 0; + D_801E05C0 = -1; + D_801E05C8 = 0; +} + + + +extern s32 D_801E05C4; +extern s32 D_801E05C8; +extern s32 D_801E05F0; +extern s32 D_801E05F4; + +void func_8013CB20(void) +{ + D_801E05F0 = D_801E05C8; + D_801E05F4 = D_801E05C4; + D_801E05C8 = 1; + D_801E05C4 = 0; +} + + + +extern s32 D_801E05F0; +extern s32 D_801E05F4; +extern s32 D_801E05C8; +extern s32 D_801E05C4; + +void func_8013CB5C(void) { + D_801E05C8 = D_801E05F0; + D_801E05C4 = D_801E05F4; +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E2468; + extern u8 D_801E2469; + extern u8 D_801E246A; + extern u8 D_801E246B; + extern u8 D_801E246C; + extern u8 D_801E246D; + extern u8 D_801E246E; + extern u8 D_801E246F; + extern u8 D_801E2470; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E2468; t1 = D_801E2469; t2 = D_801E246A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E246B; t1 = D_801E246C; t2 = D_801E246D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E246E; t1 = D_801E246F; t2 = D_801E2470; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E05D0; +extern s32 D_801E05B8; +extern s32 D_801E05D4; +extern s32 D_801E05C4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E05D0 != 0) { + if (D_801E05D0 != 2) { + if (((D_801E05D0 < 3) && (D_801E05D0 == 1)) && + (D_801E05D4 = D_801E05D4 + 1, 0x23a < D_801E05D4)) { + D_801E05B8 = D_801E05D0; + D_801E05D0 = 2; + } + } else { + D_801E05B8 = D_801E05B8 + -1; + if (D_801E05B8 == 0) { + D_801E05B8 = D_801E05D0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E05C4 == 0) { + D_801E05D0 = D_801E05D0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E05C4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E05C4; +} + + + +extern s32 D_801E05D0; + +void func_8013D164(void) { + D_801E05D0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E2572; +extern u8 D_801E25E6; +extern u8 D_801E2472; +extern u8 D_801E253C; +extern u8 D_801E2448; +extern u8 D_801E2471; +extern s32 D_801E2540; + +void func_8013D330(void) { + if ((D_801E2572 & 0xff) != D_801E25E6) { + D_801E2572 = ((D_801E2572 & 0xff) < D_801E25E6) ? (D_801E2572 + 1) : (D_801E2572 - 1); + } + if ((D_801E2472 & 0xff) != D_801E253C) { + D_801E2472 = ((D_801E2472 & 0xff) < D_801E253C) ? (D_801E2472 + 1) : (D_801E2472 - 1); + } + if ((D_801E2448 & 0xff) != D_801E2471) { + D_801E2448 = ((D_801E2448 & 0xff) < D_801E2471) ? (D_801E2448 + 1) : (D_801E2448 - 1); + } + D_801E2540 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E05A8; +extern void *D_801E05AC; +extern void *D_801E05B0; +extern s32 D_801E05D8; +extern s32 D_801E05DC; +extern s32 D_801E05E0; +extern s32 D_801E24B4[]; + +extern u8 D_8018B3F0[]; +extern u8 D_8018B498[]; +extern u8 D_8018B348[]; +extern u8 D_8018B444[]; +extern u8 D_8018B4C4[]; +extern u8 D_8018B39C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E05D8 = param_2; + D_801E05DC = (param_2 >> 2) & 3; + D_801E05E0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E05A8 = D_8018B3F0; + D_801E05AC = D_8018B498; + D_801E05B0 = D_8018B348; + } else { + D_801E05A8 = D_8018B444; + D_801E05AC = D_8018B4C4; + D_801E05B0 = D_8018B39C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E05E0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E05D8 & 2) != 0) { + D_801E24B4[0] = 0x140; + D_801E24B4[3] = 0x80; + if (p[0x37] == 4) { + D_801E24B4[0] = 0x140; + D_801E24B4[3] = 0; + } + if (p[0x37] == 0) { + D_801E24B4[0] = 0x140; + D_801E24B4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E05B0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E05B0; +extern s16 *D_801E05B4; +extern s32 D_801E05C4; +extern s32 D_801E05E4; +extern s32 D_801E05E8; +extern s32 D_801E05EC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E05B4 != 0) { + D_801E05C4 = 0; + p = (int *)(param_1 * 12 + (int)D_801E05B0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E05E4 != x) { + flag = 1; + if (D_801E05E4 < x) { + if (x - D_801E05E4 < 5) { + D_801E05E4 = x; + } else { + D_801E05E4 = D_801E05E4 + 4; + } + } else { + if (D_801E05E4 - x < 5) { + D_801E05E4 = x; + } else { + D_801E05E4 = D_801E05E4 - 4; + } + } + } + if (D_801E05E8 != y) { + flag = 1; + if (D_801E05E8 < y) { + if (y - D_801E05E8 < 5) { + D_801E05E8 = y; + } else { + D_801E05E8 = D_801E05E8 + 4; + } + } else { + if (D_801E05E8 - y < 5) { + D_801E05E8 = y; + } else { + D_801E05E8 = D_801E05E8 - 4; + } + } + } + if (D_801E05EC != z) { + flag = 1; + if (D_801E05EC < z) { + if (z - D_801E05EC < 5) { + D_801E05EC = z; + } else { + D_801E05EC = D_801E05EC + 4; + } + } else { + if (D_801E05EC - z < 5) { + D_801E05EC = z; + } else { + D_801E05EC = D_801E05EC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E05C4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018B554[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E05B4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E05E4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E05E8); + uVar5 = (*(int*)&D_801E05EC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018B554); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E05CC; + +s32 func_8013E054(void) { + return D_801E05CC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018BF50; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018BF28; +extern s16 D_8018BF2A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018BF50; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018BF28 = 2; + D_8018BF2A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018BF2A = 0; + D_8018BF28 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E0600; + extern void * D_801E0604; + extern unsigned char D_8018BBC8; + extern unsigned char D_8018BBE0; + extern unsigned char D_8018BC54; + extern unsigned char D_8018BC5C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E0600 = &D_8018BBC8; + D_801E0604 = &D_8018BC54; + } else { + D_801E0600 = &D_8018BBE0; + D_801E0604 = &D_8018BC5C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018BF50/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018BF50 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018BF50)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018BF2C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018BF2C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018BF2C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018BF28; +extern s16 D_8018BF2A; +extern unsigned char D_8018BF2C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018BF2A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018BF28` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018BF2A; + if (*r < 3) { + *r = *r + 1; + } + D_8018BF28 = (u16)D_8018BF28 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF2C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018BF2C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018BF2C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_125/ov_SC03_125_jr_8012ACE0.c b/src/ov_SC03_125/ov_SC03_125_jr_8012ACE0.c index d23720fab..0dfaef155 100644 --- a/src/ov_SC03_125/ov_SC03_125_jr_8012ACE0.c +++ b/src/ov_SC03_125/ov_SC03_125_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184384[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184384[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801843C8; -extern u8 D_8018440C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801843C8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018440C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184450[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018448C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018448C; - if (((s16)a1) < 0xC00) { - tbl = D_80184450; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801844C8, D_801844CA, D_801844CC, D_801844CE, D_801844D0, D_801844D2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801844CA < ang)) goto outer_else; - if (!(ang < D_801844D0)) goto inner_else; - if (ang < D_801844CC) { *(s16 *)L = D_801844CC; goto done; } - if (D_801844CE < ang) { *(s16 *)L = D_801844CE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801844C8) { *(s16 *)L = D_801844C8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801844D2 < ang) { *(s16 *)L = D_801844D2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C2E98; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C2E98, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C2E98; -extern s8 D_801C2E9C; -extern s8 D_801C2E9D; - -void func_8013C9C4(void * arg0) -{ - D_801C2E98 = arg0; - D_801C2E9C = 0; - D_801C2E9D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C2E98; -extern s8 D_801C2E9C; -extern s8 D_801C2E9D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C2E98; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C2E9D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C2E9C)) * 2) + D_801C2E98); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C2E9D = (unsigned char) p[1]; - D_801C2E9C = D_801C2E9C + 1; - if (D_801C2E9D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C2E9C = 0; - *base = 0; - } - } - else - { - D_801C2E9D = c - 1; - } - } - return; -} - - - -extern s32 D_801C2EBC; -extern s32 D_801C2EB0; -extern s32 D_801C2EB4; -extern s32 D_801C2EC0; - -void func_8013CABC(void) { - D_801C2EBC = 1; - D_801C2EB0 = 1; - D_801C2EB4 = 0; - D_801C2EC0 = 1; -} - - - -extern s32 D_801C2EB0; -extern s32 D_801C2EB4; -extern s32 D_801C2EB8; -extern s32 D_801C2EBC; -extern s32 D_801C2EC0; - -void func_8013CAE8(void) { - D_801C2EB0 = 1; - D_801C2EBC = 0; - D_801C2EB4 = 0; - D_801C2EB8 = -1; - D_801C2EC0 = 0; -} - - - -extern s32 D_801C2EBC; -extern s32 D_801C2EC0; -extern s32 D_801C2EE8; -extern s32 D_801C2EEC; - -void func_8013CB20(void) -{ - D_801C2EE8 = D_801C2EC0; - D_801C2EEC = D_801C2EBC; - D_801C2EC0 = 1; - D_801C2EBC = 0; -} - - - -extern s32 D_801C2EE8; -extern s32 D_801C2EEC; -extern s32 D_801C2EC0; -extern s32 D_801C2EBC; - -void func_8013CB5C(void) { - D_801C2EC0 = D_801C2EE8; - D_801C2EBC = D_801C2EEC; -} - - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C43C0; - extern u8 D_801C43C1; - extern u8 D_801C43C2; - extern u8 D_801C43C3; - extern u8 D_801C43C4; - extern u8 D_801C43C5; - extern u8 D_801C43C6; - extern u8 D_801C43C7; - extern u8 D_801C43C8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C43C0; t1 = D_801C43C1; t2 = D_801C43C2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C43C3; t1 = D_801C43C4; t2 = D_801C43C5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C43C6; t1 = D_801C43C7; t2 = D_801C43C8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C2EC8; -extern s32 D_801C2EB0; -extern s32 D_801C2ECC; -extern s32 D_801C2EBC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C2EC8 != 0) { - if (D_801C2EC8 != 2) { - if (((D_801C2EC8 < 3) && (D_801C2EC8 == 1)) && - (D_801C2ECC = D_801C2ECC + 1, 0x23a < D_801C2ECC)) { - D_801C2EB0 = D_801C2EC8; - D_801C2EC8 = 2; - } - } else { - D_801C2EB0 = D_801C2EB0 + -1; - if (D_801C2EB0 == 0) { - D_801C2EB0 = D_801C2EC8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C2EBC == 0) { - D_801C2EC8 = D_801C2EC8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C2EBC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C2EBC; -} - - - -extern s32 D_801C2EC8; - -void func_8013D164(void) { - D_801C2EC8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C44CA; -extern u8 D_801C453E; -extern u8 D_801C43CA; -extern u8 D_801C4494; -extern u8 D_801C43A0; -extern u8 D_801C43C9; -extern s32 D_801C4498; - -void func_8013D330(void) { - if ((D_801C44CA & 0xff) != D_801C453E) { - D_801C44CA = ((D_801C44CA & 0xff) < D_801C453E) ? (D_801C44CA + 1) : (D_801C44CA - 1); - } - if ((D_801C43CA & 0xff) != D_801C4494) { - D_801C43CA = ((D_801C43CA & 0xff) < D_801C4494) ? (D_801C43CA + 1) : (D_801C43CA - 1); - } - if ((D_801C43A0 & 0xff) != D_801C43C9) { - D_801C43A0 = ((D_801C43A0 & 0xff) < D_801C43C9) ? (D_801C43A0 + 1) : (D_801C43A0 - 1); - } - D_801C4498 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C2EA0; -extern void *D_801C2EA4; -extern void *D_801C2EA8; -extern s32 D_801C2ED0; -extern s32 D_801C2ED4; -extern s32 D_801C2ED8; -extern s32 D_801C440C[]; - -extern u8 D_801845C0[]; -extern u8 D_80184668[]; -extern u8 D_80184518[]; -extern u8 D_80184614[]; -extern u8 D_80184694[]; -extern u8 D_8018456C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C2ED0 = param_2; - D_801C2ED4 = (param_2 >> 2) & 3; - D_801C2ED8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C2EA0 = D_801845C0; - D_801C2EA4 = D_80184668; - D_801C2EA8 = D_80184518; - } else { - D_801C2EA0 = D_80184614; - D_801C2EA4 = D_80184694; - D_801C2EA8 = D_8018456C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C2ED8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C2ED0 & 2) != 0) { - D_801C440C[0] = 0x140; - D_801C440C[3] = 0x80; - if (p[0x37] == 4) { - D_801C440C[0] = 0x140; - D_801C440C[3] = 0; - } - if (p[0x37] == 0) { - D_801C440C[0] = 0x140; - D_801C440C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C2EA8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C2EA8; -extern s16 *D_801C2EAC; -extern s32 D_801C2EBC; -extern s32 D_801C2EDC; -extern s32 D_801C2EE0; -extern s32 D_801C2EE4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C2EAC != 0) { - D_801C2EBC = 0; - p = (int *)(param_1 * 12 + (int)D_801C2EA8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C2EDC != x) { - flag = 1; - if (D_801C2EDC < x) { - if (x - D_801C2EDC < 5) { - D_801C2EDC = x; - } else { - D_801C2EDC = D_801C2EDC + 4; - } - } else { - if (D_801C2EDC - x < 5) { - D_801C2EDC = x; - } else { - D_801C2EDC = D_801C2EDC - 4; - } - } - } - if (D_801C2EE0 != y) { - flag = 1; - if (D_801C2EE0 < y) { - if (y - D_801C2EE0 < 5) { - D_801C2EE0 = y; - } else { - D_801C2EE0 = D_801C2EE0 + 4; - } - } else { - if (D_801C2EE0 - y < 5) { - D_801C2EE0 = y; - } else { - D_801C2EE0 = D_801C2EE0 - 4; - } - } - } - if (D_801C2EE4 != z) { - flag = 1; - if (D_801C2EE4 < z) { - if (z - D_801C2EE4 < 5) { - D_801C2EE4 = z; - } else { - D_801C2EE4 = D_801C2EE4 + 4; - } - } else { - if (D_801C2EE4 - z < 5) { - D_801C2EE4 = z; - } else { - D_801C2EE4 = D_801C2EE4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C2EBC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80184724[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C2EAC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C2EDC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C2EE0); - uVar5 = (*(int*)&D_801C2EE4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80184724); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C2EC4; - -s32 func_8013E054(void) { - return D_801C2EC4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80185120; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801850F8; -extern s16 D_801850FA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80185120; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801850F8 = 2; - D_801850FA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801850FA = 0; - D_801850F8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C2EF8; - extern void * D_801C2EFC; - extern unsigned char D_80184D98; - extern unsigned char D_80184DB0; - extern unsigned char D_80184E24; - extern unsigned char D_80184E2C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C2EF8 = &D_80184D98; - D_801C2EFC = &D_80184E24; - } else { - D_801C2EF8 = &D_80184DB0; - D_801C2EFC = &D_80184E2C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80185120/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185120 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80185120)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801850FC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801850FC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801850FC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801850F8; -extern s16 D_801850FA; -extern unsigned char D_801850FC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801850FA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801850F8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801850FA; - if (*r < 3) { - *r = *r + 1; - } - D_801850F8 = (u16)D_801850F8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801850FC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801850FC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801850FC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c b/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c new file mode 100644 index 000000000..f5dc16c36 --- /dev/null +++ b/src/ov_SC03_125/ov_SC03_125_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C1C0C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184018[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C2DB4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C44D0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C1C0C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80183D54)(); +extern s16 (*D_80183D58)(); +extern M2C_UNK (*D_80183D60)(); +extern s32 (*D_80183D64)(); +extern s32 D_801C2DB0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C1C10; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801840AC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187590; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801840C4; +extern M2C_UNK D_801840CC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801840D4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801840F0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801840FC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80184110[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184160[]; +extern s16 D_80184190[]; +extern s16 D_801841F0[]; +extern s16 D_801841F8[]; +extern s16 D_80184218[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184250[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801842A8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801842F0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801842F8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184300[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184308[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801842B0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801842D0; +extern void func_801321B0(int param_1); +extern int D_801842E0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C2E20; +extern s32 D_801C2E24[]; +extern int D_801C2E28; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184314; +extern u8 D_80184310; +extern s16 *D_80184318; +extern u8 D_8018431C; +extern int D_801C2E20; +extern u16 D_801C2E30; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184318; /* holds a pointer value (*(u16**)&D_80184318) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018432C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184380; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184384[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184384[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801843C8; +extern u8 D_8018440C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801843C8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018440C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184450[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018448C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018448C; + if (((s16)a1) < 0xC00) { + tbl = D_80184450; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801844C8, D_801844CA, D_801844CC, D_801844CE, D_801844D0, D_801844D2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801844CA < ang)) goto outer_else; + if (!(ang < D_801844D0)) goto inner_else; + if (ang < D_801844CC) { *(s16 *)L = D_801844CC; goto done; } + if (D_801844CE < ang) { *(s16 *)L = D_801844CE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801844C8) { *(s16 *)L = D_801844C8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801844D2 < ang) { *(s16 *)L = D_801844D2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C2E98; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C2E98, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C2E98; +extern s8 D_801C2E9C; +extern s8 D_801C2E9D; + +void func_8013C9C4(void * arg0) +{ + D_801C2E98 = arg0; + D_801C2E9C = 0; + D_801C2E9D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C2E98; +extern s8 D_801C2E9C; +extern s8 D_801C2E9D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C2E98; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C2E9D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C2E9C)) * 2) + D_801C2E98); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C2E9D = (unsigned char) p[1]; + D_801C2E9C = D_801C2E9C + 1; + if (D_801C2E9D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C2E9C = 0; + *base = 0; + } + } + else + { + D_801C2E9D = c - 1; + } + } + return; +} + + + +extern s32 D_801C2EBC; +extern s32 D_801C2EB0; +extern s32 D_801C2EB4; +extern s32 D_801C2EC0; + +void func_8013CABC(void) { + D_801C2EBC = 1; + D_801C2EB0 = 1; + D_801C2EB4 = 0; + D_801C2EC0 = 1; +} + + + +extern s32 D_801C2EB0; +extern s32 D_801C2EB4; +extern s32 D_801C2EB8; +extern s32 D_801C2EBC; +extern s32 D_801C2EC0; + +void func_8013CAE8(void) { + D_801C2EB0 = 1; + D_801C2EBC = 0; + D_801C2EB4 = 0; + D_801C2EB8 = -1; + D_801C2EC0 = 0; +} + + + +extern s32 D_801C2EBC; +extern s32 D_801C2EC0; +extern s32 D_801C2EE8; +extern s32 D_801C2EEC; + +void func_8013CB20(void) +{ + D_801C2EE8 = D_801C2EC0; + D_801C2EEC = D_801C2EBC; + D_801C2EC0 = 1; + D_801C2EBC = 0; +} + + + +extern s32 D_801C2EE8; +extern s32 D_801C2EEC; +extern s32 D_801C2EC0; +extern s32 D_801C2EBC; + +void func_8013CB5C(void) { + D_801C2EC0 = D_801C2EE8; + D_801C2EBC = D_801C2EEC; +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C43C0; + extern u8 D_801C43C1; + extern u8 D_801C43C2; + extern u8 D_801C43C3; + extern u8 D_801C43C4; + extern u8 D_801C43C5; + extern u8 D_801C43C6; + extern u8 D_801C43C7; + extern u8 D_801C43C8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C43C0; t1 = D_801C43C1; t2 = D_801C43C2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C43C3; t1 = D_801C43C4; t2 = D_801C43C5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C43C6; t1 = D_801C43C7; t2 = D_801C43C8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C2EC8; +extern s32 D_801C2EB0; +extern s32 D_801C2ECC; +extern s32 D_801C2EBC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C2EC8 != 0) { + if (D_801C2EC8 != 2) { + if (((D_801C2EC8 < 3) && (D_801C2EC8 == 1)) && + (D_801C2ECC = D_801C2ECC + 1, 0x23a < D_801C2ECC)) { + D_801C2EB0 = D_801C2EC8; + D_801C2EC8 = 2; + } + } else { + D_801C2EB0 = D_801C2EB0 + -1; + if (D_801C2EB0 == 0) { + D_801C2EB0 = D_801C2EC8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C2EBC == 0) { + D_801C2EC8 = D_801C2EC8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C2EBC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C2EBC; +} + + + +extern s32 D_801C2EC8; + +void func_8013D164(void) { + D_801C2EC8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C44CA; +extern u8 D_801C453E; +extern u8 D_801C43CA; +extern u8 D_801C4494; +extern u8 D_801C43A0; +extern u8 D_801C43C9; +extern s32 D_801C4498; + +void func_8013D330(void) { + if ((D_801C44CA & 0xff) != D_801C453E) { + D_801C44CA = ((D_801C44CA & 0xff) < D_801C453E) ? (D_801C44CA + 1) : (D_801C44CA - 1); + } + if ((D_801C43CA & 0xff) != D_801C4494) { + D_801C43CA = ((D_801C43CA & 0xff) < D_801C4494) ? (D_801C43CA + 1) : (D_801C43CA - 1); + } + if ((D_801C43A0 & 0xff) != D_801C43C9) { + D_801C43A0 = ((D_801C43A0 & 0xff) < D_801C43C9) ? (D_801C43A0 + 1) : (D_801C43A0 - 1); + } + D_801C4498 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C2EA0; +extern void *D_801C2EA4; +extern void *D_801C2EA8; +extern s32 D_801C2ED0; +extern s32 D_801C2ED4; +extern s32 D_801C2ED8; +extern s32 D_801C440C[]; + +extern u8 D_801845C0[]; +extern u8 D_80184668[]; +extern u8 D_80184518[]; +extern u8 D_80184614[]; +extern u8 D_80184694[]; +extern u8 D_8018456C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C2ED0 = param_2; + D_801C2ED4 = (param_2 >> 2) & 3; + D_801C2ED8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C2EA0 = D_801845C0; + D_801C2EA4 = D_80184668; + D_801C2EA8 = D_80184518; + } else { + D_801C2EA0 = D_80184614; + D_801C2EA4 = D_80184694; + D_801C2EA8 = D_8018456C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C2ED8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C2ED0 & 2) != 0) { + D_801C440C[0] = 0x140; + D_801C440C[3] = 0x80; + if (p[0x37] == 4) { + D_801C440C[0] = 0x140; + D_801C440C[3] = 0; + } + if (p[0x37] == 0) { + D_801C440C[0] = 0x140; + D_801C440C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C2EA8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C2EA8; +extern s16 *D_801C2EAC; +extern s32 D_801C2EBC; +extern s32 D_801C2EDC; +extern s32 D_801C2EE0; +extern s32 D_801C2EE4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C2EAC != 0) { + D_801C2EBC = 0; + p = (int *)(param_1 * 12 + (int)D_801C2EA8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C2EDC != x) { + flag = 1; + if (D_801C2EDC < x) { + if (x - D_801C2EDC < 5) { + D_801C2EDC = x; + } else { + D_801C2EDC = D_801C2EDC + 4; + } + } else { + if (D_801C2EDC - x < 5) { + D_801C2EDC = x; + } else { + D_801C2EDC = D_801C2EDC - 4; + } + } + } + if (D_801C2EE0 != y) { + flag = 1; + if (D_801C2EE0 < y) { + if (y - D_801C2EE0 < 5) { + D_801C2EE0 = y; + } else { + D_801C2EE0 = D_801C2EE0 + 4; + } + } else { + if (D_801C2EE0 - y < 5) { + D_801C2EE0 = y; + } else { + D_801C2EE0 = D_801C2EE0 - 4; + } + } + } + if (D_801C2EE4 != z) { + flag = 1; + if (D_801C2EE4 < z) { + if (z - D_801C2EE4 < 5) { + D_801C2EE4 = z; + } else { + D_801C2EE4 = D_801C2EE4 + 4; + } + } else { + if (D_801C2EE4 - z < 5) { + D_801C2EE4 = z; + } else { + D_801C2EE4 = D_801C2EE4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C2EBC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80184724[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C2EAC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C2EDC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C2EE0); + uVar5 = (*(int*)&D_801C2EE4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80184724); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C2EC4; + +s32 func_8013E054(void) { + return D_801C2EC4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80185120; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801850F8; +extern s16 D_801850FA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80185120; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801850F8 = 2; + D_801850FA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801850FA = 0; + D_801850F8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C2EF8; + extern void * D_801C2EFC; + extern unsigned char D_80184D98; + extern unsigned char D_80184DB0; + extern unsigned char D_80184E24; + extern unsigned char D_80184E2C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C2EF8 = &D_80184D98; + D_801C2EFC = &D_80184E24; + } else { + D_801C2EF8 = &D_80184DB0; + D_801C2EFC = &D_80184E2C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80185120/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185120 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80185120)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801850FC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801850FC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801850FC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801850F8; +extern s16 D_801850FA; +extern unsigned char D_801850FC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801850FA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801850F8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801850FA; + if (*r < 3) { + *r = *r + 1; + } + D_801850F8 = (u16)D_801850F8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801850FC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801850FC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801850FC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC03_126/ov_SC03_126_jr_8012ACE0.c b/src/ov_SC03_126/ov_SC03_126_jr_8012ACE0.c index 70da82aa4..a51457c9a 100644 --- a/src/ov_SC03_126/ov_SC03_126_jr_8012ACE0.c +++ b/src/ov_SC03_126/ov_SC03_126_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F87C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F87C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F8C0; -extern u8 D_8017F904; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F8C0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F904 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F948[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F984[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F984; - if (((s16)a1) < 0xC00) { - tbl = D_8017F948; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F9C2 < ang)) goto outer_else; - if (!(ang < D_8017F9C8)) goto inner_else; - if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } - if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018E760; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018E760, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018E760; -extern s8 D_8018E764; -extern s8 D_8018E765; - -void func_8013C9C4(void * arg0) -{ - D_8018E760 = arg0; - D_8018E764 = 0; - D_8018E765 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018E760; -extern s8 D_8018E764; -extern s8 D_8018E765; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018E760; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018E765; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E764)) * 2) + D_8018E760); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018E765 = (unsigned char) p[1]; - D_8018E764 = D_8018E764 + 1; - if (D_8018E765 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018E764 = 0; - *base = 0; - } - } - else - { - D_8018E765 = c - 1; - } - } - return; -} - - - -extern s32 D_8018E784; -extern s32 D_8018E778; -extern s32 D_8018E77C; -extern s32 D_8018E788; - -void func_8013CABC(void) { - D_8018E784 = 1; - D_8018E778 = 1; - D_8018E77C = 0; - D_8018E788 = 1; -} - - - -extern s32 D_8018E778; -extern s32 D_8018E77C; -extern s32 D_8018E780; -extern s32 D_8018E784; -extern s32 D_8018E788; - -void func_8013CAE8(void) { - D_8018E778 = 1; - D_8018E784 = 0; - D_8018E77C = 0; - D_8018E780 = -1; - D_8018E788 = 0; -} - - - -extern s32 D_8018E784; -extern s32 D_8018E788; -extern s32 D_8018E7B0; -extern s32 D_8018E7B4; - -void func_8013CB20(void) -{ - D_8018E7B0 = D_8018E788; - D_8018E7B4 = D_8018E784; - D_8018E788 = 1; - D_8018E784 = 0; -} - - - -extern s32 D_8018E7B0; -extern s32 D_8018E7B4; -extern s32 D_8018E788; -extern s32 D_8018E784; - -void func_8013CB5C(void) { - D_8018E788 = D_8018E7B0; - D_8018E784 = D_8018E7B4; -} - - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8018F9D0; - extern u8 D_8018F9D1; - extern u8 D_8018F9D2; - extern u8 D_8018F9D3; - extern u8 D_8018F9D4; - extern u8 D_8018F9D5; - extern u8 D_8018F9D6; - extern u8 D_8018F9D7; - extern u8 D_8018F9D8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8018F9D0; t1 = D_8018F9D1; t2 = D_8018F9D2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8018F9D3; t1 = D_8018F9D4; t2 = D_8018F9D5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8018F9D6; t1 = D_8018F9D7; t2 = D_8018F9D8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018E790; -extern s32 D_8018E778; -extern s32 D_8018E794; -extern s32 D_8018E784; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018E790 != 0) { - if (D_8018E790 != 2) { - if (((D_8018E790 < 3) && (D_8018E790 == 1)) && - (D_8018E794 = D_8018E794 + 1, 0x23a < D_8018E794)) { - D_8018E778 = D_8018E790; - D_8018E790 = 2; - } - } else { - D_8018E778 = D_8018E778 + -1; - if (D_8018E778 == 0) { - D_8018E778 = D_8018E790; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018E784 == 0) { - D_8018E790 = D_8018E790 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018E784; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018E784; -} - - - -extern s32 D_8018E790; - -void func_8013D164(void) { - D_8018E790 = 1; -} - - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8018FAB2; -extern u8 D_8018FB2C; -extern u8 D_8018F9DA; -extern u8 D_8018FA94; -extern u8 D_8018F9B8; -extern u8 D_8018F9D9; -extern s32 D_8018FA98; - -void func_8013D330(void) { - if ((D_8018FAB2 & 0xff) != D_8018FB2C) { - D_8018FAB2 = ((D_8018FAB2 & 0xff) < D_8018FB2C) ? (D_8018FAB2 + 1) : (D_8018FAB2 - 1); - } - if ((D_8018F9DA & 0xff) != D_8018FA94) { - D_8018F9DA = ((D_8018F9DA & 0xff) < D_8018FA94) ? (D_8018F9DA + 1) : (D_8018F9DA - 1); - } - if ((D_8018F9B8 & 0xff) != D_8018F9D9) { - D_8018F9B8 = ((D_8018F9B8 & 0xff) < D_8018F9D9) ? (D_8018F9B8 + 1) : (D_8018F9B8 - 1); - } - D_8018FA98 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018E768; -extern void *D_8018E76C; -extern void *D_8018E770; -extern s32 D_8018E798; -extern s32 D_8018E79C; -extern s32 D_8018E7A0; -extern s32 D_8018FA0C[]; - -extern u8 D_8017FAB8[]; -extern u8 D_8017FB60[]; -extern u8 D_8017FA10[]; -extern u8 D_8017FB0C[]; -extern u8 D_8017FB8C[]; -extern u8 D_8017FA64[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018E798 = param_2; - D_8018E79C = (param_2 >> 2) & 3; - D_8018E7A0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018E768 = D_8017FAB8; - D_8018E76C = D_8017FB60; - D_8018E770 = D_8017FA10; - } else { - D_8018E768 = D_8017FB0C; - D_8018E76C = D_8017FB8C; - D_8018E770 = D_8017FA64; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018E7A0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018E798 & 2) != 0) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0x80; - if (p[0x37] == 4) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0; - } - if (p[0x37] == 0) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018E770)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018E770; -extern s16 *D_8018E774; -extern s32 D_8018E784; -extern s32 D_8018E7A4; -extern s32 D_8018E7A8; -extern s32 D_8018E7AC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018E774 != 0) { - D_8018E784 = 0; - p = (int *)(param_1 * 12 + (int)D_8018E770); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018E7A4 != x) { - flag = 1; - if (D_8018E7A4 < x) { - if (x - D_8018E7A4 < 5) { - D_8018E7A4 = x; - } else { - D_8018E7A4 = D_8018E7A4 + 4; - } - } else { - if (D_8018E7A4 - x < 5) { - D_8018E7A4 = x; - } else { - D_8018E7A4 = D_8018E7A4 - 4; - } - } - } - if (D_8018E7A8 != y) { - flag = 1; - if (D_8018E7A8 < y) { - if (y - D_8018E7A8 < 5) { - D_8018E7A8 = y; - } else { - D_8018E7A8 = D_8018E7A8 + 4; - } - } else { - if (D_8018E7A8 - y < 5) { - D_8018E7A8 = y; - } else { - D_8018E7A8 = D_8018E7A8 - 4; - } - } - } - if (D_8018E7AC != z) { - flag = 1; - if (D_8018E7AC < z) { - if (z - D_8018E7AC < 5) { - D_8018E7AC = z; - } else { - D_8018E7AC = D_8018E7AC + 4; - } - } else { - if (D_8018E7AC - z < 5) { - D_8018E7AC = z; - } else { - D_8018E7AC = D_8018E7AC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018E784 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FC1C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018E774); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7A4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7A8); - uVar5 = (*(int*)&D_8018E7AC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FC1C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018E78C; - -s32 func_8013E054(void) { - return D_8018E78C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180618; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801805F0; -extern s16 D_801805F2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180618; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801805F0 = 2; - D_801805F2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801805F2 = 0; - D_801805F0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018E7C0; - extern void * D_8018E7C4; - extern unsigned char D_80180290; - extern unsigned char D_801802A8; - extern unsigned char D_8018031C; - extern unsigned char D_80180324; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018E7C0 = &D_80180290; - D_8018E7C4 = &D_8018031C; - } else { - D_8018E7C0 = &D_801802A8; - D_8018E7C4 = &D_80180324; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180618/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180618 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180618)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801805F4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801805F4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801805F4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801805F0; -extern s16 D_801805F2; -extern unsigned char D_801805F4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801805F2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801805F0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801805F2; - if (*r < 3) { - *r = *r + 1; - } - D_801805F0 = (u16)D_801805F0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801805F4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC03_126/ov_SC03_126_jr_801380E0.c b/src/ov_SC03_126/ov_SC03_126_jr_801380E0.c new file mode 100644 index 000000000..f004edae7 --- /dev/null +++ b/src/ov_SC03_126/ov_SC03_126_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D4F8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F510[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018E67C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8018FAB8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D4F8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F24C)(); +extern s16 (*D_8017F250)(); +extern M2C_UNK (*D_8017F258)(); +extern s32 (*D_8017F25C)(); +extern s32 D_8018E678; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D4FC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F5A4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182A88; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F5BC; +extern M2C_UNK D_8017F5C4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F5CC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F5E8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F5F4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F608[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F658[]; +extern s16 D_8017F688[]; +extern s16 D_8017F6E8[]; +extern s16 D_8017F6F0[]; +extern s16 D_8017F710[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F748[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F7A0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F7E8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F7F0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F7F8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F800[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F7A8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F7C8; +extern void func_801321B0(int param_1); +extern int D_8017F7D8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018E6E8; +extern s32 D_8018E6EC[]; +extern int D_8018E6F0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F80C; +extern u8 D_8017F808; +extern s16 *D_8017F810; +extern u8 D_8017F814; +extern int D_8018E6E8; +extern u16 D_8018E6F8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F810; /* holds a pointer value (*(u16**)&D_8017F810) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F824[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F878; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F87C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F87C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F8C0; +extern u8 D_8017F904; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F8C0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F904 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F948[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F984[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F984; + if (((s16)a1) < 0xC00) { + tbl = D_8017F948; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F9C2 < ang)) goto outer_else; + if (!(ang < D_8017F9C8)) goto inner_else; + if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } + if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018E760; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018E760, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018E760; +extern s8 D_8018E764; +extern s8 D_8018E765; + +void func_8013C9C4(void * arg0) +{ + D_8018E760 = arg0; + D_8018E764 = 0; + D_8018E765 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018E760; +extern s8 D_8018E764; +extern s8 D_8018E765; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018E760; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018E765; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E764)) * 2) + D_8018E760); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018E765 = (unsigned char) p[1]; + D_8018E764 = D_8018E764 + 1; + if (D_8018E765 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018E764 = 0; + *base = 0; + } + } + else + { + D_8018E765 = c - 1; + } + } + return; +} + + + +extern s32 D_8018E784; +extern s32 D_8018E778; +extern s32 D_8018E77C; +extern s32 D_8018E788; + +void func_8013CABC(void) { + D_8018E784 = 1; + D_8018E778 = 1; + D_8018E77C = 0; + D_8018E788 = 1; +} + + + +extern s32 D_8018E778; +extern s32 D_8018E77C; +extern s32 D_8018E780; +extern s32 D_8018E784; +extern s32 D_8018E788; + +void func_8013CAE8(void) { + D_8018E778 = 1; + D_8018E784 = 0; + D_8018E77C = 0; + D_8018E780 = -1; + D_8018E788 = 0; +} + + + +extern s32 D_8018E784; +extern s32 D_8018E788; +extern s32 D_8018E7B0; +extern s32 D_8018E7B4; + +void func_8013CB20(void) +{ + D_8018E7B0 = D_8018E788; + D_8018E7B4 = D_8018E784; + D_8018E788 = 1; + D_8018E784 = 0; +} + + + +extern s32 D_8018E7B0; +extern s32 D_8018E7B4; +extern s32 D_8018E788; +extern s32 D_8018E784; + +void func_8013CB5C(void) { + D_8018E788 = D_8018E7B0; + D_8018E784 = D_8018E7B4; +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8018F9D0; + extern u8 D_8018F9D1; + extern u8 D_8018F9D2; + extern u8 D_8018F9D3; + extern u8 D_8018F9D4; + extern u8 D_8018F9D5; + extern u8 D_8018F9D6; + extern u8 D_8018F9D7; + extern u8 D_8018F9D8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8018F9D0; t1 = D_8018F9D1; t2 = D_8018F9D2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8018F9D3; t1 = D_8018F9D4; t2 = D_8018F9D5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8018F9D6; t1 = D_8018F9D7; t2 = D_8018F9D8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018E790; +extern s32 D_8018E778; +extern s32 D_8018E794; +extern s32 D_8018E784; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018E790 != 0) { + if (D_8018E790 != 2) { + if (((D_8018E790 < 3) && (D_8018E790 == 1)) && + (D_8018E794 = D_8018E794 + 1, 0x23a < D_8018E794)) { + D_8018E778 = D_8018E790; + D_8018E790 = 2; + } + } else { + D_8018E778 = D_8018E778 + -1; + if (D_8018E778 == 0) { + D_8018E778 = D_8018E790; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018E784 == 0) { + D_8018E790 = D_8018E790 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018E784; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018E784; +} + + + +extern s32 D_8018E790; + +void func_8013D164(void) { + D_8018E790 = 1; +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8018FAB2; +extern u8 D_8018FB2C; +extern u8 D_8018F9DA; +extern u8 D_8018FA94; +extern u8 D_8018F9B8; +extern u8 D_8018F9D9; +extern s32 D_8018FA98; + +void func_8013D330(void) { + if ((D_8018FAB2 & 0xff) != D_8018FB2C) { + D_8018FAB2 = ((D_8018FAB2 & 0xff) < D_8018FB2C) ? (D_8018FAB2 + 1) : (D_8018FAB2 - 1); + } + if ((D_8018F9DA & 0xff) != D_8018FA94) { + D_8018F9DA = ((D_8018F9DA & 0xff) < D_8018FA94) ? (D_8018F9DA + 1) : (D_8018F9DA - 1); + } + if ((D_8018F9B8 & 0xff) != D_8018F9D9) { + D_8018F9B8 = ((D_8018F9B8 & 0xff) < D_8018F9D9) ? (D_8018F9B8 + 1) : (D_8018F9B8 - 1); + } + D_8018FA98 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018E768; +extern void *D_8018E76C; +extern void *D_8018E770; +extern s32 D_8018E798; +extern s32 D_8018E79C; +extern s32 D_8018E7A0; +extern s32 D_8018FA0C[]; + +extern u8 D_8017FAB8[]; +extern u8 D_8017FB60[]; +extern u8 D_8017FA10[]; +extern u8 D_8017FB0C[]; +extern u8 D_8017FB8C[]; +extern u8 D_8017FA64[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018E798 = param_2; + D_8018E79C = (param_2 >> 2) & 3; + D_8018E7A0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018E768 = D_8017FAB8; + D_8018E76C = D_8017FB60; + D_8018E770 = D_8017FA10; + } else { + D_8018E768 = D_8017FB0C; + D_8018E76C = D_8017FB8C; + D_8018E770 = D_8017FA64; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018E7A0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018E798 & 2) != 0) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0x80; + if (p[0x37] == 4) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0; + } + if (p[0x37] == 0) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018E770)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018E770; +extern s16 *D_8018E774; +extern s32 D_8018E784; +extern s32 D_8018E7A4; +extern s32 D_8018E7A8; +extern s32 D_8018E7AC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018E774 != 0) { + D_8018E784 = 0; + p = (int *)(param_1 * 12 + (int)D_8018E770); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018E7A4 != x) { + flag = 1; + if (D_8018E7A4 < x) { + if (x - D_8018E7A4 < 5) { + D_8018E7A4 = x; + } else { + D_8018E7A4 = D_8018E7A4 + 4; + } + } else { + if (D_8018E7A4 - x < 5) { + D_8018E7A4 = x; + } else { + D_8018E7A4 = D_8018E7A4 - 4; + } + } + } + if (D_8018E7A8 != y) { + flag = 1; + if (D_8018E7A8 < y) { + if (y - D_8018E7A8 < 5) { + D_8018E7A8 = y; + } else { + D_8018E7A8 = D_8018E7A8 + 4; + } + } else { + if (D_8018E7A8 - y < 5) { + D_8018E7A8 = y; + } else { + D_8018E7A8 = D_8018E7A8 - 4; + } + } + } + if (D_8018E7AC != z) { + flag = 1; + if (D_8018E7AC < z) { + if (z - D_8018E7AC < 5) { + D_8018E7AC = z; + } else { + D_8018E7AC = D_8018E7AC + 4; + } + } else { + if (D_8018E7AC - z < 5) { + D_8018E7AC = z; + } else { + D_8018E7AC = D_8018E7AC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018E784 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FC1C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018E774); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7A4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7A8); + uVar5 = (*(int*)&D_8018E7AC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FC1C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018E78C; + +s32 func_8013E054(void) { + return D_8018E78C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180618; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801805F0; +extern s16 D_801805F2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180618; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801805F0 = 2; + D_801805F2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801805F2 = 0; + D_801805F0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018E7C0; + extern void * D_8018E7C4; + extern unsigned char D_80180290; + extern unsigned char D_801802A8; + extern unsigned char D_8018031C; + extern unsigned char D_80180324; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018E7C0 = &D_80180290; + D_8018E7C4 = &D_8018031C; + } else { + D_8018E7C0 = &D_801802A8; + D_8018E7C4 = &D_80180324; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180618/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180618 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180618)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801805F4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801805F4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801805F4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801805F0; +extern s16 D_801805F2; +extern unsigned char D_801805F4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801805F2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801805F0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801805F2; + if (*r < 3) { + *r = *r + 1; + } + D_801805F0 = (u16)D_801805F0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801805F4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC03_126/nonmatchings/ov_SC03_126_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_000/ov_SC04_000_jr_8012ACE0.c b/src/ov_SC04_000/ov_SC04_000_jr_8012ACE0.c index 73224b29b..40d93f0da 100644 --- a/src/ov_SC04_000/ov_SC04_000_jr_8012ACE0.c +++ b/src/ov_SC04_000/ov_SC04_000_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80183888[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80183888[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801838CC; -extern u8 D_80183910; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801838CC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183910 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183954[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183990[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183990; - if (((s16)a1) < 0xC00) { - tbl = D_80183954; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801839CC, D_801839CE, D_801839D0, D_801839D2, D_801839D4, D_801839D6; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801839CE < ang)) goto outer_else; - if (!(ang < D_801839D4)) goto inner_else; - if (ang < D_801839D0) { *(s16 *)L = D_801839D0; goto done; } - if (D_801839D2 < ang) { *(s16 *)L = D_801839D2; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801839CC) { *(s16 *)L = D_801839CC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801839D6 < ang) { *(s16 *)L = D_801839D6; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A8810; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A8810, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A8810; -extern s8 D_801A8814; -extern s8 D_801A8815; - -void func_8013C9C4(void * arg0) -{ - D_801A8810 = arg0; - D_801A8814 = 0; - D_801A8815 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A8810; -extern s8 D_801A8814; -extern s8 D_801A8815; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A8810; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A8815; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A8814)) * 2) + D_801A8810); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A8815 = (unsigned char) p[1]; - D_801A8814 = D_801A8814 + 1; - if (D_801A8815 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A8814 = 0; - *base = 0; - } - } - else - { - D_801A8815 = c - 1; - } - } - return; -} - - - -extern s32 D_801A8834; -extern s32 D_801A8828; -extern s32 D_801A882C; -extern s32 D_801A8838; - -void func_8013CABC(void) { - D_801A8834 = 1; - D_801A8828 = 1; - D_801A882C = 0; - D_801A8838 = 1; -} - - - -extern s32 D_801A8828; -extern s32 D_801A882C; -extern s32 D_801A8830; -extern s32 D_801A8834; -extern s32 D_801A8838; - -void func_8013CAE8(void) { - D_801A8828 = 1; - D_801A8834 = 0; - D_801A882C = 0; - D_801A8830 = -1; - D_801A8838 = 0; -} - - - -extern s32 D_801A8834; -extern s32 D_801A8838; -extern s32 D_801A8860; -extern s32 D_801A8864; - -void func_8013CB20(void) -{ - D_801A8860 = D_801A8838; - D_801A8864 = D_801A8834; - D_801A8838 = 1; - D_801A8834 = 0; -} - - - -extern s32 D_801A8860; -extern s32 D_801A8864; -extern s32 D_801A8838; -extern s32 D_801A8834; - -void func_8013CB5C(void) { - D_801A8838 = D_801A8860; - D_801A8834 = D_801A8864; -} - - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AAF00; - extern u8 D_801AAF01; - extern u8 D_801AAF02; - extern u8 D_801AAF03; - extern u8 D_801AAF04; - extern u8 D_801AAF05; - extern u8 D_801AAF06; - extern u8 D_801AAF07; - extern u8 D_801AAF08; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AAF00; t1 = D_801AAF01; t2 = D_801AAF02; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AAF03; t1 = D_801AAF04; t2 = D_801AAF05; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AAF06; t1 = D_801AAF07; t2 = D_801AAF08; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A8840; -extern s32 D_801A8828; -extern s32 D_801A8844; -extern s32 D_801A8834; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A8840 != 0) { - if (D_801A8840 != 2) { - if (((D_801A8840 < 3) && (D_801A8840 == 1)) && - (D_801A8844 = D_801A8844 + 1, 0x23a < D_801A8844)) { - D_801A8828 = D_801A8840; - D_801A8840 = 2; - } - } else { - D_801A8828 = D_801A8828 + -1; - if (D_801A8828 == 0) { - D_801A8828 = D_801A8840; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A8834 == 0) { - D_801A8840 = D_801A8840 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A8834; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A8834; -} - - - -extern s32 D_801A8840; - -void func_8013D164(void) { - D_801A8840 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AAFE2; -extern u8 D_801AB056; -extern u8 D_801AAF0A; -extern u8 D_801AAFC4; -extern u8 D_801AAEE8; -extern u8 D_801AAF09; -extern s32 D_801AAFC8; - -void func_8013D330(void) { - if ((D_801AAFE2 & 0xff) != D_801AB056) { - D_801AAFE2 = ((D_801AAFE2 & 0xff) < D_801AB056) ? (D_801AAFE2 + 1) : (D_801AAFE2 - 1); - } - if ((D_801AAF0A & 0xff) != D_801AAFC4) { - D_801AAF0A = ((D_801AAF0A & 0xff) < D_801AAFC4) ? (D_801AAF0A + 1) : (D_801AAF0A - 1); - } - if ((D_801AAEE8 & 0xff) != D_801AAF09) { - D_801AAEE8 = ((D_801AAEE8 & 0xff) < D_801AAF09) ? (D_801AAEE8 + 1) : (D_801AAEE8 - 1); - } - D_801AAFC8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A8818; -extern void *D_801A881C; -extern void *D_801A8820; -extern s32 D_801A8848; -extern s32 D_801A884C; -extern s32 D_801A8850; -extern s32 D_801AAF3C[]; - -extern u8 D_80183AC4[]; -extern u8 D_80183B6C[]; -extern u8 D_80183A1C[]; -extern u8 D_80183B18[]; -extern u8 D_80183B98[]; -extern u8 D_80183A70[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A8848 = param_2; - D_801A884C = (param_2 >> 2) & 3; - D_801A8850 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A8818 = D_80183AC4; - D_801A881C = D_80183B6C; - D_801A8820 = D_80183A1C; - } else { - D_801A8818 = D_80183B18; - D_801A881C = D_80183B98; - D_801A8820 = D_80183A70; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A8850 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A8848 & 2) != 0) { - D_801AAF3C[0] = 0x140; - D_801AAF3C[3] = 0x80; - if (p[0x37] == 4) { - D_801AAF3C[0] = 0x140; - D_801AAF3C[3] = 0; - } - if (p[0x37] == 0) { - D_801AAF3C[0] = 0x140; - D_801AAF3C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A8820)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A8820; -extern s16 *D_801A8824; -extern s32 D_801A8834; -extern s32 D_801A8854; -extern s32 D_801A8858; -extern s32 D_801A885C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A8824 != 0) { - D_801A8834 = 0; - p = (int *)(param_1 * 12 + (int)D_801A8820); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A8854 != x) { - flag = 1; - if (D_801A8854 < x) { - if (x - D_801A8854 < 5) { - D_801A8854 = x; - } else { - D_801A8854 = D_801A8854 + 4; - } - } else { - if (D_801A8854 - x < 5) { - D_801A8854 = x; - } else { - D_801A8854 = D_801A8854 - 4; - } - } - } - if (D_801A8858 != y) { - flag = 1; - if (D_801A8858 < y) { - if (y - D_801A8858 < 5) { - D_801A8858 = y; - } else { - D_801A8858 = D_801A8858 + 4; - } - } else { - if (D_801A8858 - y < 5) { - D_801A8858 = y; - } else { - D_801A8858 = D_801A8858 - 4; - } - } - } - if (D_801A885C != z) { - flag = 1; - if (D_801A885C < z) { - if (z - D_801A885C < 5) { - D_801A885C = z; - } else { - D_801A885C = D_801A885C + 4; - } - } else { - if (D_801A885C - z < 5) { - D_801A885C = z; - } else { - D_801A885C = D_801A885C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A8834 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183C28[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A8824); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A8854); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A8858); - uVar5 = (*(int*)&D_801A885C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183C28); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A883C; - -s32 func_8013E054(void) { - return D_801A883C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80184624; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801845FC; -extern s16 D_801845FE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80184624; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801845FC = 2; - D_801845FE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801845FE = 0; - D_801845FC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A8870; - extern void * D_801A8874; - extern unsigned char D_8018429C; - extern unsigned char D_801842B4; - extern unsigned char D_80184328; - extern unsigned char D_80184330; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A8870 = &D_8018429C; - D_801A8874 = &D_80184328; - } else { - D_801A8870 = &D_801842B4; - D_801A8874 = &D_80184330; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80184624/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184624 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80184624)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80184600; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184600)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184600)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801845FC; -extern s16 D_801845FE; -extern unsigned char D_80184600; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801845FE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801845FC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801845FE; - if (*r < 3) { - *r = *r + 1; - } - D_801845FC = (u16)D_801845FC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184600); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80184600; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184600); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_000/ov_SC04_000_jr_801380E0.c b/src/ov_SC04_000/ov_SC04_000_jr_801380E0.c new file mode 100644 index 000000000..a8ab70577 --- /dev/null +++ b/src/ov_SC04_000/ov_SC04_000_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A7574; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018351C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A872C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AAFE8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A7574; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80183258)(); +extern s16 (*D_8018325C)(); +extern M2C_UNK (*D_80183264)(); +extern s32 (*D_80183268)(); +extern s32 D_801A8728; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A7578; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801835B0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80186A94; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801835C8; +extern M2C_UNK D_801835D0; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801835D8; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801835F4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80183600[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80183614[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80183664[]; +extern s16 D_80183694[]; +extern s16 D_801836F4[]; +extern s16 D_801836FC[]; +extern s16 D_8018371C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80183754[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801837AC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801837F4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801837FC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80183804[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018380C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801837B4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801837D4; +extern void func_801321B0(int param_1); +extern int D_801837E4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A8798; +extern s32 D_801A879C[]; +extern int D_801A87A0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80183818; +extern u8 D_80183814; +extern s16 *D_8018381C; +extern u8 D_80183820; +extern int D_801A8798; +extern u16 D_801A87A8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018381C; /* holds a pointer value (*(u16**)&D_8018381C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80183830[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80183884; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80183888[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80183888[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801838CC; +extern u8 D_80183910; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801838CC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183910 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183954[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183990[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183990; + if (((s16)a1) < 0xC00) { + tbl = D_80183954; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801839CC, D_801839CE, D_801839D0, D_801839D2, D_801839D4, D_801839D6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801839CE < ang)) goto outer_else; + if (!(ang < D_801839D4)) goto inner_else; + if (ang < D_801839D0) { *(s16 *)L = D_801839D0; goto done; } + if (D_801839D2 < ang) { *(s16 *)L = D_801839D2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801839CC) { *(s16 *)L = D_801839CC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801839D6 < ang) { *(s16 *)L = D_801839D6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A8810; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A8810, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A8810; +extern s8 D_801A8814; +extern s8 D_801A8815; + +void func_8013C9C4(void * arg0) +{ + D_801A8810 = arg0; + D_801A8814 = 0; + D_801A8815 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A8810; +extern s8 D_801A8814; +extern s8 D_801A8815; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A8810; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A8815; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A8814)) * 2) + D_801A8810); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A8815 = (unsigned char) p[1]; + D_801A8814 = D_801A8814 + 1; + if (D_801A8815 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A8814 = 0; + *base = 0; + } + } + else + { + D_801A8815 = c - 1; + } + } + return; +} + + + +extern s32 D_801A8834; +extern s32 D_801A8828; +extern s32 D_801A882C; +extern s32 D_801A8838; + +void func_8013CABC(void) { + D_801A8834 = 1; + D_801A8828 = 1; + D_801A882C = 0; + D_801A8838 = 1; +} + + + +extern s32 D_801A8828; +extern s32 D_801A882C; +extern s32 D_801A8830; +extern s32 D_801A8834; +extern s32 D_801A8838; + +void func_8013CAE8(void) { + D_801A8828 = 1; + D_801A8834 = 0; + D_801A882C = 0; + D_801A8830 = -1; + D_801A8838 = 0; +} + + + +extern s32 D_801A8834; +extern s32 D_801A8838; +extern s32 D_801A8860; +extern s32 D_801A8864; + +void func_8013CB20(void) +{ + D_801A8860 = D_801A8838; + D_801A8864 = D_801A8834; + D_801A8838 = 1; + D_801A8834 = 0; +} + + + +extern s32 D_801A8860; +extern s32 D_801A8864; +extern s32 D_801A8838; +extern s32 D_801A8834; + +void func_8013CB5C(void) { + D_801A8838 = D_801A8860; + D_801A8834 = D_801A8864; +} + + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AAF00; + extern u8 D_801AAF01; + extern u8 D_801AAF02; + extern u8 D_801AAF03; + extern u8 D_801AAF04; + extern u8 D_801AAF05; + extern u8 D_801AAF06; + extern u8 D_801AAF07; + extern u8 D_801AAF08; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AAF00; t1 = D_801AAF01; t2 = D_801AAF02; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AAF03; t1 = D_801AAF04; t2 = D_801AAF05; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AAF06; t1 = D_801AAF07; t2 = D_801AAF08; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A8840; +extern s32 D_801A8828; +extern s32 D_801A8844; +extern s32 D_801A8834; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A8840 != 0) { + if (D_801A8840 != 2) { + if (((D_801A8840 < 3) && (D_801A8840 == 1)) && + (D_801A8844 = D_801A8844 + 1, 0x23a < D_801A8844)) { + D_801A8828 = D_801A8840; + D_801A8840 = 2; + } + } else { + D_801A8828 = D_801A8828 + -1; + if (D_801A8828 == 0) { + D_801A8828 = D_801A8840; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A8834 == 0) { + D_801A8840 = D_801A8840 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A8834; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A8834; +} + + + +extern s32 D_801A8840; + +void func_8013D164(void) { + D_801A8840 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AAFE2; +extern u8 D_801AB056; +extern u8 D_801AAF0A; +extern u8 D_801AAFC4; +extern u8 D_801AAEE8; +extern u8 D_801AAF09; +extern s32 D_801AAFC8; + +void func_8013D330(void) { + if ((D_801AAFE2 & 0xff) != D_801AB056) { + D_801AAFE2 = ((D_801AAFE2 & 0xff) < D_801AB056) ? (D_801AAFE2 + 1) : (D_801AAFE2 - 1); + } + if ((D_801AAF0A & 0xff) != D_801AAFC4) { + D_801AAF0A = ((D_801AAF0A & 0xff) < D_801AAFC4) ? (D_801AAF0A + 1) : (D_801AAF0A - 1); + } + if ((D_801AAEE8 & 0xff) != D_801AAF09) { + D_801AAEE8 = ((D_801AAEE8 & 0xff) < D_801AAF09) ? (D_801AAEE8 + 1) : (D_801AAEE8 - 1); + } + D_801AAFC8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A8818; +extern void *D_801A881C; +extern void *D_801A8820; +extern s32 D_801A8848; +extern s32 D_801A884C; +extern s32 D_801A8850; +extern s32 D_801AAF3C[]; + +extern u8 D_80183AC4[]; +extern u8 D_80183B6C[]; +extern u8 D_80183A1C[]; +extern u8 D_80183B18[]; +extern u8 D_80183B98[]; +extern u8 D_80183A70[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A8848 = param_2; + D_801A884C = (param_2 >> 2) & 3; + D_801A8850 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A8818 = D_80183AC4; + D_801A881C = D_80183B6C; + D_801A8820 = D_80183A1C; + } else { + D_801A8818 = D_80183B18; + D_801A881C = D_80183B98; + D_801A8820 = D_80183A70; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A8850 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A8848 & 2) != 0) { + D_801AAF3C[0] = 0x140; + D_801AAF3C[3] = 0x80; + if (p[0x37] == 4) { + D_801AAF3C[0] = 0x140; + D_801AAF3C[3] = 0; + } + if (p[0x37] == 0) { + D_801AAF3C[0] = 0x140; + D_801AAF3C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A8820)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A8820; +extern s16 *D_801A8824; +extern s32 D_801A8834; +extern s32 D_801A8854; +extern s32 D_801A8858; +extern s32 D_801A885C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A8824 != 0) { + D_801A8834 = 0; + p = (int *)(param_1 * 12 + (int)D_801A8820); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A8854 != x) { + flag = 1; + if (D_801A8854 < x) { + if (x - D_801A8854 < 5) { + D_801A8854 = x; + } else { + D_801A8854 = D_801A8854 + 4; + } + } else { + if (D_801A8854 - x < 5) { + D_801A8854 = x; + } else { + D_801A8854 = D_801A8854 - 4; + } + } + } + if (D_801A8858 != y) { + flag = 1; + if (D_801A8858 < y) { + if (y - D_801A8858 < 5) { + D_801A8858 = y; + } else { + D_801A8858 = D_801A8858 + 4; + } + } else { + if (D_801A8858 - y < 5) { + D_801A8858 = y; + } else { + D_801A8858 = D_801A8858 - 4; + } + } + } + if (D_801A885C != z) { + flag = 1; + if (D_801A885C < z) { + if (z - D_801A885C < 5) { + D_801A885C = z; + } else { + D_801A885C = D_801A885C + 4; + } + } else { + if (D_801A885C - z < 5) { + D_801A885C = z; + } else { + D_801A885C = D_801A885C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A8834 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183C28[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A8824); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A8854); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A8858); + uVar5 = (*(int*)&D_801A885C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183C28); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A883C; + +s32 func_8013E054(void) { + return D_801A883C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80184624; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801845FC; +extern s16 D_801845FE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80184624; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801845FC = 2; + D_801845FE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801845FE = 0; + D_801845FC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A8870; + extern void * D_801A8874; + extern unsigned char D_8018429C; + extern unsigned char D_801842B4; + extern unsigned char D_80184328; + extern unsigned char D_80184330; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A8870 = &D_8018429C; + D_801A8874 = &D_80184328; + } else { + D_801A8870 = &D_801842B4; + D_801A8874 = &D_80184330; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80184624/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80184624 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80184624)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80184600; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80184600)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80184600)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801845FC; +extern s16 D_801845FE; +extern unsigned char D_80184600; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801845FE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801845FC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801845FE; + if (*r < 3) { + *r = *r + 1; + } + D_801845FC = (u16)D_801845FC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184600); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80184600; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80184600); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_000/nonmatchings/ov_SC04_000_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_002/ov_SC04_002_jr_8012ACE0.c b/src/ov_SC04_002/ov_SC04_002_jr_8012ACE0.c index dd7289d60..336babfaa 100644 --- a/src/ov_SC04_002/ov_SC04_002_jr_8012ACE0.c +++ b/src/ov_SC04_002/ov_SC04_002_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801889F4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801889F4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80188A38; -extern u8 D_80188A7C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80188A38; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80188A7C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80188AC0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80188AFC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80188AFC; - if (((s16)a1) < 0xC00) { - tbl = D_80188AC0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80188B38, D_80188B3A, D_80188B3C, D_80188B3E, D_80188B40, D_80188B42; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80188B3A < ang)) goto outer_else; - if (!(ang < D_80188B40)) goto inner_else; - if (ang < D_80188B3C) { *(s16 *)L = D_80188B3C; goto done; } - if (D_80188B3E < ang) { *(s16 *)L = D_80188B3E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80188B38) { *(s16 *)L = D_80188B38; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80188B42 < ang) { *(s16 *)L = D_80188B42; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801BFB20; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801BFB20, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801BFB20; -extern s8 D_801BFB24; -extern s8 D_801BFB25; - -void func_8013C9C4(void * arg0) -{ - D_801BFB20 = arg0; - D_801BFB24 = 0; - D_801BFB25 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801BFB20; -extern s8 D_801BFB24; -extern s8 D_801BFB25; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801BFB20; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801BFB25; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801BFB24)) * 2) + D_801BFB20); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801BFB25 = (unsigned char) p[1]; - D_801BFB24 = D_801BFB24 + 1; - if (D_801BFB25 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801BFB24 = 0; - *base = 0; - } - } - else - { - D_801BFB25 = c - 1; - } - } - return; -} - - - -extern s32 D_801BFB44; -extern s32 D_801BFB38; -extern s32 D_801BFB3C; -extern s32 D_801BFB48; - -void func_8013CABC(void) { - D_801BFB44 = 1; - D_801BFB38 = 1; - D_801BFB3C = 0; - D_801BFB48 = 1; -} - - - -extern s32 D_801BFB38; -extern s32 D_801BFB3C; -extern s32 D_801BFB40; -extern s32 D_801BFB44; -extern s32 D_801BFB48; - -void func_8013CAE8(void) { - D_801BFB38 = 1; - D_801BFB44 = 0; - D_801BFB3C = 0; - D_801BFB40 = -1; - D_801BFB48 = 0; -} - - - -extern s32 D_801BFB44; -extern s32 D_801BFB48; -extern s32 D_801BFB70; -extern s32 D_801BFB74; - -void func_8013CB20(void) -{ - D_801BFB70 = D_801BFB48; - D_801BFB74 = D_801BFB44; - D_801BFB48 = 1; - D_801BFB44 = 0; -} - - - -extern s32 D_801BFB70; -extern s32 D_801BFB74; -extern s32 D_801BFB48; -extern s32 D_801BFB44; - -void func_8013CB5C(void) { - D_801BFB48 = D_801BFB70; - D_801BFB44 = D_801BFB74; -} - - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C15D8; - extern u8 D_801C15D9; - extern u8 D_801C15DA; - extern u8 D_801C15DB; - extern u8 D_801C15DC; - extern u8 D_801C15DD; - extern u8 D_801C15DE; - extern u8 D_801C15DF; - extern u8 D_801C15E0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C15D8; t1 = D_801C15D9; t2 = D_801C15DA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C15DB; t1 = D_801C15DC; t2 = D_801C15DD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C15DE; t1 = D_801C15DF; t2 = D_801C15E0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801BFB50; -extern s32 D_801BFB38; -extern s32 D_801BFB54; -extern s32 D_801BFB44; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801BFB50 != 0) { - if (D_801BFB50 != 2) { - if (((D_801BFB50 < 3) && (D_801BFB50 == 1)) && - (D_801BFB54 = D_801BFB54 + 1, 0x23a < D_801BFB54)) { - D_801BFB38 = D_801BFB50; - D_801BFB50 = 2; - } - } else { - D_801BFB38 = D_801BFB38 + -1; - if (D_801BFB38 == 0) { - D_801BFB38 = D_801BFB50; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801BFB44 == 0) { - D_801BFB50 = D_801BFB50 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801BFB44; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801BFB44; -} - - - -extern s32 D_801BFB50; - -void func_8013D164(void) { - D_801BFB50 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C16C0; -extern u8 D_801C1736; -extern u8 D_801C15E2; -extern u8 D_801C169C; -extern u8 D_801C15C0; -extern u8 D_801C15E1; -extern s32 D_801C16A0; - -void func_8013D330(void) { - if ((D_801C16C0 & 0xff) != D_801C1736) { - D_801C16C0 = ((D_801C16C0 & 0xff) < D_801C1736) ? (D_801C16C0 + 1) : (D_801C16C0 - 1); - } - if ((D_801C15E2 & 0xff) != D_801C169C) { - D_801C15E2 = ((D_801C15E2 & 0xff) < D_801C169C) ? (D_801C15E2 + 1) : (D_801C15E2 - 1); - } - if ((D_801C15C0 & 0xff) != D_801C15E1) { - D_801C15C0 = ((D_801C15C0 & 0xff) < D_801C15E1) ? (D_801C15C0 + 1) : (D_801C15C0 - 1); - } - D_801C16A0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801BFB28; -extern void *D_801BFB2C; -extern void *D_801BFB30; -extern s32 D_801BFB58; -extern s32 D_801BFB5C; -extern s32 D_801BFB60; -extern s32 D_801C1614[]; - -extern u8 D_80188C30[]; -extern u8 D_80188CD8[]; -extern u8 D_80188B88[]; -extern u8 D_80188C84[]; -extern u8 D_80188D04[]; -extern u8 D_80188BDC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801BFB58 = param_2; - D_801BFB5C = (param_2 >> 2) & 3; - D_801BFB60 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801BFB28 = D_80188C30; - D_801BFB2C = D_80188CD8; - D_801BFB30 = D_80188B88; - } else { - D_801BFB28 = D_80188C84; - D_801BFB2C = D_80188D04; - D_801BFB30 = D_80188BDC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801BFB60 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801BFB58 & 2) != 0) { - D_801C1614[0] = 0x140; - D_801C1614[3] = 0x80; - if (p[0x37] == 4) { - D_801C1614[0] = 0x140; - D_801C1614[3] = 0; - } - if (p[0x37] == 0) { - D_801C1614[0] = 0x140; - D_801C1614[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801BFB30)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801BFB30; -extern s16 *D_801BFB34; -extern s32 D_801BFB44; -extern s32 D_801BFB64; -extern s32 D_801BFB68; -extern s32 D_801BFB6C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801BFB34 != 0) { - D_801BFB44 = 0; - p = (int *)(param_1 * 12 + (int)D_801BFB30); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801BFB64 != x) { - flag = 1; - if (D_801BFB64 < x) { - if (x - D_801BFB64 < 5) { - D_801BFB64 = x; - } else { - D_801BFB64 = D_801BFB64 + 4; - } - } else { - if (D_801BFB64 - x < 5) { - D_801BFB64 = x; - } else { - D_801BFB64 = D_801BFB64 - 4; - } - } - } - if (D_801BFB68 != y) { - flag = 1; - if (D_801BFB68 < y) { - if (y - D_801BFB68 < 5) { - D_801BFB68 = y; - } else { - D_801BFB68 = D_801BFB68 + 4; - } - } else { - if (D_801BFB68 - y < 5) { - D_801BFB68 = y; - } else { - D_801BFB68 = D_801BFB68 - 4; - } - } - } - if (D_801BFB6C != z) { - flag = 1; - if (D_801BFB6C < z) { - if (z - D_801BFB6C < 5) { - D_801BFB6C = z; - } else { - D_801BFB6C = D_801BFB6C + 4; - } - } else { - if (D_801BFB6C - z < 5) { - D_801BFB6C = z; - } else { - D_801BFB6C = D_801BFB6C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801BFB44 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80188D94[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801BFB34); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BFB64); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BFB68); - uVar5 = (*(int*)&D_801BFB6C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80188D94); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801BFB4C; - -s32 func_8013E054(void) { - return D_801BFB4C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80189790; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80189768; -extern s16 D_8018976A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80189790; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80189768 = 2; - D_8018976A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018976A = 0; - D_80189768 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801BFB80; - extern void * D_801BFB84; - extern unsigned char D_80189408; - extern unsigned char D_80189420; - extern unsigned char D_80189494; - extern unsigned char D_8018949C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801BFB80 = &D_80189408; - D_801BFB84 = &D_80189494; - } else { - D_801BFB80 = &D_80189420; - D_801BFB84 = &D_8018949C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80189790/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80189790 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80189790)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018976C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018976C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018976C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80189768; -extern s16 D_8018976A; -extern unsigned char D_8018976C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018976A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80189768` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018976A; - if (*r < 3) { - *r = *r + 1; - } - D_80189768 = (u16)D_80189768 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018976C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018976C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018976C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_002/ov_SC04_002_jr_801380E0.c b/src/ov_SC04_002/ov_SC04_002_jr_801380E0.c new file mode 100644 index 000000000..8b97389f5 --- /dev/null +++ b/src/ov_SC04_002/ov_SC04_002_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801BE8C4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80188688[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801BFA3C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C16C8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801BE8C4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801883C4)(); +extern s16 (*D_801883C8)(); +extern M2C_UNK (*D_801883D0)(); +extern s32 (*D_801883D4)(); +extern s32 D_801BFA38; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801BE8C8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018871C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018BC00; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80188734; +extern M2C_UNK D_8018873C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80188744; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80188760[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018876C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80188780[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801887D0[]; +extern s16 D_80188800[]; +extern s16 D_80188860[]; +extern s16 D_80188868[]; +extern s16 D_80188888[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801888C0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80188918[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80188960[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80188968[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80188970[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80188978[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80188920; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80188940; +extern void func_801321B0(int param_1); +extern int D_80188950; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801BFAA8; +extern s32 D_801BFAAC[]; +extern int D_801BFAB0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80188984; +extern u8 D_80188980; +extern s16 *D_80188988; +extern u8 D_8018898C; +extern int D_801BFAA8; +extern u16 D_801BFAB8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80188988; /* holds a pointer value (*(u16**)&D_80188988) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018899C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801889F0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801889F4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801889F4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80188A38; +extern u8 D_80188A7C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80188A38; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80188A7C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80188AC0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80188AFC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80188AFC; + if (((s16)a1) < 0xC00) { + tbl = D_80188AC0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80188B38, D_80188B3A, D_80188B3C, D_80188B3E, D_80188B40, D_80188B42; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80188B3A < ang)) goto outer_else; + if (!(ang < D_80188B40)) goto inner_else; + if (ang < D_80188B3C) { *(s16 *)L = D_80188B3C; goto done; } + if (D_80188B3E < ang) { *(s16 *)L = D_80188B3E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80188B38) { *(s16 *)L = D_80188B38; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80188B42 < ang) { *(s16 *)L = D_80188B42; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801BFB20; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801BFB20, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801BFB20; +extern s8 D_801BFB24; +extern s8 D_801BFB25; + +void func_8013C9C4(void * arg0) +{ + D_801BFB20 = arg0; + D_801BFB24 = 0; + D_801BFB25 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801BFB20; +extern s8 D_801BFB24; +extern s8 D_801BFB25; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801BFB20; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801BFB25; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801BFB24)) * 2) + D_801BFB20); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801BFB25 = (unsigned char) p[1]; + D_801BFB24 = D_801BFB24 + 1; + if (D_801BFB25 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801BFB24 = 0; + *base = 0; + } + } + else + { + D_801BFB25 = c - 1; + } + } + return; +} + + + +extern s32 D_801BFB44; +extern s32 D_801BFB38; +extern s32 D_801BFB3C; +extern s32 D_801BFB48; + +void func_8013CABC(void) { + D_801BFB44 = 1; + D_801BFB38 = 1; + D_801BFB3C = 0; + D_801BFB48 = 1; +} + + + +extern s32 D_801BFB38; +extern s32 D_801BFB3C; +extern s32 D_801BFB40; +extern s32 D_801BFB44; +extern s32 D_801BFB48; + +void func_8013CAE8(void) { + D_801BFB38 = 1; + D_801BFB44 = 0; + D_801BFB3C = 0; + D_801BFB40 = -1; + D_801BFB48 = 0; +} + + + +extern s32 D_801BFB44; +extern s32 D_801BFB48; +extern s32 D_801BFB70; +extern s32 D_801BFB74; + +void func_8013CB20(void) +{ + D_801BFB70 = D_801BFB48; + D_801BFB74 = D_801BFB44; + D_801BFB48 = 1; + D_801BFB44 = 0; +} + + + +extern s32 D_801BFB70; +extern s32 D_801BFB74; +extern s32 D_801BFB48; +extern s32 D_801BFB44; + +void func_8013CB5C(void) { + D_801BFB48 = D_801BFB70; + D_801BFB44 = D_801BFB74; +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C15D8; + extern u8 D_801C15D9; + extern u8 D_801C15DA; + extern u8 D_801C15DB; + extern u8 D_801C15DC; + extern u8 D_801C15DD; + extern u8 D_801C15DE; + extern u8 D_801C15DF; + extern u8 D_801C15E0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C15D8; t1 = D_801C15D9; t2 = D_801C15DA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C15DB; t1 = D_801C15DC; t2 = D_801C15DD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C15DE; t1 = D_801C15DF; t2 = D_801C15E0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801BFB50; +extern s32 D_801BFB38; +extern s32 D_801BFB54; +extern s32 D_801BFB44; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801BFB50 != 0) { + if (D_801BFB50 != 2) { + if (((D_801BFB50 < 3) && (D_801BFB50 == 1)) && + (D_801BFB54 = D_801BFB54 + 1, 0x23a < D_801BFB54)) { + D_801BFB38 = D_801BFB50; + D_801BFB50 = 2; + } + } else { + D_801BFB38 = D_801BFB38 + -1; + if (D_801BFB38 == 0) { + D_801BFB38 = D_801BFB50; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801BFB44 == 0) { + D_801BFB50 = D_801BFB50 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801BFB44; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801BFB44; +} + + + +extern s32 D_801BFB50; + +void func_8013D164(void) { + D_801BFB50 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C16C0; +extern u8 D_801C1736; +extern u8 D_801C15E2; +extern u8 D_801C169C; +extern u8 D_801C15C0; +extern u8 D_801C15E1; +extern s32 D_801C16A0; + +void func_8013D330(void) { + if ((D_801C16C0 & 0xff) != D_801C1736) { + D_801C16C0 = ((D_801C16C0 & 0xff) < D_801C1736) ? (D_801C16C0 + 1) : (D_801C16C0 - 1); + } + if ((D_801C15E2 & 0xff) != D_801C169C) { + D_801C15E2 = ((D_801C15E2 & 0xff) < D_801C169C) ? (D_801C15E2 + 1) : (D_801C15E2 - 1); + } + if ((D_801C15C0 & 0xff) != D_801C15E1) { + D_801C15C0 = ((D_801C15C0 & 0xff) < D_801C15E1) ? (D_801C15C0 + 1) : (D_801C15C0 - 1); + } + D_801C16A0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801BFB28; +extern void *D_801BFB2C; +extern void *D_801BFB30; +extern s32 D_801BFB58; +extern s32 D_801BFB5C; +extern s32 D_801BFB60; +extern s32 D_801C1614[]; + +extern u8 D_80188C30[]; +extern u8 D_80188CD8[]; +extern u8 D_80188B88[]; +extern u8 D_80188C84[]; +extern u8 D_80188D04[]; +extern u8 D_80188BDC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801BFB58 = param_2; + D_801BFB5C = (param_2 >> 2) & 3; + D_801BFB60 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801BFB28 = D_80188C30; + D_801BFB2C = D_80188CD8; + D_801BFB30 = D_80188B88; + } else { + D_801BFB28 = D_80188C84; + D_801BFB2C = D_80188D04; + D_801BFB30 = D_80188BDC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801BFB60 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801BFB58 & 2) != 0) { + D_801C1614[0] = 0x140; + D_801C1614[3] = 0x80; + if (p[0x37] == 4) { + D_801C1614[0] = 0x140; + D_801C1614[3] = 0; + } + if (p[0x37] == 0) { + D_801C1614[0] = 0x140; + D_801C1614[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801BFB30)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801BFB30; +extern s16 *D_801BFB34; +extern s32 D_801BFB44; +extern s32 D_801BFB64; +extern s32 D_801BFB68; +extern s32 D_801BFB6C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801BFB34 != 0) { + D_801BFB44 = 0; + p = (int *)(param_1 * 12 + (int)D_801BFB30); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801BFB64 != x) { + flag = 1; + if (D_801BFB64 < x) { + if (x - D_801BFB64 < 5) { + D_801BFB64 = x; + } else { + D_801BFB64 = D_801BFB64 + 4; + } + } else { + if (D_801BFB64 - x < 5) { + D_801BFB64 = x; + } else { + D_801BFB64 = D_801BFB64 - 4; + } + } + } + if (D_801BFB68 != y) { + flag = 1; + if (D_801BFB68 < y) { + if (y - D_801BFB68 < 5) { + D_801BFB68 = y; + } else { + D_801BFB68 = D_801BFB68 + 4; + } + } else { + if (D_801BFB68 - y < 5) { + D_801BFB68 = y; + } else { + D_801BFB68 = D_801BFB68 - 4; + } + } + } + if (D_801BFB6C != z) { + flag = 1; + if (D_801BFB6C < z) { + if (z - D_801BFB6C < 5) { + D_801BFB6C = z; + } else { + D_801BFB6C = D_801BFB6C + 4; + } + } else { + if (D_801BFB6C - z < 5) { + D_801BFB6C = z; + } else { + D_801BFB6C = D_801BFB6C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801BFB44 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80188D94[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801BFB34); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BFB64); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BFB68); + uVar5 = (*(int*)&D_801BFB6C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80188D94); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801BFB4C; + +s32 func_8013E054(void) { + return D_801BFB4C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80189790; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80189768; +extern s16 D_8018976A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80189790; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80189768 = 2; + D_8018976A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018976A = 0; + D_80189768 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801BFB80; + extern void * D_801BFB84; + extern unsigned char D_80189408; + extern unsigned char D_80189420; + extern unsigned char D_80189494; + extern unsigned char D_8018949C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801BFB80 = &D_80189408; + D_801BFB84 = &D_80189494; + } else { + D_801BFB80 = &D_80189420; + D_801BFB84 = &D_8018949C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80189790/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80189790 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80189790)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018976C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018976C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018976C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80189768; +extern s16 D_8018976A; +extern unsigned char D_8018976C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018976A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80189768` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018976A; + if (*r < 3) { + *r = *r + 1; + } + D_80189768 = (u16)D_80189768 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018976C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018976C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018976C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_003/ov_SC04_003_jr_8012ACE0.c b/src/ov_SC04_003/ov_SC04_003_jr_8012ACE0.c index 83984a05e..115c8c03c 100644 --- a/src/ov_SC04_003/ov_SC04_003_jr_8012ACE0.c +++ b/src/ov_SC04_003/ov_SC04_003_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182790[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182790[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801827D4; -extern u8 D_80182818; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801827D4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182818 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018285C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182898[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182898; - if (((s16)a1) < 0xC00) { - tbl = D_8018285C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801828D4, D_801828D6, D_801828D8, D_801828DA, D_801828DC, D_801828DE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801828D6 < ang)) goto outer_else; - if (!(ang < D_801828DC)) goto inner_else; - if (ang < D_801828D8) { *(s16 *)L = D_801828D8; goto done; } - if (D_801828DA < ang) { *(s16 *)L = D_801828DA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801828D4) { *(s16 *)L = D_801828D4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801828DE < ang) { *(s16 *)L = D_801828DE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019A788; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019A788, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019A788; -extern s8 D_8019A78C; -extern s8 D_8019A78D; - -void func_8013C9C4(void * arg0) -{ - D_8019A788 = arg0; - D_8019A78C = 0; - D_8019A78D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019A788; -extern s8 D_8019A78C; -extern s8 D_8019A78D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019A788; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019A78D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019A78C)) * 2) + D_8019A788); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019A78D = (unsigned char) p[1]; - D_8019A78C = D_8019A78C + 1; - if (D_8019A78D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019A78C = 0; - *base = 0; - } - } - else - { - D_8019A78D = c - 1; - } - } - return; -} - - - -extern s32 D_8019A7AC; -extern s32 D_8019A7A0; -extern s32 D_8019A7A4; -extern s32 D_8019A7B0; - -void func_8013CABC(void) { - D_8019A7AC = 1; - D_8019A7A0 = 1; - D_8019A7A4 = 0; - D_8019A7B0 = 1; -} - - - -extern s32 D_8019A7A0; -extern s32 D_8019A7A4; -extern s32 D_8019A7A8; -extern s32 D_8019A7AC; -extern s32 D_8019A7B0; - -void func_8013CAE8(void) { - D_8019A7A0 = 1; - D_8019A7AC = 0; - D_8019A7A4 = 0; - D_8019A7A8 = -1; - D_8019A7B0 = 0; -} - - - -extern s32 D_8019A7AC; -extern s32 D_8019A7B0; -extern s32 D_8019A7D8; -extern s32 D_8019A7DC; - -void func_8013CB20(void) -{ - D_8019A7D8 = D_8019A7B0; - D_8019A7DC = D_8019A7AC; - D_8019A7B0 = 1; - D_8019A7AC = 0; -} - - - -extern s32 D_8019A7D8; -extern s32 D_8019A7DC; -extern s32 D_8019A7B0; -extern s32 D_8019A7AC; - -void func_8013CB5C(void) { - D_8019A7B0 = D_8019A7D8; - D_8019A7AC = D_8019A7DC; -} - - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019BA98; - extern u8 D_8019BA99; - extern u8 D_8019BA9A; - extern u8 D_8019BA9B; - extern u8 D_8019BA9C; - extern u8 D_8019BA9D; - extern u8 D_8019BA9E; - extern u8 D_8019BA9F; - extern u8 D_8019BAA0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019BA98; t1 = D_8019BA99; t2 = D_8019BA9A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019BA9B; t1 = D_8019BA9C; t2 = D_8019BA9D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019BA9E; t1 = D_8019BA9F; t2 = D_8019BAA0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019A7B8; -extern s32 D_8019A7A0; -extern s32 D_8019A7BC; -extern s32 D_8019A7AC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019A7B8 != 0) { - if (D_8019A7B8 != 2) { - if (((D_8019A7B8 < 3) && (D_8019A7B8 == 1)) && - (D_8019A7BC = D_8019A7BC + 1, 0x23a < D_8019A7BC)) { - D_8019A7A0 = D_8019A7B8; - D_8019A7B8 = 2; - } - } else { - D_8019A7A0 = D_8019A7A0 + -1; - if (D_8019A7A0 == 0) { - D_8019A7A0 = D_8019A7B8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019A7AC == 0) { - D_8019A7B8 = D_8019A7B8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019A7AC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019A7AC; -} - - - -extern s32 D_8019A7B8; - -void func_8013D164(void) { - D_8019A7B8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019BB7A; -extern u8 D_8019BBEE; -extern u8 D_8019BAA2; -extern u8 D_8019BB5C; -extern u8 D_8019BA80; -extern u8 D_8019BAA1; -extern s32 D_8019BB60; - -void func_8013D330(void) { - if ((D_8019BB7A & 0xff) != D_8019BBEE) { - D_8019BB7A = ((D_8019BB7A & 0xff) < D_8019BBEE) ? (D_8019BB7A + 1) : (D_8019BB7A - 1); - } - if ((D_8019BAA2 & 0xff) != D_8019BB5C) { - D_8019BAA2 = ((D_8019BAA2 & 0xff) < D_8019BB5C) ? (D_8019BAA2 + 1) : (D_8019BAA2 - 1); - } - if ((D_8019BA80 & 0xff) != D_8019BAA1) { - D_8019BA80 = ((D_8019BA80 & 0xff) < D_8019BAA1) ? (D_8019BA80 + 1) : (D_8019BA80 - 1); - } - D_8019BB60 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019A790; -extern void *D_8019A794; -extern void *D_8019A798; -extern s32 D_8019A7C0; -extern s32 D_8019A7C4; -extern s32 D_8019A7C8; -extern s32 D_8019BAD4[]; - -extern u8 D_801829CC[]; -extern u8 D_80182A74[]; -extern u8 D_80182924[]; -extern u8 D_80182A20[]; -extern u8 D_80182AA0[]; -extern u8 D_80182978[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019A7C0 = param_2; - D_8019A7C4 = (param_2 >> 2) & 3; - D_8019A7C8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019A790 = D_801829CC; - D_8019A794 = D_80182A74; - D_8019A798 = D_80182924; - } else { - D_8019A790 = D_80182A20; - D_8019A794 = D_80182AA0; - D_8019A798 = D_80182978; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019A7C8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019A7C0 & 2) != 0) { - D_8019BAD4[0] = 0x140; - D_8019BAD4[3] = 0x80; - if (p[0x37] == 4) { - D_8019BAD4[0] = 0x140; - D_8019BAD4[3] = 0; - } - if (p[0x37] == 0) { - D_8019BAD4[0] = 0x140; - D_8019BAD4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019A798)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019A798; -extern s16 *D_8019A79C; -extern s32 D_8019A7AC; -extern s32 D_8019A7CC; -extern s32 D_8019A7D0; -extern s32 D_8019A7D4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019A79C != 0) { - D_8019A7AC = 0; - p = (int *)(param_1 * 12 + (int)D_8019A798); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019A7CC != x) { - flag = 1; - if (D_8019A7CC < x) { - if (x - D_8019A7CC < 5) { - D_8019A7CC = x; - } else { - D_8019A7CC = D_8019A7CC + 4; - } - } else { - if (D_8019A7CC - x < 5) { - D_8019A7CC = x; - } else { - D_8019A7CC = D_8019A7CC - 4; - } - } - } - if (D_8019A7D0 != y) { - flag = 1; - if (D_8019A7D0 < y) { - if (y - D_8019A7D0 < 5) { - D_8019A7D0 = y; - } else { - D_8019A7D0 = D_8019A7D0 + 4; - } - } else { - if (D_8019A7D0 - y < 5) { - D_8019A7D0 = y; - } else { - D_8019A7D0 = D_8019A7D0 - 4; - } - } - } - if (D_8019A7D4 != z) { - flag = 1; - if (D_8019A7D4 < z) { - if (z - D_8019A7D4 < 5) { - D_8019A7D4 = z; - } else { - D_8019A7D4 = D_8019A7D4 + 4; - } - } else { - if (D_8019A7D4 - z < 5) { - D_8019A7D4 = z; - } else { - D_8019A7D4 = D_8019A7D4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019A7AC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182B30[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019A79C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019A7CC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019A7D0); - uVar5 = (*(int*)&D_8019A7D4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182B30); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019A7B4; - -s32 func_8013E054(void) { - return D_8019A7B4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018352C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183504; -extern s16 D_80183506; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018352C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183504 = 2; - D_80183506 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80183506 = 0; - D_80183504 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019A7E8; - extern void * D_8019A7EC; - extern unsigned char D_801831A4; - extern unsigned char D_801831BC; - extern unsigned char D_80183230; - extern unsigned char D_80183238; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019A7E8 = &D_801831A4; - D_8019A7EC = &D_80183230; - } else { - D_8019A7E8 = &D_801831BC; - D_8019A7EC = &D_80183238; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018352C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018352C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018352C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80183508; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183508)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183508)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183504; -extern s16 D_80183506; -extern unsigned char D_80183508; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183506` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183504` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80183506; - if (*r < 3) { - *r = *r + 1; - } - D_80183504 = (u16)D_80183504 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183508); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80183508; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183508); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_003/ov_SC04_003_jr_801380E0.c b/src/ov_SC04_003/ov_SC04_003_jr_801380E0.c new file mode 100644 index 000000000..1d2ca3afc --- /dev/null +++ b/src/ov_SC04_003/ov_SC04_003_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80199540; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182424[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019A6A4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019BB80; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80199540; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182160)(); +extern s16 (*D_80182164)(); +extern M2C_UNK (*D_8018216C)(); +extern s32 (*D_80182170)(); +extern s32 D_8019A6A0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80199544; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801824B8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018599C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801824D0; +extern M2C_UNK D_801824D8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801824E0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801824FC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80182508[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018251C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018256C[]; +extern s16 D_8018259C[]; +extern s16 D_801825FC[]; +extern s16 D_80182604[]; +extern s16 D_80182624[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018265C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801826B4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801826FC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182704[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018270C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182714[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801826BC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801826DC; +extern void func_801321B0(int param_1); +extern int D_801826EC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019A710; +extern s32 D_8019A714[]; +extern int D_8019A718; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182720; +extern u8 D_8018271C; +extern s16 *D_80182724; +extern u8 D_80182728; +extern int D_8019A710; +extern u16 D_8019A720; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182724; /* holds a pointer value (*(u16**)&D_80182724) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182738[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018278C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182790[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182790[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801827D4; +extern u8 D_80182818; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801827D4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182818 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018285C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182898[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182898; + if (((s16)a1) < 0xC00) { + tbl = D_8018285C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801828D4, D_801828D6, D_801828D8, D_801828DA, D_801828DC, D_801828DE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801828D6 < ang)) goto outer_else; + if (!(ang < D_801828DC)) goto inner_else; + if (ang < D_801828D8) { *(s16 *)L = D_801828D8; goto done; } + if (D_801828DA < ang) { *(s16 *)L = D_801828DA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801828D4) { *(s16 *)L = D_801828D4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801828DE < ang) { *(s16 *)L = D_801828DE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019A788; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019A788, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019A788; +extern s8 D_8019A78C; +extern s8 D_8019A78D; + +void func_8013C9C4(void * arg0) +{ + D_8019A788 = arg0; + D_8019A78C = 0; + D_8019A78D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019A788; +extern s8 D_8019A78C; +extern s8 D_8019A78D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019A788; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019A78D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019A78C)) * 2) + D_8019A788); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019A78D = (unsigned char) p[1]; + D_8019A78C = D_8019A78C + 1; + if (D_8019A78D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019A78C = 0; + *base = 0; + } + } + else + { + D_8019A78D = c - 1; + } + } + return; +} + + + +extern s32 D_8019A7AC; +extern s32 D_8019A7A0; +extern s32 D_8019A7A4; +extern s32 D_8019A7B0; + +void func_8013CABC(void) { + D_8019A7AC = 1; + D_8019A7A0 = 1; + D_8019A7A4 = 0; + D_8019A7B0 = 1; +} + + + +extern s32 D_8019A7A0; +extern s32 D_8019A7A4; +extern s32 D_8019A7A8; +extern s32 D_8019A7AC; +extern s32 D_8019A7B0; + +void func_8013CAE8(void) { + D_8019A7A0 = 1; + D_8019A7AC = 0; + D_8019A7A4 = 0; + D_8019A7A8 = -1; + D_8019A7B0 = 0; +} + + + +extern s32 D_8019A7AC; +extern s32 D_8019A7B0; +extern s32 D_8019A7D8; +extern s32 D_8019A7DC; + +void func_8013CB20(void) +{ + D_8019A7D8 = D_8019A7B0; + D_8019A7DC = D_8019A7AC; + D_8019A7B0 = 1; + D_8019A7AC = 0; +} + + + +extern s32 D_8019A7D8; +extern s32 D_8019A7DC; +extern s32 D_8019A7B0; +extern s32 D_8019A7AC; + +void func_8013CB5C(void) { + D_8019A7B0 = D_8019A7D8; + D_8019A7AC = D_8019A7DC; +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019BA98; + extern u8 D_8019BA99; + extern u8 D_8019BA9A; + extern u8 D_8019BA9B; + extern u8 D_8019BA9C; + extern u8 D_8019BA9D; + extern u8 D_8019BA9E; + extern u8 D_8019BA9F; + extern u8 D_8019BAA0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019BA98; t1 = D_8019BA99; t2 = D_8019BA9A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019BA9B; t1 = D_8019BA9C; t2 = D_8019BA9D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019BA9E; t1 = D_8019BA9F; t2 = D_8019BAA0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019A7B8; +extern s32 D_8019A7A0; +extern s32 D_8019A7BC; +extern s32 D_8019A7AC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019A7B8 != 0) { + if (D_8019A7B8 != 2) { + if (((D_8019A7B8 < 3) && (D_8019A7B8 == 1)) && + (D_8019A7BC = D_8019A7BC + 1, 0x23a < D_8019A7BC)) { + D_8019A7A0 = D_8019A7B8; + D_8019A7B8 = 2; + } + } else { + D_8019A7A0 = D_8019A7A0 + -1; + if (D_8019A7A0 == 0) { + D_8019A7A0 = D_8019A7B8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019A7AC == 0) { + D_8019A7B8 = D_8019A7B8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019A7AC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019A7AC; +} + + + +extern s32 D_8019A7B8; + +void func_8013D164(void) { + D_8019A7B8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019BB7A; +extern u8 D_8019BBEE; +extern u8 D_8019BAA2; +extern u8 D_8019BB5C; +extern u8 D_8019BA80; +extern u8 D_8019BAA1; +extern s32 D_8019BB60; + +void func_8013D330(void) { + if ((D_8019BB7A & 0xff) != D_8019BBEE) { + D_8019BB7A = ((D_8019BB7A & 0xff) < D_8019BBEE) ? (D_8019BB7A + 1) : (D_8019BB7A - 1); + } + if ((D_8019BAA2 & 0xff) != D_8019BB5C) { + D_8019BAA2 = ((D_8019BAA2 & 0xff) < D_8019BB5C) ? (D_8019BAA2 + 1) : (D_8019BAA2 - 1); + } + if ((D_8019BA80 & 0xff) != D_8019BAA1) { + D_8019BA80 = ((D_8019BA80 & 0xff) < D_8019BAA1) ? (D_8019BA80 + 1) : (D_8019BA80 - 1); + } + D_8019BB60 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019A790; +extern void *D_8019A794; +extern void *D_8019A798; +extern s32 D_8019A7C0; +extern s32 D_8019A7C4; +extern s32 D_8019A7C8; +extern s32 D_8019BAD4[]; + +extern u8 D_801829CC[]; +extern u8 D_80182A74[]; +extern u8 D_80182924[]; +extern u8 D_80182A20[]; +extern u8 D_80182AA0[]; +extern u8 D_80182978[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019A7C0 = param_2; + D_8019A7C4 = (param_2 >> 2) & 3; + D_8019A7C8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019A790 = D_801829CC; + D_8019A794 = D_80182A74; + D_8019A798 = D_80182924; + } else { + D_8019A790 = D_80182A20; + D_8019A794 = D_80182AA0; + D_8019A798 = D_80182978; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019A7C8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019A7C0 & 2) != 0) { + D_8019BAD4[0] = 0x140; + D_8019BAD4[3] = 0x80; + if (p[0x37] == 4) { + D_8019BAD4[0] = 0x140; + D_8019BAD4[3] = 0; + } + if (p[0x37] == 0) { + D_8019BAD4[0] = 0x140; + D_8019BAD4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019A798)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019A798; +extern s16 *D_8019A79C; +extern s32 D_8019A7AC; +extern s32 D_8019A7CC; +extern s32 D_8019A7D0; +extern s32 D_8019A7D4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019A79C != 0) { + D_8019A7AC = 0; + p = (int *)(param_1 * 12 + (int)D_8019A798); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019A7CC != x) { + flag = 1; + if (D_8019A7CC < x) { + if (x - D_8019A7CC < 5) { + D_8019A7CC = x; + } else { + D_8019A7CC = D_8019A7CC + 4; + } + } else { + if (D_8019A7CC - x < 5) { + D_8019A7CC = x; + } else { + D_8019A7CC = D_8019A7CC - 4; + } + } + } + if (D_8019A7D0 != y) { + flag = 1; + if (D_8019A7D0 < y) { + if (y - D_8019A7D0 < 5) { + D_8019A7D0 = y; + } else { + D_8019A7D0 = D_8019A7D0 + 4; + } + } else { + if (D_8019A7D0 - y < 5) { + D_8019A7D0 = y; + } else { + D_8019A7D0 = D_8019A7D0 - 4; + } + } + } + if (D_8019A7D4 != z) { + flag = 1; + if (D_8019A7D4 < z) { + if (z - D_8019A7D4 < 5) { + D_8019A7D4 = z; + } else { + D_8019A7D4 = D_8019A7D4 + 4; + } + } else { + if (D_8019A7D4 - z < 5) { + D_8019A7D4 = z; + } else { + D_8019A7D4 = D_8019A7D4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019A7AC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182B30[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019A79C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019A7CC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019A7D0); + uVar5 = (*(int*)&D_8019A7D4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182B30); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019A7B4; + +s32 func_8013E054(void) { + return D_8019A7B4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018352C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183504; +extern s16 D_80183506; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018352C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183504 = 2; + D_80183506 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80183506 = 0; + D_80183504 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019A7E8; + extern void * D_8019A7EC; + extern unsigned char D_801831A4; + extern unsigned char D_801831BC; + extern unsigned char D_80183230; + extern unsigned char D_80183238; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019A7E8 = &D_801831A4; + D_8019A7EC = &D_80183230; + } else { + D_8019A7E8 = &D_801831BC; + D_8019A7EC = &D_80183238; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018352C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018352C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018352C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80183508; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183508)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183508)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183504; +extern s16 D_80183506; +extern unsigned char D_80183508; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183506` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183504` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80183506; + if (*r < 3) { + *r = *r + 1; + } + D_80183504 = (u16)D_80183504 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183508); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80183508; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183508); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_004/ov_SC04_004_jr_8012ACE0.c b/src/ov_SC04_004/ov_SC04_004_jr_8012ACE0.c index d69657fff..364c55ea7 100644 --- a/src/ov_SC04_004/ov_SC04_004_jr_8012ACE0.c +++ b/src/ov_SC04_004/ov_SC04_004_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184CC4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184CC4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184D08; -extern u8 D_80184D4C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184D08; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184D4C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184D90[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80184DCC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80184DCC; - if (((s16)a1) < 0xC00) { - tbl = D_80184D90; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80184E08, D_80184E0A, D_80184E0C, D_80184E0E, D_80184E10, D_80184E12; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80184E0A < ang)) goto outer_else; - if (!(ang < D_80184E10)) goto inner_else; - if (ang < D_80184E0C) { *(s16 *)L = D_80184E0C; goto done; } - if (D_80184E0E < ang) { *(s16 *)L = D_80184E0E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80184E08) { *(s16 *)L = D_80184E08; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80184E12 < ang) { *(s16 *)L = D_80184E12; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B2588; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B2588, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B2588; -extern s8 D_801B258C; -extern s8 D_801B258D; - -void func_8013C9C4(void * arg0) -{ - D_801B2588 = arg0; - D_801B258C = 0; - D_801B258D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B2588; -extern s8 D_801B258C; -extern s8 D_801B258D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B2588; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B258D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B258C)) * 2) + D_801B2588); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B258D = (unsigned char) p[1]; - D_801B258C = D_801B258C + 1; - if (D_801B258D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B258C = 0; - *base = 0; - } - } - else - { - D_801B258D = c - 1; - } - } - return; -} - - - -extern s32 D_801B25AC; -extern s32 D_801B25A0; -extern s32 D_801B25A4; -extern s32 D_801B25B0; - -void func_8013CABC(void) { - D_801B25AC = 1; - D_801B25A0 = 1; - D_801B25A4 = 0; - D_801B25B0 = 1; -} - - - -extern s32 D_801B25A0; -extern s32 D_801B25A4; -extern s32 D_801B25A8; -extern s32 D_801B25AC; -extern s32 D_801B25B0; - -void func_8013CAE8(void) { - D_801B25A0 = 1; - D_801B25AC = 0; - D_801B25A4 = 0; - D_801B25A8 = -1; - D_801B25B0 = 0; -} - - - -extern s32 D_801B25AC; -extern s32 D_801B25B0; -extern s32 D_801B25D8; -extern s32 D_801B25DC; - -void func_8013CB20(void) -{ - D_801B25D8 = D_801B25B0; - D_801B25DC = D_801B25AC; - D_801B25B0 = 1; - D_801B25AC = 0; -} - - - -extern s32 D_801B25D8; -extern s32 D_801B25DC; -extern s32 D_801B25B0; -extern s32 D_801B25AC; - -void func_8013CB5C(void) { - D_801B25B0 = D_801B25D8; - D_801B25AC = D_801B25DC; -} - - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B3AF8; - extern u8 D_801B3AF9; - extern u8 D_801B3AFA; - extern u8 D_801B3AFB; - extern u8 D_801B3AFC; - extern u8 D_801B3AFD; - extern u8 D_801B3AFE; - extern u8 D_801B3AFF; - extern u8 D_801B3B00; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B3AF8; t1 = D_801B3AF9; t2 = D_801B3AFA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B3AFB; t1 = D_801B3AFC; t2 = D_801B3AFD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B3AFE; t1 = D_801B3AFF; t2 = D_801B3B00; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B25B8; -extern s32 D_801B25A0; -extern s32 D_801B25BC; -extern s32 D_801B25AC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B25B8 != 0) { - if (D_801B25B8 != 2) { - if (((D_801B25B8 < 3) && (D_801B25B8 == 1)) && - (D_801B25BC = D_801B25BC + 1, 0x23a < D_801B25BC)) { - D_801B25A0 = D_801B25B8; - D_801B25B8 = 2; - } - } else { - D_801B25A0 = D_801B25A0 + -1; - if (D_801B25A0 == 0) { - D_801B25A0 = D_801B25B8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B25AC == 0) { - D_801B25B8 = D_801B25B8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B25AC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B25AC; -} - - - -extern s32 D_801B25B8; - -void func_8013D164(void) { - D_801B25B8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B3BE0; -extern u8 D_801B3C56; -extern u8 D_801B3B02; -extern u8 D_801B3BBC; -extern u8 D_801B3AE0; -extern u8 D_801B3B01; -extern s32 D_801B3BC0; - -void func_8013D330(void) { - if ((D_801B3BE0 & 0xff) != D_801B3C56) { - D_801B3BE0 = ((D_801B3BE0 & 0xff) < D_801B3C56) ? (D_801B3BE0 + 1) : (D_801B3BE0 - 1); - } - if ((D_801B3B02 & 0xff) != D_801B3BBC) { - D_801B3B02 = ((D_801B3B02 & 0xff) < D_801B3BBC) ? (D_801B3B02 + 1) : (D_801B3B02 - 1); - } - if ((D_801B3AE0 & 0xff) != D_801B3B01) { - D_801B3AE0 = ((D_801B3AE0 & 0xff) < D_801B3B01) ? (D_801B3AE0 + 1) : (D_801B3AE0 - 1); - } - D_801B3BC0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B2590; -extern void *D_801B2594; -extern void *D_801B2598; -extern s32 D_801B25C0; -extern s32 D_801B25C4; -extern s32 D_801B25C8; -extern s32 D_801B3B34[]; - -extern u8 D_80184F00[]; -extern u8 D_80184FA8[]; -extern u8 D_80184E58[]; -extern u8 D_80184F54[]; -extern u8 D_80184FD4[]; -extern u8 D_80184EAC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B25C0 = param_2; - D_801B25C4 = (param_2 >> 2) & 3; - D_801B25C8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B2590 = D_80184F00; - D_801B2594 = D_80184FA8; - D_801B2598 = D_80184E58; - } else { - D_801B2590 = D_80184F54; - D_801B2594 = D_80184FD4; - D_801B2598 = D_80184EAC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B25C8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B25C0 & 2) != 0) { - D_801B3B34[0] = 0x140; - D_801B3B34[3] = 0x80; - if (p[0x37] == 4) { - D_801B3B34[0] = 0x140; - D_801B3B34[3] = 0; - } - if (p[0x37] == 0) { - D_801B3B34[0] = 0x140; - D_801B3B34[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B2598)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B2598; -extern s16 *D_801B259C; -extern s32 D_801B25AC; -extern s32 D_801B25CC; -extern s32 D_801B25D0; -extern s32 D_801B25D4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B259C != 0) { - D_801B25AC = 0; - p = (int *)(param_1 * 12 + (int)D_801B2598); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B25CC != x) { - flag = 1; - if (D_801B25CC < x) { - if (x - D_801B25CC < 5) { - D_801B25CC = x; - } else { - D_801B25CC = D_801B25CC + 4; - } - } else { - if (D_801B25CC - x < 5) { - D_801B25CC = x; - } else { - D_801B25CC = D_801B25CC - 4; - } - } - } - if (D_801B25D0 != y) { - flag = 1; - if (D_801B25D0 < y) { - if (y - D_801B25D0 < 5) { - D_801B25D0 = y; - } else { - D_801B25D0 = D_801B25D0 + 4; - } - } else { - if (D_801B25D0 - y < 5) { - D_801B25D0 = y; - } else { - D_801B25D0 = D_801B25D0 - 4; - } - } - } - if (D_801B25D4 != z) { - flag = 1; - if (D_801B25D4 < z) { - if (z - D_801B25D4 < 5) { - D_801B25D4 = z; - } else { - D_801B25D4 = D_801B25D4 + 4; - } - } else { - if (D_801B25D4 - z < 5) { - D_801B25D4 = z; - } else { - D_801B25D4 = D_801B25D4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B25AC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185064[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B259C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B25CC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B25D0); - uVar5 = (*(int*)&D_801B25D4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185064); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B25B4; - -s32 func_8013E054(void) { - return D_801B25B4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80185A60; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80185A38; -extern s16 D_80185A3A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80185A60; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80185A38 = 2; - D_80185A3A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80185A3A = 0; - D_80185A38 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B25E8; - extern void * D_801B25EC; - extern unsigned char D_801856D8; - extern unsigned char D_801856F0; - extern unsigned char D_80185764; - extern unsigned char D_8018576C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B25E8 = &D_801856D8; - D_801B25EC = &D_80185764; - } else { - D_801B25E8 = &D_801856F0; - D_801B25EC = &D_8018576C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80185A60/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185A60 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80185A60)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80185A3C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185A3C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185A3C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80185A38; -extern s16 D_80185A3A; -extern unsigned char D_80185A3C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185A3A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80185A38` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80185A3A; - if (*r < 3) { - *r = *r + 1; - } - D_80185A38 = (u16)D_80185A38 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185A3C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80185A3C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185A3C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_004/ov_SC04_004_jr_801380E0.c b/src/ov_SC04_004/ov_SC04_004_jr_801380E0.c new file mode 100644 index 000000000..872f9bd55 --- /dev/null +++ b/src/ov_SC04_004/ov_SC04_004_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B133C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184958[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B24A4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B3BE8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B133C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184694)(); +extern s16 (*D_80184698)(); +extern M2C_UNK (*D_801846A0)(); +extern s32 (*D_801846A4)(); +extern s32 D_801B24A0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B1340; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801849EC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187ED0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184A04; +extern M2C_UNK D_80184A0C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184A14; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80184A30[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80184A3C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80184A50[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184AA0[]; +extern s16 D_80184AD0[]; +extern s16 D_80184B30[]; +extern s16 D_80184B38[]; +extern s16 D_80184B58[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184B90[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80184BE8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80184C30[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80184C38[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184C40[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184C48[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184BF0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184C10; +extern void func_801321B0(int param_1); +extern int D_80184C20; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B2510; +extern s32 D_801B2514[]; +extern int D_801B2518; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184C54; +extern u8 D_80184C50; +extern s16 *D_80184C58; +extern u8 D_80184C5C; +extern int D_801B2510; +extern u16 D_801B2520; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184C58; /* holds a pointer value (*(u16**)&D_80184C58) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184C6C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184CC0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184CC4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184CC4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184D08; +extern u8 D_80184D4C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184D08; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184D4C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184D90[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80184DCC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80184DCC; + if (((s16)a1) < 0xC00) { + tbl = D_80184D90; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80184E08, D_80184E0A, D_80184E0C, D_80184E0E, D_80184E10, D_80184E12; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184E0A < ang)) goto outer_else; + if (!(ang < D_80184E10)) goto inner_else; + if (ang < D_80184E0C) { *(s16 *)L = D_80184E0C; goto done; } + if (D_80184E0E < ang) { *(s16 *)L = D_80184E0E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184E08) { *(s16 *)L = D_80184E08; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184E12 < ang) { *(s16 *)L = D_80184E12; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B2588; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B2588, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B2588; +extern s8 D_801B258C; +extern s8 D_801B258D; + +void func_8013C9C4(void * arg0) +{ + D_801B2588 = arg0; + D_801B258C = 0; + D_801B258D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B2588; +extern s8 D_801B258C; +extern s8 D_801B258D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B2588; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B258D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B258C)) * 2) + D_801B2588); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B258D = (unsigned char) p[1]; + D_801B258C = D_801B258C + 1; + if (D_801B258D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B258C = 0; + *base = 0; + } + } + else + { + D_801B258D = c - 1; + } + } + return; +} + + + +extern s32 D_801B25AC; +extern s32 D_801B25A0; +extern s32 D_801B25A4; +extern s32 D_801B25B0; + +void func_8013CABC(void) { + D_801B25AC = 1; + D_801B25A0 = 1; + D_801B25A4 = 0; + D_801B25B0 = 1; +} + + + +extern s32 D_801B25A0; +extern s32 D_801B25A4; +extern s32 D_801B25A8; +extern s32 D_801B25AC; +extern s32 D_801B25B0; + +void func_8013CAE8(void) { + D_801B25A0 = 1; + D_801B25AC = 0; + D_801B25A4 = 0; + D_801B25A8 = -1; + D_801B25B0 = 0; +} + + + +extern s32 D_801B25AC; +extern s32 D_801B25B0; +extern s32 D_801B25D8; +extern s32 D_801B25DC; + +void func_8013CB20(void) +{ + D_801B25D8 = D_801B25B0; + D_801B25DC = D_801B25AC; + D_801B25B0 = 1; + D_801B25AC = 0; +} + + + +extern s32 D_801B25D8; +extern s32 D_801B25DC; +extern s32 D_801B25B0; +extern s32 D_801B25AC; + +void func_8013CB5C(void) { + D_801B25B0 = D_801B25D8; + D_801B25AC = D_801B25DC; +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B3AF8; + extern u8 D_801B3AF9; + extern u8 D_801B3AFA; + extern u8 D_801B3AFB; + extern u8 D_801B3AFC; + extern u8 D_801B3AFD; + extern u8 D_801B3AFE; + extern u8 D_801B3AFF; + extern u8 D_801B3B00; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B3AF8; t1 = D_801B3AF9; t2 = D_801B3AFA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B3AFB; t1 = D_801B3AFC; t2 = D_801B3AFD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B3AFE; t1 = D_801B3AFF; t2 = D_801B3B00; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B25B8; +extern s32 D_801B25A0; +extern s32 D_801B25BC; +extern s32 D_801B25AC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B25B8 != 0) { + if (D_801B25B8 != 2) { + if (((D_801B25B8 < 3) && (D_801B25B8 == 1)) && + (D_801B25BC = D_801B25BC + 1, 0x23a < D_801B25BC)) { + D_801B25A0 = D_801B25B8; + D_801B25B8 = 2; + } + } else { + D_801B25A0 = D_801B25A0 + -1; + if (D_801B25A0 == 0) { + D_801B25A0 = D_801B25B8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B25AC == 0) { + D_801B25B8 = D_801B25B8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B25AC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B25AC; +} + + + +extern s32 D_801B25B8; + +void func_8013D164(void) { + D_801B25B8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B3BE0; +extern u8 D_801B3C56; +extern u8 D_801B3B02; +extern u8 D_801B3BBC; +extern u8 D_801B3AE0; +extern u8 D_801B3B01; +extern s32 D_801B3BC0; + +void func_8013D330(void) { + if ((D_801B3BE0 & 0xff) != D_801B3C56) { + D_801B3BE0 = ((D_801B3BE0 & 0xff) < D_801B3C56) ? (D_801B3BE0 + 1) : (D_801B3BE0 - 1); + } + if ((D_801B3B02 & 0xff) != D_801B3BBC) { + D_801B3B02 = ((D_801B3B02 & 0xff) < D_801B3BBC) ? (D_801B3B02 + 1) : (D_801B3B02 - 1); + } + if ((D_801B3AE0 & 0xff) != D_801B3B01) { + D_801B3AE0 = ((D_801B3AE0 & 0xff) < D_801B3B01) ? (D_801B3AE0 + 1) : (D_801B3AE0 - 1); + } + D_801B3BC0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B2590; +extern void *D_801B2594; +extern void *D_801B2598; +extern s32 D_801B25C0; +extern s32 D_801B25C4; +extern s32 D_801B25C8; +extern s32 D_801B3B34[]; + +extern u8 D_80184F00[]; +extern u8 D_80184FA8[]; +extern u8 D_80184E58[]; +extern u8 D_80184F54[]; +extern u8 D_80184FD4[]; +extern u8 D_80184EAC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B25C0 = param_2; + D_801B25C4 = (param_2 >> 2) & 3; + D_801B25C8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B2590 = D_80184F00; + D_801B2594 = D_80184FA8; + D_801B2598 = D_80184E58; + } else { + D_801B2590 = D_80184F54; + D_801B2594 = D_80184FD4; + D_801B2598 = D_80184EAC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B25C8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B25C0 & 2) != 0) { + D_801B3B34[0] = 0x140; + D_801B3B34[3] = 0x80; + if (p[0x37] == 4) { + D_801B3B34[0] = 0x140; + D_801B3B34[3] = 0; + } + if (p[0x37] == 0) { + D_801B3B34[0] = 0x140; + D_801B3B34[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B2598)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B2598; +extern s16 *D_801B259C; +extern s32 D_801B25AC; +extern s32 D_801B25CC; +extern s32 D_801B25D0; +extern s32 D_801B25D4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B259C != 0) { + D_801B25AC = 0; + p = (int *)(param_1 * 12 + (int)D_801B2598); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B25CC != x) { + flag = 1; + if (D_801B25CC < x) { + if (x - D_801B25CC < 5) { + D_801B25CC = x; + } else { + D_801B25CC = D_801B25CC + 4; + } + } else { + if (D_801B25CC - x < 5) { + D_801B25CC = x; + } else { + D_801B25CC = D_801B25CC - 4; + } + } + } + if (D_801B25D0 != y) { + flag = 1; + if (D_801B25D0 < y) { + if (y - D_801B25D0 < 5) { + D_801B25D0 = y; + } else { + D_801B25D0 = D_801B25D0 + 4; + } + } else { + if (D_801B25D0 - y < 5) { + D_801B25D0 = y; + } else { + D_801B25D0 = D_801B25D0 - 4; + } + } + } + if (D_801B25D4 != z) { + flag = 1; + if (D_801B25D4 < z) { + if (z - D_801B25D4 < 5) { + D_801B25D4 = z; + } else { + D_801B25D4 = D_801B25D4 + 4; + } + } else { + if (D_801B25D4 - z < 5) { + D_801B25D4 = z; + } else { + D_801B25D4 = D_801B25D4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B25AC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185064[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B259C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B25CC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B25D0); + uVar5 = (*(int*)&D_801B25D4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185064); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B25B4; + +s32 func_8013E054(void) { + return D_801B25B4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80185A60; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80185A38; +extern s16 D_80185A3A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80185A60; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80185A38 = 2; + D_80185A3A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80185A3A = 0; + D_80185A38 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B25E8; + extern void * D_801B25EC; + extern unsigned char D_801856D8; + extern unsigned char D_801856F0; + extern unsigned char D_80185764; + extern unsigned char D_8018576C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B25E8 = &D_801856D8; + D_801B25EC = &D_80185764; + } else { + D_801B25E8 = &D_801856F0; + D_801B25EC = &D_8018576C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80185A60/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80185A60 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80185A60)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80185A3C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80185A3C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80185A3C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80185A38; +extern s16 D_80185A3A; +extern unsigned char D_80185A3C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80185A3A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80185A38` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80185A3A; + if (*r < 3) { + *r = *r + 1; + } + D_80185A38 = (u16)D_80185A38 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185A3C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80185A3C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80185A3C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_005/ov_SC04_005_jr_8012ACE0.c b/src/ov_SC04_005/ov_SC04_005_jr_8012ACE0.c index 6b00cd82a..314a6c979 100644 --- a/src/ov_SC04_005/ov_SC04_005_jr_8012ACE0.c +++ b/src/ov_SC04_005/ov_SC04_005_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801880F8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801880F8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018813C; -extern u8 D_80188180; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018813C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80188180 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801881C4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80188200[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80188200; - if (((s16)a1) < 0xC00) { - tbl = D_801881C4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018823C, D_8018823E, D_80188240, D_80188242, D_80188244, D_80188246; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018823E < ang)) goto outer_else; - if (!(ang < D_80188244)) goto inner_else; - if (ang < D_80188240) { *(s16 *)L = D_80188240; goto done; } - if (D_80188242 < ang) { *(s16 *)L = D_80188242; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018823C) { *(s16 *)L = D_8018823C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80188246 < ang) { *(s16 *)L = D_80188246; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C0760; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C0760, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C0760; -extern s8 D_801C0764; -extern s8 D_801C0765; - -void func_8013C9C4(void * arg0) -{ - D_801C0760 = arg0; - D_801C0764 = 0; - D_801C0765 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C0760; -extern s8 D_801C0764; -extern s8 D_801C0765; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C0760; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C0765; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C0764)) * 2) + D_801C0760); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C0765 = (unsigned char) p[1]; - D_801C0764 = D_801C0764 + 1; - if (D_801C0765 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C0764 = 0; - *base = 0; - } - } - else - { - D_801C0765 = c - 1; - } - } - return; -} - - - -extern s32 D_801C0784; -extern s32 D_801C0778; -extern s32 D_801C077C; -extern s32 D_801C0788; - -void func_8013CABC(void) { - D_801C0784 = 1; - D_801C0778 = 1; - D_801C077C = 0; - D_801C0788 = 1; -} - - - -extern s32 D_801C0778; -extern s32 D_801C077C; -extern s32 D_801C0780; -extern s32 D_801C0784; -extern s32 D_801C0788; - -void func_8013CAE8(void) { - D_801C0778 = 1; - D_801C0784 = 0; - D_801C077C = 0; - D_801C0780 = -1; - D_801C0788 = 0; -} - - - -extern s32 D_801C0784; -extern s32 D_801C0788; -extern s32 D_801C07B0; -extern s32 D_801C07B4; - -void func_8013CB20(void) -{ - D_801C07B0 = D_801C0788; - D_801C07B4 = D_801C0784; - D_801C0788 = 1; - D_801C0784 = 0; -} - - - -extern s32 D_801C07B0; -extern s32 D_801C07B4; -extern s32 D_801C0788; -extern s32 D_801C0784; - -void func_8013CB5C(void) { - D_801C0788 = D_801C07B0; - D_801C0784 = D_801C07B4; -} - - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C21D8; - extern u8 D_801C21D9; - extern u8 D_801C21DA; - extern u8 D_801C21DB; - extern u8 D_801C21DC; - extern u8 D_801C21DD; - extern u8 D_801C21DE; - extern u8 D_801C21DF; - extern u8 D_801C21E0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C21D8; t1 = D_801C21D9; t2 = D_801C21DA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C21DB; t1 = D_801C21DC; t2 = D_801C21DD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C21DE; t1 = D_801C21DF; t2 = D_801C21E0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C0790; -extern s32 D_801C0778; -extern s32 D_801C0794; -extern s32 D_801C0784; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C0790 != 0) { - if (D_801C0790 != 2) { - if (((D_801C0790 < 3) && (D_801C0790 == 1)) && - (D_801C0794 = D_801C0794 + 1, 0x23a < D_801C0794)) { - D_801C0778 = D_801C0790; - D_801C0790 = 2; - } - } else { - D_801C0778 = D_801C0778 + -1; - if (D_801C0778 == 0) { - D_801C0778 = D_801C0790; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C0784 == 0) { - D_801C0790 = D_801C0790 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C0784; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C0784; -} - - - -extern s32 D_801C0790; - -void func_8013D164(void) { - D_801C0790 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C22BA; -extern u8 D_801C232E; -extern u8 D_801C21E2; -extern u8 D_801C229C; -extern u8 D_801C21C0; -extern u8 D_801C21E1; -extern s32 D_801C22A0; - -void func_8013D330(void) { - if ((D_801C22BA & 0xff) != D_801C232E) { - D_801C22BA = ((D_801C22BA & 0xff) < D_801C232E) ? (D_801C22BA + 1) : (D_801C22BA - 1); - } - if ((D_801C21E2 & 0xff) != D_801C229C) { - D_801C21E2 = ((D_801C21E2 & 0xff) < D_801C229C) ? (D_801C21E2 + 1) : (D_801C21E2 - 1); - } - if ((D_801C21C0 & 0xff) != D_801C21E1) { - D_801C21C0 = ((D_801C21C0 & 0xff) < D_801C21E1) ? (D_801C21C0 + 1) : (D_801C21C0 - 1); - } - D_801C22A0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C0768; -extern void *D_801C076C; -extern void *D_801C0770; -extern s32 D_801C0798; -extern s32 D_801C079C; -extern s32 D_801C07A0; -extern s32 D_801C2214[]; - -extern u8 D_80188334[]; -extern u8 D_801883DC[]; -extern u8 D_8018828C[]; -extern u8 D_80188388[]; -extern u8 D_80188408[]; -extern u8 D_801882E0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C0798 = param_2; - D_801C079C = (param_2 >> 2) & 3; - D_801C07A0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C0768 = D_80188334; - D_801C076C = D_801883DC; - D_801C0770 = D_8018828C; - } else { - D_801C0768 = D_80188388; - D_801C076C = D_80188408; - D_801C0770 = D_801882E0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C07A0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C0798 & 2) != 0) { - D_801C2214[0] = 0x140; - D_801C2214[3] = 0x80; - if (p[0x37] == 4) { - D_801C2214[0] = 0x140; - D_801C2214[3] = 0; - } - if (p[0x37] == 0) { - D_801C2214[0] = 0x140; - D_801C2214[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C0770)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C0770; -extern s16 *D_801C0774; -extern s32 D_801C0784; -extern s32 D_801C07A4; -extern s32 D_801C07A8; -extern s32 D_801C07AC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C0774 != 0) { - D_801C0784 = 0; - p = (int *)(param_1 * 12 + (int)D_801C0770); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C07A4 != x) { - flag = 1; - if (D_801C07A4 < x) { - if (x - D_801C07A4 < 5) { - D_801C07A4 = x; - } else { - D_801C07A4 = D_801C07A4 + 4; - } - } else { - if (D_801C07A4 - x < 5) { - D_801C07A4 = x; - } else { - D_801C07A4 = D_801C07A4 - 4; - } - } - } - if (D_801C07A8 != y) { - flag = 1; - if (D_801C07A8 < y) { - if (y - D_801C07A8 < 5) { - D_801C07A8 = y; - } else { - D_801C07A8 = D_801C07A8 + 4; - } - } else { - if (D_801C07A8 - y < 5) { - D_801C07A8 = y; - } else { - D_801C07A8 = D_801C07A8 - 4; - } - } - } - if (D_801C07AC != z) { - flag = 1; - if (D_801C07AC < z) { - if (z - D_801C07AC < 5) { - D_801C07AC = z; - } else { - D_801C07AC = D_801C07AC + 4; - } - } else { - if (D_801C07AC - z < 5) { - D_801C07AC = z; - } else { - D_801C07AC = D_801C07AC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C0784 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80188498[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C0774); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C07A4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C07A8); - uVar5 = (*(int*)&D_801C07AC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80188498); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C078C; - -s32 func_8013E054(void) { - return D_801C078C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80188E94; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80188E6C; -extern s16 D_80188E6E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80188E94; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80188E6C = 2; - D_80188E6E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80188E6E = 0; - D_80188E6C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C07C0; - extern void * D_801C07C4; - extern unsigned char D_80188B0C; - extern unsigned char D_80188B24; - extern unsigned char D_80188B98; - extern unsigned char D_80188BA0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C07C0 = &D_80188B0C; - D_801C07C4 = &D_80188B98; - } else { - D_801C07C0 = &D_80188B24; - D_801C07C4 = &D_80188BA0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80188E94/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188E94 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80188E94)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80188E70; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188E70)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188E70)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80188E6C; -extern s16 D_80188E6E; -extern unsigned char D_80188E70; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188E6E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80188E6C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80188E6E; - if (*r < 3) { - *r = *r + 1; - } - D_80188E6C = (u16)D_80188E6C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188E70); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80188E70; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188E70); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_005/ov_SC04_005_jr_801380E0.c b/src/ov_SC04_005/ov_SC04_005_jr_801380E0.c new file mode 100644 index 000000000..8309e0eed --- /dev/null +++ b/src/ov_SC04_005/ov_SC04_005_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801BF500; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80187D8C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C067C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C22C0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801BF500; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80187AC8)(); +extern s16 (*D_80187ACC)(); +extern M2C_UNK (*D_80187AD4)(); +extern s32 (*D_80187AD8)(); +extern s32 D_801C0678; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801BF504; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80187E20; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018B304; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80187E38; +extern M2C_UNK D_80187E40; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80187E48; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80187E64[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80187E70[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80187E84[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80187ED4[]; +extern s16 D_80187F04[]; +extern s16 D_80187F64[]; +extern s16 D_80187F6C[]; +extern s16 D_80187F8C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80187FC4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018801C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80188064[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018806C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80188074[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018807C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80188024; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80188044; +extern void func_801321B0(int param_1); +extern int D_80188054; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C06E8; +extern s32 D_801C06EC[]; +extern int D_801C06F0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80188088; +extern u8 D_80188084; +extern s16 *D_8018808C; +extern u8 D_80188090; +extern int D_801C06E8; +extern u16 D_801C06F8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018808C; /* holds a pointer value (*(u16**)&D_8018808C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801880A0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801880F4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801880F8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801880F8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018813C; +extern u8 D_80188180; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018813C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80188180 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801881C4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80188200[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80188200; + if (((s16)a1) < 0xC00) { + tbl = D_801881C4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018823C, D_8018823E, D_80188240, D_80188242, D_80188244, D_80188246; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018823E < ang)) goto outer_else; + if (!(ang < D_80188244)) goto inner_else; + if (ang < D_80188240) { *(s16 *)L = D_80188240; goto done; } + if (D_80188242 < ang) { *(s16 *)L = D_80188242; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018823C) { *(s16 *)L = D_8018823C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80188246 < ang) { *(s16 *)L = D_80188246; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C0760; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C0760, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C0760; +extern s8 D_801C0764; +extern s8 D_801C0765; + +void func_8013C9C4(void * arg0) +{ + D_801C0760 = arg0; + D_801C0764 = 0; + D_801C0765 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C0760; +extern s8 D_801C0764; +extern s8 D_801C0765; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C0760; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C0765; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C0764)) * 2) + D_801C0760); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C0765 = (unsigned char) p[1]; + D_801C0764 = D_801C0764 + 1; + if (D_801C0765 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C0764 = 0; + *base = 0; + } + } + else + { + D_801C0765 = c - 1; + } + } + return; +} + + + +extern s32 D_801C0784; +extern s32 D_801C0778; +extern s32 D_801C077C; +extern s32 D_801C0788; + +void func_8013CABC(void) { + D_801C0784 = 1; + D_801C0778 = 1; + D_801C077C = 0; + D_801C0788 = 1; +} + + + +extern s32 D_801C0778; +extern s32 D_801C077C; +extern s32 D_801C0780; +extern s32 D_801C0784; +extern s32 D_801C0788; + +void func_8013CAE8(void) { + D_801C0778 = 1; + D_801C0784 = 0; + D_801C077C = 0; + D_801C0780 = -1; + D_801C0788 = 0; +} + + + +extern s32 D_801C0784; +extern s32 D_801C0788; +extern s32 D_801C07B0; +extern s32 D_801C07B4; + +void func_8013CB20(void) +{ + D_801C07B0 = D_801C0788; + D_801C07B4 = D_801C0784; + D_801C0788 = 1; + D_801C0784 = 0; +} + + + +extern s32 D_801C07B0; +extern s32 D_801C07B4; +extern s32 D_801C0788; +extern s32 D_801C0784; + +void func_8013CB5C(void) { + D_801C0788 = D_801C07B0; + D_801C0784 = D_801C07B4; +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C21D8; + extern u8 D_801C21D9; + extern u8 D_801C21DA; + extern u8 D_801C21DB; + extern u8 D_801C21DC; + extern u8 D_801C21DD; + extern u8 D_801C21DE; + extern u8 D_801C21DF; + extern u8 D_801C21E0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C21D8; t1 = D_801C21D9; t2 = D_801C21DA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C21DB; t1 = D_801C21DC; t2 = D_801C21DD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C21DE; t1 = D_801C21DF; t2 = D_801C21E0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C0790; +extern s32 D_801C0778; +extern s32 D_801C0794; +extern s32 D_801C0784; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C0790 != 0) { + if (D_801C0790 != 2) { + if (((D_801C0790 < 3) && (D_801C0790 == 1)) && + (D_801C0794 = D_801C0794 + 1, 0x23a < D_801C0794)) { + D_801C0778 = D_801C0790; + D_801C0790 = 2; + } + } else { + D_801C0778 = D_801C0778 + -1; + if (D_801C0778 == 0) { + D_801C0778 = D_801C0790; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C0784 == 0) { + D_801C0790 = D_801C0790 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C0784; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C0784; +} + + + +extern s32 D_801C0790; + +void func_8013D164(void) { + D_801C0790 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C22BA; +extern u8 D_801C232E; +extern u8 D_801C21E2; +extern u8 D_801C229C; +extern u8 D_801C21C0; +extern u8 D_801C21E1; +extern s32 D_801C22A0; + +void func_8013D330(void) { + if ((D_801C22BA & 0xff) != D_801C232E) { + D_801C22BA = ((D_801C22BA & 0xff) < D_801C232E) ? (D_801C22BA + 1) : (D_801C22BA - 1); + } + if ((D_801C21E2 & 0xff) != D_801C229C) { + D_801C21E2 = ((D_801C21E2 & 0xff) < D_801C229C) ? (D_801C21E2 + 1) : (D_801C21E2 - 1); + } + if ((D_801C21C0 & 0xff) != D_801C21E1) { + D_801C21C0 = ((D_801C21C0 & 0xff) < D_801C21E1) ? (D_801C21C0 + 1) : (D_801C21C0 - 1); + } + D_801C22A0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C0768; +extern void *D_801C076C; +extern void *D_801C0770; +extern s32 D_801C0798; +extern s32 D_801C079C; +extern s32 D_801C07A0; +extern s32 D_801C2214[]; + +extern u8 D_80188334[]; +extern u8 D_801883DC[]; +extern u8 D_8018828C[]; +extern u8 D_80188388[]; +extern u8 D_80188408[]; +extern u8 D_801882E0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C0798 = param_2; + D_801C079C = (param_2 >> 2) & 3; + D_801C07A0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C0768 = D_80188334; + D_801C076C = D_801883DC; + D_801C0770 = D_8018828C; + } else { + D_801C0768 = D_80188388; + D_801C076C = D_80188408; + D_801C0770 = D_801882E0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C07A0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C0798 & 2) != 0) { + D_801C2214[0] = 0x140; + D_801C2214[3] = 0x80; + if (p[0x37] == 4) { + D_801C2214[0] = 0x140; + D_801C2214[3] = 0; + } + if (p[0x37] == 0) { + D_801C2214[0] = 0x140; + D_801C2214[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C0770)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C0770; +extern s16 *D_801C0774; +extern s32 D_801C0784; +extern s32 D_801C07A4; +extern s32 D_801C07A8; +extern s32 D_801C07AC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C0774 != 0) { + D_801C0784 = 0; + p = (int *)(param_1 * 12 + (int)D_801C0770); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C07A4 != x) { + flag = 1; + if (D_801C07A4 < x) { + if (x - D_801C07A4 < 5) { + D_801C07A4 = x; + } else { + D_801C07A4 = D_801C07A4 + 4; + } + } else { + if (D_801C07A4 - x < 5) { + D_801C07A4 = x; + } else { + D_801C07A4 = D_801C07A4 - 4; + } + } + } + if (D_801C07A8 != y) { + flag = 1; + if (D_801C07A8 < y) { + if (y - D_801C07A8 < 5) { + D_801C07A8 = y; + } else { + D_801C07A8 = D_801C07A8 + 4; + } + } else { + if (D_801C07A8 - y < 5) { + D_801C07A8 = y; + } else { + D_801C07A8 = D_801C07A8 - 4; + } + } + } + if (D_801C07AC != z) { + flag = 1; + if (D_801C07AC < z) { + if (z - D_801C07AC < 5) { + D_801C07AC = z; + } else { + D_801C07AC = D_801C07AC + 4; + } + } else { + if (D_801C07AC - z < 5) { + D_801C07AC = z; + } else { + D_801C07AC = D_801C07AC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C0784 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80188498[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C0774); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C07A4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C07A8); + uVar5 = (*(int*)&D_801C07AC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80188498); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C078C; + +s32 func_8013E054(void) { + return D_801C078C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80188E94; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80188E6C; +extern s16 D_80188E6E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80188E94; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80188E6C = 2; + D_80188E6E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80188E6E = 0; + D_80188E6C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C07C0; + extern void * D_801C07C4; + extern unsigned char D_80188B0C; + extern unsigned char D_80188B24; + extern unsigned char D_80188B98; + extern unsigned char D_80188BA0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C07C0 = &D_80188B0C; + D_801C07C4 = &D_80188B98; + } else { + D_801C07C0 = &D_80188B24; + D_801C07C4 = &D_80188BA0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80188E94/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80188E94 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80188E94)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80188E70; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80188E70)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80188E70)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80188E6C; +extern s16 D_80188E6E; +extern unsigned char D_80188E70; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80188E6E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80188E6C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80188E6E; + if (*r < 3) { + *r = *r + 1; + } + D_80188E6C = (u16)D_80188E6C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188E70); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80188E70; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80188E70); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_006/ov_SC04_006_jr_8012ACE0.c b/src/ov_SC04_006/ov_SC04_006_jr_8012ACE0.c index a333975d8..788849128 100644 --- a/src/ov_SC04_006/ov_SC04_006_jr_8012ACE0.c +++ b/src/ov_SC04_006/ov_SC04_006_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801801D8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801801D8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018021C; -extern u8 D_80180260; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018021C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80180260 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801802A4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801802E0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801802E0; - if (((s16)a1) < 0xC00) { - tbl = D_801802A4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018031C, D_8018031E, D_80180320, D_80180322, D_80180324, D_80180326; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018031E < ang)) goto outer_else; - if (!(ang < D_80180324)) goto inner_else; - if (ang < D_80180320) { *(s16 *)L = D_80180320; goto done; } - if (D_80180322 < ang) { *(s16 *)L = D_80180322; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018031C) { *(s16 *)L = D_8018031C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80180326 < ang) { *(s16 *)L = D_80180326; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019CA08; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019CA08, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019CA08; -extern s8 D_8019CA0C; -extern s8 D_8019CA0D; - -void func_8013C9C4(void * arg0) -{ - D_8019CA08 = arg0; - D_8019CA0C = 0; - D_8019CA0D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019CA08; -extern s8 D_8019CA0C; -extern s8 D_8019CA0D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019CA08; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019CA0D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019CA0C)) * 2) + D_8019CA08); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019CA0D = (unsigned char) p[1]; - D_8019CA0C = D_8019CA0C + 1; - if (D_8019CA0D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019CA0C = 0; - *base = 0; - } - } - else - { - D_8019CA0D = c - 1; - } - } - return; -} - - - -extern s32 D_8019CA2C; -extern s32 D_8019CA20; -extern s32 D_8019CA24; -extern s32 D_8019CA30; - -void func_8013CABC(void) { - D_8019CA2C = 1; - D_8019CA20 = 1; - D_8019CA24 = 0; - D_8019CA30 = 1; -} - - - -extern s32 D_8019CA20; -extern s32 D_8019CA24; -extern s32 D_8019CA28; -extern s32 D_8019CA2C; -extern s32 D_8019CA30; - -void func_8013CAE8(void) { - D_8019CA20 = 1; - D_8019CA2C = 0; - D_8019CA24 = 0; - D_8019CA28 = -1; - D_8019CA30 = 0; -} - - - -extern s32 D_8019CA2C; -extern s32 D_8019CA30; -extern s32 D_8019CA58; -extern s32 D_8019CA5C; - -void func_8013CB20(void) -{ - D_8019CA58 = D_8019CA30; - D_8019CA5C = D_8019CA2C; - D_8019CA30 = 1; - D_8019CA2C = 0; -} - - - -extern s32 D_8019CA58; -extern s32 D_8019CA5C; -extern s32 D_8019CA30; -extern s32 D_8019CA2C; - -void func_8013CB5C(void) { - D_8019CA30 = D_8019CA58; - D_8019CA2C = D_8019CA5C; -} - - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019DC78; - extern u8 D_8019DC79; - extern u8 D_8019DC7A; - extern u8 D_8019DC7B; - extern u8 D_8019DC7C; - extern u8 D_8019DC7D; - extern u8 D_8019DC7E; - extern u8 D_8019DC7F; - extern u8 D_8019DC80; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019DC78; t1 = D_8019DC79; t2 = D_8019DC7A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019DC7B; t1 = D_8019DC7C; t2 = D_8019DC7D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019DC7E; t1 = D_8019DC7F; t2 = D_8019DC80; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019CA38; -extern s32 D_8019CA20; -extern s32 D_8019CA3C; -extern s32 D_8019CA2C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019CA38 != 0) { - if (D_8019CA38 != 2) { - if (((D_8019CA38 < 3) && (D_8019CA38 == 1)) && - (D_8019CA3C = D_8019CA3C + 1, 0x23a < D_8019CA3C)) { - D_8019CA20 = D_8019CA38; - D_8019CA38 = 2; - } - } else { - D_8019CA20 = D_8019CA20 + -1; - if (D_8019CA20 == 0) { - D_8019CA20 = D_8019CA38; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019CA2C == 0) { - D_8019CA38 = D_8019CA38 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019CA2C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019CA2C; -} - - - -extern s32 D_8019CA38; - -void func_8013D164(void) { - D_8019CA38 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019DD5A; -extern u8 D_8019DDCE; -extern u8 D_8019DC82; -extern u8 D_8019DD3C; -extern u8 D_8019DC60; -extern u8 D_8019DC81; -extern s32 D_8019DD40; - -void func_8013D330(void) { - if ((D_8019DD5A & 0xff) != D_8019DDCE) { - D_8019DD5A = ((D_8019DD5A & 0xff) < D_8019DDCE) ? (D_8019DD5A + 1) : (D_8019DD5A - 1); - } - if ((D_8019DC82 & 0xff) != D_8019DD3C) { - D_8019DC82 = ((D_8019DC82 & 0xff) < D_8019DD3C) ? (D_8019DC82 + 1) : (D_8019DC82 - 1); - } - if ((D_8019DC60 & 0xff) != D_8019DC81) { - D_8019DC60 = ((D_8019DC60 & 0xff) < D_8019DC81) ? (D_8019DC60 + 1) : (D_8019DC60 - 1); - } - D_8019DD40 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019CA10; -extern void *D_8019CA14; -extern void *D_8019CA18; -extern s32 D_8019CA40; -extern s32 D_8019CA44; -extern s32 D_8019CA48; -extern s32 D_8019DCB4[]; - -extern u8 D_80180414[]; -extern u8 D_801804BC[]; -extern u8 D_8018036C[]; -extern u8 D_80180468[]; -extern u8 D_801804E8[]; -extern u8 D_801803C0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019CA40 = param_2; - D_8019CA44 = (param_2 >> 2) & 3; - D_8019CA48 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019CA10 = D_80180414; - D_8019CA14 = D_801804BC; - D_8019CA18 = D_8018036C; - } else { - D_8019CA10 = D_80180468; - D_8019CA14 = D_801804E8; - D_8019CA18 = D_801803C0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019CA48 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019CA40 & 2) != 0) { - D_8019DCB4[0] = 0x140; - D_8019DCB4[3] = 0x80; - if (p[0x37] == 4) { - D_8019DCB4[0] = 0x140; - D_8019DCB4[3] = 0; - } - if (p[0x37] == 0) { - D_8019DCB4[0] = 0x140; - D_8019DCB4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019CA18)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019CA18; -extern s16 *D_8019CA1C; -extern s32 D_8019CA2C; -extern s32 D_8019CA4C; -extern s32 D_8019CA50; -extern s32 D_8019CA54; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019CA1C != 0) { - D_8019CA2C = 0; - p = (int *)(param_1 * 12 + (int)D_8019CA18); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019CA4C != x) { - flag = 1; - if (D_8019CA4C < x) { - if (x - D_8019CA4C < 5) { - D_8019CA4C = x; - } else { - D_8019CA4C = D_8019CA4C + 4; - } - } else { - if (D_8019CA4C - x < 5) { - D_8019CA4C = x; - } else { - D_8019CA4C = D_8019CA4C - 4; - } - } - } - if (D_8019CA50 != y) { - flag = 1; - if (D_8019CA50 < y) { - if (y - D_8019CA50 < 5) { - D_8019CA50 = y; - } else { - D_8019CA50 = D_8019CA50 + 4; - } - } else { - if (D_8019CA50 - y < 5) { - D_8019CA50 = y; - } else { - D_8019CA50 = D_8019CA50 - 4; - } - } - } - if (D_8019CA54 != z) { - flag = 1; - if (D_8019CA54 < z) { - if (z - D_8019CA54 < 5) { - D_8019CA54 = z; - } else { - D_8019CA54 = D_8019CA54 + 4; - } - } else { - if (D_8019CA54 - z < 5) { - D_8019CA54 = z; - } else { - D_8019CA54 = D_8019CA54 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019CA2C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80180578[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019CA1C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019CA4C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019CA50); - uVar5 = (*(int*)&D_8019CA54); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80180578); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019CA34; - -s32 func_8013E054(void) { - return D_8019CA34; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180F74; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80180F4C; -extern s16 D_80180F4E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180F74; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80180F4C = 2; - D_80180F4E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80180F4E = 0; - D_80180F4C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019CA68; - extern void * D_8019CA6C; - extern unsigned char D_80180BEC; - extern unsigned char D_80180C04; - extern unsigned char D_80180C78; - extern unsigned char D_80180C80; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019CA68 = &D_80180BEC; - D_8019CA6C = &D_80180C78; - } else { - D_8019CA68 = &D_80180C04; - D_8019CA6C = &D_80180C80; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180F74/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180F74 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180F74)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80180F50; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180F50)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180F50)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80180F4C; -extern s16 D_80180F4E; -extern unsigned char D_80180F50; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180F4E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80180F4C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80180F4E; - if (*r < 3) { - *r = *r + 1; - } - D_80180F4C = (u16)D_80180F4C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180F50); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80180F50; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180F50); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_006/ov_SC04_006_jr_801380E0.c b/src/ov_SC04_006/ov_SC04_006_jr_801380E0.c new file mode 100644 index 000000000..71a11f621 --- /dev/null +++ b/src/ov_SC04_006/ov_SC04_006_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019B7A8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017FE6C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019C924; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019DD60; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019B7A8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017FBA8)(); +extern s16 (*D_8017FBAC)(); +extern M2C_UNK (*D_8017FBB4)(); +extern s32 (*D_8017FBB8)(); +extern s32 D_8019C920; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019B7AC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017FF00; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801833E4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017FF18; +extern M2C_UNK D_8017FF20; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017FF28; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017FF44[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017FF50[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017FF64[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017FFB4[]; +extern s16 D_8017FFE4[]; +extern s16 D_80180044[]; +extern s16 D_8018004C[]; +extern s16 D_8018006C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801800A4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801800FC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80180144[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018014C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80180154[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018015C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180104; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80180124; +extern void func_801321B0(int param_1); +extern int D_80180134; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019C990; +extern s32 D_8019C994[]; +extern int D_8019C998; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80180168; +extern u8 D_80180164; +extern s16 *D_8018016C; +extern u8 D_80180170; +extern int D_8019C990; +extern u16 D_8019C9A0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018016C; /* holds a pointer value (*(u16**)&D_8018016C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80180180[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801801D4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801801D8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801801D8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018021C; +extern u8 D_80180260; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018021C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80180260 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801802A4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801802E0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801802E0; + if (((s16)a1) < 0xC00) { + tbl = D_801802A4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018031C, D_8018031E, D_80180320, D_80180322, D_80180324, D_80180326; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018031E < ang)) goto outer_else; + if (!(ang < D_80180324)) goto inner_else; + if (ang < D_80180320) { *(s16 *)L = D_80180320; goto done; } + if (D_80180322 < ang) { *(s16 *)L = D_80180322; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018031C) { *(s16 *)L = D_8018031C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180326 < ang) { *(s16 *)L = D_80180326; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019CA08; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019CA08, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019CA08; +extern s8 D_8019CA0C; +extern s8 D_8019CA0D; + +void func_8013C9C4(void * arg0) +{ + D_8019CA08 = arg0; + D_8019CA0C = 0; + D_8019CA0D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019CA08; +extern s8 D_8019CA0C; +extern s8 D_8019CA0D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019CA08; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019CA0D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019CA0C)) * 2) + D_8019CA08); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019CA0D = (unsigned char) p[1]; + D_8019CA0C = D_8019CA0C + 1; + if (D_8019CA0D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019CA0C = 0; + *base = 0; + } + } + else + { + D_8019CA0D = c - 1; + } + } + return; +} + + + +extern s32 D_8019CA2C; +extern s32 D_8019CA20; +extern s32 D_8019CA24; +extern s32 D_8019CA30; + +void func_8013CABC(void) { + D_8019CA2C = 1; + D_8019CA20 = 1; + D_8019CA24 = 0; + D_8019CA30 = 1; +} + + + +extern s32 D_8019CA20; +extern s32 D_8019CA24; +extern s32 D_8019CA28; +extern s32 D_8019CA2C; +extern s32 D_8019CA30; + +void func_8013CAE8(void) { + D_8019CA20 = 1; + D_8019CA2C = 0; + D_8019CA24 = 0; + D_8019CA28 = -1; + D_8019CA30 = 0; +} + + + +extern s32 D_8019CA2C; +extern s32 D_8019CA30; +extern s32 D_8019CA58; +extern s32 D_8019CA5C; + +void func_8013CB20(void) +{ + D_8019CA58 = D_8019CA30; + D_8019CA5C = D_8019CA2C; + D_8019CA30 = 1; + D_8019CA2C = 0; +} + + + +extern s32 D_8019CA58; +extern s32 D_8019CA5C; +extern s32 D_8019CA30; +extern s32 D_8019CA2C; + +void func_8013CB5C(void) { + D_8019CA30 = D_8019CA58; + D_8019CA2C = D_8019CA5C; +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019DC78; + extern u8 D_8019DC79; + extern u8 D_8019DC7A; + extern u8 D_8019DC7B; + extern u8 D_8019DC7C; + extern u8 D_8019DC7D; + extern u8 D_8019DC7E; + extern u8 D_8019DC7F; + extern u8 D_8019DC80; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019DC78; t1 = D_8019DC79; t2 = D_8019DC7A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019DC7B; t1 = D_8019DC7C; t2 = D_8019DC7D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019DC7E; t1 = D_8019DC7F; t2 = D_8019DC80; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019CA38; +extern s32 D_8019CA20; +extern s32 D_8019CA3C; +extern s32 D_8019CA2C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019CA38 != 0) { + if (D_8019CA38 != 2) { + if (((D_8019CA38 < 3) && (D_8019CA38 == 1)) && + (D_8019CA3C = D_8019CA3C + 1, 0x23a < D_8019CA3C)) { + D_8019CA20 = D_8019CA38; + D_8019CA38 = 2; + } + } else { + D_8019CA20 = D_8019CA20 + -1; + if (D_8019CA20 == 0) { + D_8019CA20 = D_8019CA38; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019CA2C == 0) { + D_8019CA38 = D_8019CA38 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019CA2C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019CA2C; +} + + + +extern s32 D_8019CA38; + +void func_8013D164(void) { + D_8019CA38 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019DD5A; +extern u8 D_8019DDCE; +extern u8 D_8019DC82; +extern u8 D_8019DD3C; +extern u8 D_8019DC60; +extern u8 D_8019DC81; +extern s32 D_8019DD40; + +void func_8013D330(void) { + if ((D_8019DD5A & 0xff) != D_8019DDCE) { + D_8019DD5A = ((D_8019DD5A & 0xff) < D_8019DDCE) ? (D_8019DD5A + 1) : (D_8019DD5A - 1); + } + if ((D_8019DC82 & 0xff) != D_8019DD3C) { + D_8019DC82 = ((D_8019DC82 & 0xff) < D_8019DD3C) ? (D_8019DC82 + 1) : (D_8019DC82 - 1); + } + if ((D_8019DC60 & 0xff) != D_8019DC81) { + D_8019DC60 = ((D_8019DC60 & 0xff) < D_8019DC81) ? (D_8019DC60 + 1) : (D_8019DC60 - 1); + } + D_8019DD40 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019CA10; +extern void *D_8019CA14; +extern void *D_8019CA18; +extern s32 D_8019CA40; +extern s32 D_8019CA44; +extern s32 D_8019CA48; +extern s32 D_8019DCB4[]; + +extern u8 D_80180414[]; +extern u8 D_801804BC[]; +extern u8 D_8018036C[]; +extern u8 D_80180468[]; +extern u8 D_801804E8[]; +extern u8 D_801803C0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019CA40 = param_2; + D_8019CA44 = (param_2 >> 2) & 3; + D_8019CA48 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019CA10 = D_80180414; + D_8019CA14 = D_801804BC; + D_8019CA18 = D_8018036C; + } else { + D_8019CA10 = D_80180468; + D_8019CA14 = D_801804E8; + D_8019CA18 = D_801803C0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019CA48 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019CA40 & 2) != 0) { + D_8019DCB4[0] = 0x140; + D_8019DCB4[3] = 0x80; + if (p[0x37] == 4) { + D_8019DCB4[0] = 0x140; + D_8019DCB4[3] = 0; + } + if (p[0x37] == 0) { + D_8019DCB4[0] = 0x140; + D_8019DCB4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019CA18)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019CA18; +extern s16 *D_8019CA1C; +extern s32 D_8019CA2C; +extern s32 D_8019CA4C; +extern s32 D_8019CA50; +extern s32 D_8019CA54; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019CA1C != 0) { + D_8019CA2C = 0; + p = (int *)(param_1 * 12 + (int)D_8019CA18); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019CA4C != x) { + flag = 1; + if (D_8019CA4C < x) { + if (x - D_8019CA4C < 5) { + D_8019CA4C = x; + } else { + D_8019CA4C = D_8019CA4C + 4; + } + } else { + if (D_8019CA4C - x < 5) { + D_8019CA4C = x; + } else { + D_8019CA4C = D_8019CA4C - 4; + } + } + } + if (D_8019CA50 != y) { + flag = 1; + if (D_8019CA50 < y) { + if (y - D_8019CA50 < 5) { + D_8019CA50 = y; + } else { + D_8019CA50 = D_8019CA50 + 4; + } + } else { + if (D_8019CA50 - y < 5) { + D_8019CA50 = y; + } else { + D_8019CA50 = D_8019CA50 - 4; + } + } + } + if (D_8019CA54 != z) { + flag = 1; + if (D_8019CA54 < z) { + if (z - D_8019CA54 < 5) { + D_8019CA54 = z; + } else { + D_8019CA54 = D_8019CA54 + 4; + } + } else { + if (D_8019CA54 - z < 5) { + D_8019CA54 = z; + } else { + D_8019CA54 = D_8019CA54 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019CA2C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80180578[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019CA1C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019CA4C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019CA50); + uVar5 = (*(int*)&D_8019CA54); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80180578); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019CA34; + +s32 func_8013E054(void) { + return D_8019CA34; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180F74; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80180F4C; +extern s16 D_80180F4E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180F74; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80180F4C = 2; + D_80180F4E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80180F4E = 0; + D_80180F4C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019CA68; + extern void * D_8019CA6C; + extern unsigned char D_80180BEC; + extern unsigned char D_80180C04; + extern unsigned char D_80180C78; + extern unsigned char D_80180C80; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019CA68 = &D_80180BEC; + D_8019CA6C = &D_80180C78; + } else { + D_8019CA68 = &D_80180C04; + D_8019CA6C = &D_80180C80; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180F74/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180F74 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180F74)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80180F50; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80180F50)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80180F50)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80180F4C; +extern s16 D_80180F4E; +extern unsigned char D_80180F50; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80180F4E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80180F4C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80180F4E; + if (*r < 3) { + *r = *r + 1; + } + D_80180F4C = (u16)D_80180F4C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180F50); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80180F50; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80180F50); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_007/ov_SC04_007_jr_8012ACE0.c b/src/ov_SC04_007/ov_SC04_007_jr_8012ACE0.c index 6b8513ca2..c001dc7e1 100644 --- a/src/ov_SC04_007/ov_SC04_007_jr_8012ACE0.c +++ b/src/ov_SC04_007/ov_SC04_007_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186190[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186190[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801861D4; -extern u8 D_80186218; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801861D4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80186218 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018625C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80186298[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80186298; - if (((s16)a1) < 0xC00) { - tbl = D_8018625C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801862D4, D_801862D6, D_801862D8, D_801862DA, D_801862DC, D_801862DE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801862D6 < ang)) goto outer_else; - if (!(ang < D_801862DC)) goto inner_else; - if (ang < D_801862D8) { *(s16 *)L = D_801862D8; goto done; } - if (D_801862DA < ang) { *(s16 *)L = D_801862DA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801862D4) { *(s16 *)L = D_801862D4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801862DE < ang) { *(s16 *)L = D_801862DE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B3FC0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B3FC0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B3FC0; -extern s8 D_801B3FC4; -extern s8 D_801B3FC5; - -void func_8013C9C4(void * arg0) -{ - D_801B3FC0 = arg0; - D_801B3FC4 = 0; - D_801B3FC5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B3FC0; -extern s8 D_801B3FC4; -extern s8 D_801B3FC5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B3FC0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B3FC5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B3FC4)) * 2) + D_801B3FC0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B3FC5 = (unsigned char) p[1]; - D_801B3FC4 = D_801B3FC4 + 1; - if (D_801B3FC5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B3FC4 = 0; - *base = 0; - } - } - else - { - D_801B3FC5 = c - 1; - } - } - return; -} - - - -extern s32 D_801B3FE4; -extern s32 D_801B3FD8; -extern s32 D_801B3FDC; -extern s32 D_801B3FE8; - -void func_8013CABC(void) { - D_801B3FE4 = 1; - D_801B3FD8 = 1; - D_801B3FDC = 0; - D_801B3FE8 = 1; -} - - - -extern s32 D_801B3FD8; -extern s32 D_801B3FDC; -extern s32 D_801B3FE0; -extern s32 D_801B3FE4; -extern s32 D_801B3FE8; - -void func_8013CAE8(void) { - D_801B3FD8 = 1; - D_801B3FE4 = 0; - D_801B3FDC = 0; - D_801B3FE0 = -1; - D_801B3FE8 = 0; -} - - - -extern s32 D_801B3FE4; -extern s32 D_801B3FE8; -extern s32 D_801B4010; -extern s32 D_801B4014; - -void func_8013CB20(void) -{ - D_801B4010 = D_801B3FE8; - D_801B4014 = D_801B3FE4; - D_801B3FE8 = 1; - D_801B3FE4 = 0; -} - - - -extern s32 D_801B4010; -extern s32 D_801B4014; -extern s32 D_801B3FE8; -extern s32 D_801B3FE4; - -void func_8013CB5C(void) { - D_801B3FE8 = D_801B4010; - D_801B3FE4 = D_801B4014; -} - - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B5A38; - extern u8 D_801B5A39; - extern u8 D_801B5A3A; - extern u8 D_801B5A3B; - extern u8 D_801B5A3C; - extern u8 D_801B5A3D; - extern u8 D_801B5A3E; - extern u8 D_801B5A3F; - extern u8 D_801B5A40; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B5A38; t1 = D_801B5A39; t2 = D_801B5A3A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B5A3B; t1 = D_801B5A3C; t2 = D_801B5A3D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B5A3E; t1 = D_801B5A3F; t2 = D_801B5A40; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B3FF0; -extern s32 D_801B3FD8; -extern s32 D_801B3FF4; -extern s32 D_801B3FE4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B3FF0 != 0) { - if (D_801B3FF0 != 2) { - if (((D_801B3FF0 < 3) && (D_801B3FF0 == 1)) && - (D_801B3FF4 = D_801B3FF4 + 1, 0x23a < D_801B3FF4)) { - D_801B3FD8 = D_801B3FF0; - D_801B3FF0 = 2; - } - } else { - D_801B3FD8 = D_801B3FD8 + -1; - if (D_801B3FD8 == 0) { - D_801B3FD8 = D_801B3FF0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B3FE4 == 0) { - D_801B3FF0 = D_801B3FF0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B3FE4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B3FE4; -} - - - -extern s32 D_801B3FF0; - -void func_8013D164(void) { - D_801B3FF0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B5B1A; -extern u8 D_801B5B8E; -extern u8 D_801B5A42; -extern u8 D_801B5AFC; -extern u8 D_801B5A20; -extern u8 D_801B5A41; -extern s32 D_801B5B00; - -void func_8013D330(void) { - if ((D_801B5B1A & 0xff) != D_801B5B8E) { - D_801B5B1A = ((D_801B5B1A & 0xff) < D_801B5B8E) ? (D_801B5B1A + 1) : (D_801B5B1A - 1); - } - if ((D_801B5A42 & 0xff) != D_801B5AFC) { - D_801B5A42 = ((D_801B5A42 & 0xff) < D_801B5AFC) ? (D_801B5A42 + 1) : (D_801B5A42 - 1); - } - if ((D_801B5A20 & 0xff) != D_801B5A41) { - D_801B5A20 = ((D_801B5A20 & 0xff) < D_801B5A41) ? (D_801B5A20 + 1) : (D_801B5A20 - 1); - } - D_801B5B00 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B3FC8; -extern void *D_801B3FCC; -extern void *D_801B3FD0; -extern s32 D_801B3FF8; -extern s32 D_801B3FFC; -extern s32 D_801B4000; -extern s32 D_801B5A74[]; - -extern u8 D_801863CC[]; -extern u8 D_80186474[]; -extern u8 D_80186324[]; -extern u8 D_80186420[]; -extern u8 D_801864A0[]; -extern u8 D_80186378[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B3FF8 = param_2; - D_801B3FFC = (param_2 >> 2) & 3; - D_801B4000 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B3FC8 = D_801863CC; - D_801B3FCC = D_80186474; - D_801B3FD0 = D_80186324; - } else { - D_801B3FC8 = D_80186420; - D_801B3FCC = D_801864A0; - D_801B3FD0 = D_80186378; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B4000 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B3FF8 & 2) != 0) { - D_801B5A74[0] = 0x140; - D_801B5A74[3] = 0x80; - if (p[0x37] == 4) { - D_801B5A74[0] = 0x140; - D_801B5A74[3] = 0; - } - if (p[0x37] == 0) { - D_801B5A74[0] = 0x140; - D_801B5A74[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B3FD0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B3FD0; -extern s16 *D_801B3FD4; -extern s32 D_801B3FE4; -extern s32 D_801B4004; -extern s32 D_801B4008; -extern s32 D_801B400C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B3FD4 != 0) { - D_801B3FE4 = 0; - p = (int *)(param_1 * 12 + (int)D_801B3FD0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B4004 != x) { - flag = 1; - if (D_801B4004 < x) { - if (x - D_801B4004 < 5) { - D_801B4004 = x; - } else { - D_801B4004 = D_801B4004 + 4; - } - } else { - if (D_801B4004 - x < 5) { - D_801B4004 = x; - } else { - D_801B4004 = D_801B4004 - 4; - } - } - } - if (D_801B4008 != y) { - flag = 1; - if (D_801B4008 < y) { - if (y - D_801B4008 < 5) { - D_801B4008 = y; - } else { - D_801B4008 = D_801B4008 + 4; - } - } else { - if (D_801B4008 - y < 5) { - D_801B4008 = y; - } else { - D_801B4008 = D_801B4008 - 4; - } - } - } - if (D_801B400C != z) { - flag = 1; - if (D_801B400C < z) { - if (z - D_801B400C < 5) { - D_801B400C = z; - } else { - D_801B400C = D_801B400C + 4; - } - } else { - if (D_801B400C - z < 5) { - D_801B400C = z; - } else { - D_801B400C = D_801B400C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B3FE4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80186530[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B3FD4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B4004); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B4008); - uVar5 = (*(int*)&D_801B400C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80186530); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B3FEC; - -s32 func_8013E054(void) { - return D_801B3FEC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186F2C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186F04; -extern s16 D_80186F06; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186F2C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186F04 = 2; - D_80186F06 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186F06 = 0; - D_80186F04 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B4020; - extern void * D_801B4024; - extern unsigned char D_80186BA4; - extern unsigned char D_80186BBC; - extern unsigned char D_80186C30; - extern unsigned char D_80186C38; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B4020 = &D_80186BA4; - D_801B4024 = &D_80186C30; - } else { - D_801B4020 = &D_80186BBC; - D_801B4024 = &D_80186C38; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186F2C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186F2C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186F2C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186F08; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186F08)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186F08)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186F04; -extern s16 D_80186F06; -extern unsigned char D_80186F08; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186F06` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186F04` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186F06; - if (*r < 3) { - *r = *r + 1; - } - D_80186F04 = (u16)D_80186F04 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186F08); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186F08; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186F08); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_007/ov_SC04_007_jr_801380E0.c b/src/ov_SC04_007/ov_SC04_007_jr_801380E0.c new file mode 100644 index 000000000..68d00d8c5 --- /dev/null +++ b/src/ov_SC04_007/ov_SC04_007_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B2D64; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80185E24[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B3EDC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B5B20; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B2D64; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80185B60)(); +extern s16 (*D_80185B64)(); +extern M2C_UNK (*D_80185B6C)(); +extern s32 (*D_80185B70)(); +extern s32 D_801B3ED8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B2D68; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80185EB8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018939C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185ED0; +extern M2C_UNK D_80185ED8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185EE0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185EFC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185F08[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185F1C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185F6C[]; +extern s16 D_80185F9C[]; +extern s16 D_80185FFC[]; +extern s16 D_80186004[]; +extern s16 D_80186024[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018605C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801860B4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801860FC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186104[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018610C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186114[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801860BC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801860DC; +extern void func_801321B0(int param_1); +extern int D_801860EC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B3F48; +extern s32 D_801B3F4C[]; +extern int D_801B3F50; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186120; +extern u8 D_8018611C; +extern s16 *D_80186124; +extern u8 D_80186128; +extern int D_801B3F48; +extern u16 D_801B3F58; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186124; /* holds a pointer value (*(u16**)&D_80186124) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186138[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018618C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186190[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186190[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801861D4; +extern u8 D_80186218; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801861D4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80186218 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018625C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80186298[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80186298; + if (((s16)a1) < 0xC00) { + tbl = D_8018625C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801862D4, D_801862D6, D_801862D8, D_801862DA, D_801862DC, D_801862DE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801862D6 < ang)) goto outer_else; + if (!(ang < D_801862DC)) goto inner_else; + if (ang < D_801862D8) { *(s16 *)L = D_801862D8; goto done; } + if (D_801862DA < ang) { *(s16 *)L = D_801862DA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801862D4) { *(s16 *)L = D_801862D4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801862DE < ang) { *(s16 *)L = D_801862DE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B3FC0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B3FC0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B3FC0; +extern s8 D_801B3FC4; +extern s8 D_801B3FC5; + +void func_8013C9C4(void * arg0) +{ + D_801B3FC0 = arg0; + D_801B3FC4 = 0; + D_801B3FC5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B3FC0; +extern s8 D_801B3FC4; +extern s8 D_801B3FC5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B3FC0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B3FC5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B3FC4)) * 2) + D_801B3FC0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B3FC5 = (unsigned char) p[1]; + D_801B3FC4 = D_801B3FC4 + 1; + if (D_801B3FC5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B3FC4 = 0; + *base = 0; + } + } + else + { + D_801B3FC5 = c - 1; + } + } + return; +} + + + +extern s32 D_801B3FE4; +extern s32 D_801B3FD8; +extern s32 D_801B3FDC; +extern s32 D_801B3FE8; + +void func_8013CABC(void) { + D_801B3FE4 = 1; + D_801B3FD8 = 1; + D_801B3FDC = 0; + D_801B3FE8 = 1; +} + + + +extern s32 D_801B3FD8; +extern s32 D_801B3FDC; +extern s32 D_801B3FE0; +extern s32 D_801B3FE4; +extern s32 D_801B3FE8; + +void func_8013CAE8(void) { + D_801B3FD8 = 1; + D_801B3FE4 = 0; + D_801B3FDC = 0; + D_801B3FE0 = -1; + D_801B3FE8 = 0; +} + + + +extern s32 D_801B3FE4; +extern s32 D_801B3FE8; +extern s32 D_801B4010; +extern s32 D_801B4014; + +void func_8013CB20(void) +{ + D_801B4010 = D_801B3FE8; + D_801B4014 = D_801B3FE4; + D_801B3FE8 = 1; + D_801B3FE4 = 0; +} + + + +extern s32 D_801B4010; +extern s32 D_801B4014; +extern s32 D_801B3FE8; +extern s32 D_801B3FE4; + +void func_8013CB5C(void) { + D_801B3FE8 = D_801B4010; + D_801B3FE4 = D_801B4014; +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B5A38; + extern u8 D_801B5A39; + extern u8 D_801B5A3A; + extern u8 D_801B5A3B; + extern u8 D_801B5A3C; + extern u8 D_801B5A3D; + extern u8 D_801B5A3E; + extern u8 D_801B5A3F; + extern u8 D_801B5A40; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B5A38; t1 = D_801B5A39; t2 = D_801B5A3A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B5A3B; t1 = D_801B5A3C; t2 = D_801B5A3D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B5A3E; t1 = D_801B5A3F; t2 = D_801B5A40; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B3FF0; +extern s32 D_801B3FD8; +extern s32 D_801B3FF4; +extern s32 D_801B3FE4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B3FF0 != 0) { + if (D_801B3FF0 != 2) { + if (((D_801B3FF0 < 3) && (D_801B3FF0 == 1)) && + (D_801B3FF4 = D_801B3FF4 + 1, 0x23a < D_801B3FF4)) { + D_801B3FD8 = D_801B3FF0; + D_801B3FF0 = 2; + } + } else { + D_801B3FD8 = D_801B3FD8 + -1; + if (D_801B3FD8 == 0) { + D_801B3FD8 = D_801B3FF0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B3FE4 == 0) { + D_801B3FF0 = D_801B3FF0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B3FE4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B3FE4; +} + + + +extern s32 D_801B3FF0; + +void func_8013D164(void) { + D_801B3FF0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B5B1A; +extern u8 D_801B5B8E; +extern u8 D_801B5A42; +extern u8 D_801B5AFC; +extern u8 D_801B5A20; +extern u8 D_801B5A41; +extern s32 D_801B5B00; + +void func_8013D330(void) { + if ((D_801B5B1A & 0xff) != D_801B5B8E) { + D_801B5B1A = ((D_801B5B1A & 0xff) < D_801B5B8E) ? (D_801B5B1A + 1) : (D_801B5B1A - 1); + } + if ((D_801B5A42 & 0xff) != D_801B5AFC) { + D_801B5A42 = ((D_801B5A42 & 0xff) < D_801B5AFC) ? (D_801B5A42 + 1) : (D_801B5A42 - 1); + } + if ((D_801B5A20 & 0xff) != D_801B5A41) { + D_801B5A20 = ((D_801B5A20 & 0xff) < D_801B5A41) ? (D_801B5A20 + 1) : (D_801B5A20 - 1); + } + D_801B5B00 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B3FC8; +extern void *D_801B3FCC; +extern void *D_801B3FD0; +extern s32 D_801B3FF8; +extern s32 D_801B3FFC; +extern s32 D_801B4000; +extern s32 D_801B5A74[]; + +extern u8 D_801863CC[]; +extern u8 D_80186474[]; +extern u8 D_80186324[]; +extern u8 D_80186420[]; +extern u8 D_801864A0[]; +extern u8 D_80186378[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B3FF8 = param_2; + D_801B3FFC = (param_2 >> 2) & 3; + D_801B4000 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B3FC8 = D_801863CC; + D_801B3FCC = D_80186474; + D_801B3FD0 = D_80186324; + } else { + D_801B3FC8 = D_80186420; + D_801B3FCC = D_801864A0; + D_801B3FD0 = D_80186378; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B4000 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B3FF8 & 2) != 0) { + D_801B5A74[0] = 0x140; + D_801B5A74[3] = 0x80; + if (p[0x37] == 4) { + D_801B5A74[0] = 0x140; + D_801B5A74[3] = 0; + } + if (p[0x37] == 0) { + D_801B5A74[0] = 0x140; + D_801B5A74[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B3FD0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B3FD0; +extern s16 *D_801B3FD4; +extern s32 D_801B3FE4; +extern s32 D_801B4004; +extern s32 D_801B4008; +extern s32 D_801B400C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B3FD4 != 0) { + D_801B3FE4 = 0; + p = (int *)(param_1 * 12 + (int)D_801B3FD0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B4004 != x) { + flag = 1; + if (D_801B4004 < x) { + if (x - D_801B4004 < 5) { + D_801B4004 = x; + } else { + D_801B4004 = D_801B4004 + 4; + } + } else { + if (D_801B4004 - x < 5) { + D_801B4004 = x; + } else { + D_801B4004 = D_801B4004 - 4; + } + } + } + if (D_801B4008 != y) { + flag = 1; + if (D_801B4008 < y) { + if (y - D_801B4008 < 5) { + D_801B4008 = y; + } else { + D_801B4008 = D_801B4008 + 4; + } + } else { + if (D_801B4008 - y < 5) { + D_801B4008 = y; + } else { + D_801B4008 = D_801B4008 - 4; + } + } + } + if (D_801B400C != z) { + flag = 1; + if (D_801B400C < z) { + if (z - D_801B400C < 5) { + D_801B400C = z; + } else { + D_801B400C = D_801B400C + 4; + } + } else { + if (D_801B400C - z < 5) { + D_801B400C = z; + } else { + D_801B400C = D_801B400C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B3FE4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80186530[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B3FD4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B4004); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B4008); + uVar5 = (*(int*)&D_801B400C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80186530); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B3FEC; + +s32 func_8013E054(void) { + return D_801B3FEC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186F2C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186F04; +extern s16 D_80186F06; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186F2C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186F04 = 2; + D_80186F06 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186F06 = 0; + D_80186F04 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B4020; + extern void * D_801B4024; + extern unsigned char D_80186BA4; + extern unsigned char D_80186BBC; + extern unsigned char D_80186C30; + extern unsigned char D_80186C38; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B4020 = &D_80186BA4; + D_801B4024 = &D_80186C30; + } else { + D_801B4020 = &D_80186BBC; + D_801B4024 = &D_80186C38; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186F2C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186F2C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186F2C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186F08; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186F08)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186F08)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186F04; +extern s16 D_80186F06; +extern unsigned char D_80186F08; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186F06` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186F04` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186F06; + if (*r < 3) { + *r = *r + 1; + } + D_80186F04 = (u16)D_80186F04 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186F08); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186F08; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186F08); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_008/ov_SC04_008_jr_8012ACE0.c b/src/ov_SC04_008/ov_SC04_008_jr_8012ACE0.c index 77bba13ac..14a371e70 100644 --- a/src/ov_SC04_008/ov_SC04_008_jr_8012ACE0.c +++ b/src/ov_SC04_008/ov_SC04_008_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F0C8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F0C8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F10C; -extern u8 D_8017F150; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F10C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F150 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F194[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F1D0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F1D0; - if (((s16)a1) < 0xC00) { - tbl = D_8017F194; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F20C, D_8017F20E, D_8017F210, D_8017F212, D_8017F214, D_8017F216; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F20E < ang)) goto outer_else; - if (!(ang < D_8017F214)) goto inner_else; - if (ang < D_8017F210) { *(s16 *)L = D_8017F210; goto done; } - if (D_8017F212 < ang) { *(s16 *)L = D_8017F212; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F20C) { *(s16 *)L = D_8017F20C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F216 < ang) { *(s16 *)L = D_8017F216; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80190C98; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80190C98, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80190C98; -extern s8 D_80190C9C; -extern s8 D_80190C9D; - -void func_8013C9C4(void * arg0) -{ - D_80190C98 = arg0; - D_80190C9C = 0; - D_80190C9D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80190C98; -extern s8 D_80190C9C; -extern s8 D_80190C9D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80190C98; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80190C9D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80190C9C)) * 2) + D_80190C98); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80190C9D = (unsigned char) p[1]; - D_80190C9C = D_80190C9C + 1; - if (D_80190C9D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80190C9C = 0; - *base = 0; - } - } - else - { - D_80190C9D = c - 1; - } - } - return; -} - - - -extern s32 D_80190CBC; -extern s32 D_80190CB0; -extern s32 D_80190CB4; -extern s32 D_80190CC0; - -void func_8013CABC(void) { - D_80190CBC = 1; - D_80190CB0 = 1; - D_80190CB4 = 0; - D_80190CC0 = 1; -} - - - -extern s32 D_80190CB0; -extern s32 D_80190CB4; -extern s32 D_80190CB8; -extern s32 D_80190CBC; -extern s32 D_80190CC0; - -void func_8013CAE8(void) { - D_80190CB0 = 1; - D_80190CBC = 0; - D_80190CB4 = 0; - D_80190CB8 = -1; - D_80190CC0 = 0; -} - - - -extern s32 D_80190CBC; -extern s32 D_80190CC0; -extern s32 D_80190CE8; -extern s32 D_80190CEC; - -void func_8013CB20(void) -{ - D_80190CE8 = D_80190CC0; - D_80190CEC = D_80190CBC; - D_80190CC0 = 1; - D_80190CBC = 0; -} - - - -extern s32 D_80190CE8; -extern s32 D_80190CEC; -extern s32 D_80190CC0; -extern s32 D_80190CBC; - -void func_8013CB5C(void) { - D_80190CC0 = D_80190CE8; - D_80190CBC = D_80190CEC; -} - - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80193368; - extern u8 D_80193369; - extern u8 D_8019336A; - extern u8 D_8019336B; - extern u8 D_8019336C; - extern u8 D_8019336D; - extern u8 D_8019336E; - extern u8 D_8019336F; - extern u8 D_80193370; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80193368; t1 = D_80193369; t2 = D_8019336A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019336B; t1 = D_8019336C; t2 = D_8019336D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019336E; t1 = D_8019336F; t2 = D_80193370; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80190CC8; -extern s32 D_80190CB0; -extern s32 D_80190CCC; -extern s32 D_80190CBC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80190CC8 != 0) { - if (D_80190CC8 != 2) { - if (((D_80190CC8 < 3) && (D_80190CC8 == 1)) && - (D_80190CCC = D_80190CCC + 1, 0x23a < D_80190CCC)) { - D_80190CB0 = D_80190CC8; - D_80190CC8 = 2; - } - } else { - D_80190CB0 = D_80190CB0 + -1; - if (D_80190CB0 == 0) { - D_80190CB0 = D_80190CC8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80190CBC == 0) { - D_80190CC8 = D_80190CC8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80190CBC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80190CBC; -} - - - -extern s32 D_80190CC8; - -void func_8013D164(void) { - D_80190CC8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019344A; -extern u8 D_801934BE; -extern u8 D_80193372; -extern u8 D_8019342C; -extern u8 D_80193350; -extern u8 D_80193371; -extern s32 D_80193430; - -void func_8013D330(void) { - if ((D_8019344A & 0xff) != D_801934BE) { - D_8019344A = ((D_8019344A & 0xff) < D_801934BE) ? (D_8019344A + 1) : (D_8019344A - 1); - } - if ((D_80193372 & 0xff) != D_8019342C) { - D_80193372 = ((D_80193372 & 0xff) < D_8019342C) ? (D_80193372 + 1) : (D_80193372 - 1); - } - if ((D_80193350 & 0xff) != D_80193371) { - D_80193350 = ((D_80193350 & 0xff) < D_80193371) ? (D_80193350 + 1) : (D_80193350 - 1); - } - D_80193430 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80190CA0; -extern void *D_80190CA4; -extern void *D_80190CA8; -extern s32 D_80190CD0; -extern s32 D_80190CD4; -extern s32 D_80190CD8; -extern s32 D_801933A4[]; - -extern u8 D_8017F304[]; -extern u8 D_8017F3AC[]; -extern u8 D_8017F25C[]; -extern u8 D_8017F358[]; -extern u8 D_8017F3D8[]; -extern u8 D_8017F2B0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80190CD0 = param_2; - D_80190CD4 = (param_2 >> 2) & 3; - D_80190CD8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80190CA0 = D_8017F304; - D_80190CA4 = D_8017F3AC; - D_80190CA8 = D_8017F25C; - } else { - D_80190CA0 = D_8017F358; - D_80190CA4 = D_8017F3D8; - D_80190CA8 = D_8017F2B0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80190CD8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80190CD0 & 2) != 0) { - D_801933A4[0] = 0x140; - D_801933A4[3] = 0x80; - if (p[0x37] == 4) { - D_801933A4[0] = 0x140; - D_801933A4[3] = 0; - } - if (p[0x37] == 0) { - D_801933A4[0] = 0x140; - D_801933A4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80190CA8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80190CA8; -extern s16 *D_80190CAC; -extern s32 D_80190CBC; -extern s32 D_80190CDC; -extern s32 D_80190CE0; -extern s32 D_80190CE4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80190CAC != 0) { - D_80190CBC = 0; - p = (int *)(param_1 * 12 + (int)D_80190CA8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80190CDC != x) { - flag = 1; - if (D_80190CDC < x) { - if (x - D_80190CDC < 5) { - D_80190CDC = x; - } else { - D_80190CDC = D_80190CDC + 4; - } - } else { - if (D_80190CDC - x < 5) { - D_80190CDC = x; - } else { - D_80190CDC = D_80190CDC - 4; - } - } - } - if (D_80190CE0 != y) { - flag = 1; - if (D_80190CE0 < y) { - if (y - D_80190CE0 < 5) { - D_80190CE0 = y; - } else { - D_80190CE0 = D_80190CE0 + 4; - } - } else { - if (D_80190CE0 - y < 5) { - D_80190CE0 = y; - } else { - D_80190CE0 = D_80190CE0 - 4; - } - } - } - if (D_80190CE4 != z) { - flag = 1; - if (D_80190CE4 < z) { - if (z - D_80190CE4 < 5) { - D_80190CE4 = z; - } else { - D_80190CE4 = D_80190CE4 + 4; - } - } else { - if (D_80190CE4 - z < 5) { - D_80190CE4 = z; - } else { - D_80190CE4 = D_80190CE4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80190CBC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F468[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80190CAC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80190CDC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80190CE0); - uVar5 = (*(int*)&D_80190CE4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F468); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80190CC4; - -s32 func_8013E054(void) { - return D_80190CC4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FE64; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FE3C; -extern s16 D_8017FE3E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FE64; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FE3C = 2; - D_8017FE3E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FE3E = 0; - D_8017FE3C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80190CF8; - extern void * D_80190CFC; - extern unsigned char D_8017FADC; - extern unsigned char D_8017FAF4; - extern unsigned char D_8017FB68; - extern unsigned char D_8017FB70; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80190CF8 = &D_8017FADC; - D_80190CFC = &D_8017FB68; - } else { - D_80190CF8 = &D_8017FAF4; - D_80190CFC = &D_8017FB70; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FE64/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE64 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FE64)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FE40; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE40)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE40)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FE3C; -extern s16 D_8017FE3E; -extern unsigned char D_8017FE40; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE3E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FE3C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FE3E; - if (*r < 3) { - *r = *r + 1; - } - D_8017FE3C = (u16)D_8017FE3C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FE40; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_008/ov_SC04_008_jr_801380E0.c b/src/ov_SC04_008/ov_SC04_008_jr_801380E0.c new file mode 100644 index 000000000..d121af3b4 --- /dev/null +++ b/src/ov_SC04_008/ov_SC04_008_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018FA4C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017ED5C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80190BB4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80193450; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018FA4C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EA98)(); +extern s16 (*D_8017EA9C)(); +extern M2C_UNK (*D_8017EAA4)(); +extern s32 (*D_8017EAA8)(); +extern s32 D_80190BB0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018FA50; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017EDF0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801822D4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017EE08; +extern M2C_UNK D_8017EE10; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017EE18; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EE34[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EE40[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EE54[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EEA4[]; +extern s16 D_8017EED4[]; +extern s16 D_8017EF34[]; +extern s16 D_8017EF3C[]; +extern s16 D_8017EF5C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EF94[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017EFEC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F034[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F03C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F044[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F04C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017EFF4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F014; +extern void func_801321B0(int param_1); +extern int D_8017F024; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80190C20; +extern s32 D_80190C24[]; +extern int D_80190C28; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F058; +extern u8 D_8017F054; +extern s16 *D_8017F05C; +extern u8 D_8017F060; +extern int D_80190C20; +extern u16 D_80190C30; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F05C; /* holds a pointer value (*(u16**)&D_8017F05C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F070[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F0C4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F0C8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F0C8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F10C; +extern u8 D_8017F150; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F10C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F150 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F194[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F1D0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F1D0; + if (((s16)a1) < 0xC00) { + tbl = D_8017F194; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F20C, D_8017F20E, D_8017F210, D_8017F212, D_8017F214, D_8017F216; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F20E < ang)) goto outer_else; + if (!(ang < D_8017F214)) goto inner_else; + if (ang < D_8017F210) { *(s16 *)L = D_8017F210; goto done; } + if (D_8017F212 < ang) { *(s16 *)L = D_8017F212; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F20C) { *(s16 *)L = D_8017F20C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F216 < ang) { *(s16 *)L = D_8017F216; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80190C98; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80190C98, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80190C98; +extern s8 D_80190C9C; +extern s8 D_80190C9D; + +void func_8013C9C4(void * arg0) +{ + D_80190C98 = arg0; + D_80190C9C = 0; + D_80190C9D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80190C98; +extern s8 D_80190C9C; +extern s8 D_80190C9D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80190C98; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80190C9D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80190C9C)) * 2) + D_80190C98); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80190C9D = (unsigned char) p[1]; + D_80190C9C = D_80190C9C + 1; + if (D_80190C9D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80190C9C = 0; + *base = 0; + } + } + else + { + D_80190C9D = c - 1; + } + } + return; +} + + + +extern s32 D_80190CBC; +extern s32 D_80190CB0; +extern s32 D_80190CB4; +extern s32 D_80190CC0; + +void func_8013CABC(void) { + D_80190CBC = 1; + D_80190CB0 = 1; + D_80190CB4 = 0; + D_80190CC0 = 1; +} + + + +extern s32 D_80190CB0; +extern s32 D_80190CB4; +extern s32 D_80190CB8; +extern s32 D_80190CBC; +extern s32 D_80190CC0; + +void func_8013CAE8(void) { + D_80190CB0 = 1; + D_80190CBC = 0; + D_80190CB4 = 0; + D_80190CB8 = -1; + D_80190CC0 = 0; +} + + + +extern s32 D_80190CBC; +extern s32 D_80190CC0; +extern s32 D_80190CE8; +extern s32 D_80190CEC; + +void func_8013CB20(void) +{ + D_80190CE8 = D_80190CC0; + D_80190CEC = D_80190CBC; + D_80190CC0 = 1; + D_80190CBC = 0; +} + + + +extern s32 D_80190CE8; +extern s32 D_80190CEC; +extern s32 D_80190CC0; +extern s32 D_80190CBC; + +void func_8013CB5C(void) { + D_80190CC0 = D_80190CE8; + D_80190CBC = D_80190CEC; +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80193368; + extern u8 D_80193369; + extern u8 D_8019336A; + extern u8 D_8019336B; + extern u8 D_8019336C; + extern u8 D_8019336D; + extern u8 D_8019336E; + extern u8 D_8019336F; + extern u8 D_80193370; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80193368; t1 = D_80193369; t2 = D_8019336A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019336B; t1 = D_8019336C; t2 = D_8019336D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019336E; t1 = D_8019336F; t2 = D_80193370; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80190CC8; +extern s32 D_80190CB0; +extern s32 D_80190CCC; +extern s32 D_80190CBC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80190CC8 != 0) { + if (D_80190CC8 != 2) { + if (((D_80190CC8 < 3) && (D_80190CC8 == 1)) && + (D_80190CCC = D_80190CCC + 1, 0x23a < D_80190CCC)) { + D_80190CB0 = D_80190CC8; + D_80190CC8 = 2; + } + } else { + D_80190CB0 = D_80190CB0 + -1; + if (D_80190CB0 == 0) { + D_80190CB0 = D_80190CC8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80190CBC == 0) { + D_80190CC8 = D_80190CC8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80190CBC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80190CBC; +} + + + +extern s32 D_80190CC8; + +void func_8013D164(void) { + D_80190CC8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019344A; +extern u8 D_801934BE; +extern u8 D_80193372; +extern u8 D_8019342C; +extern u8 D_80193350; +extern u8 D_80193371; +extern s32 D_80193430; + +void func_8013D330(void) { + if ((D_8019344A & 0xff) != D_801934BE) { + D_8019344A = ((D_8019344A & 0xff) < D_801934BE) ? (D_8019344A + 1) : (D_8019344A - 1); + } + if ((D_80193372 & 0xff) != D_8019342C) { + D_80193372 = ((D_80193372 & 0xff) < D_8019342C) ? (D_80193372 + 1) : (D_80193372 - 1); + } + if ((D_80193350 & 0xff) != D_80193371) { + D_80193350 = ((D_80193350 & 0xff) < D_80193371) ? (D_80193350 + 1) : (D_80193350 - 1); + } + D_80193430 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80190CA0; +extern void *D_80190CA4; +extern void *D_80190CA8; +extern s32 D_80190CD0; +extern s32 D_80190CD4; +extern s32 D_80190CD8; +extern s32 D_801933A4[]; + +extern u8 D_8017F304[]; +extern u8 D_8017F3AC[]; +extern u8 D_8017F25C[]; +extern u8 D_8017F358[]; +extern u8 D_8017F3D8[]; +extern u8 D_8017F2B0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80190CD0 = param_2; + D_80190CD4 = (param_2 >> 2) & 3; + D_80190CD8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80190CA0 = D_8017F304; + D_80190CA4 = D_8017F3AC; + D_80190CA8 = D_8017F25C; + } else { + D_80190CA0 = D_8017F358; + D_80190CA4 = D_8017F3D8; + D_80190CA8 = D_8017F2B0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80190CD8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80190CD0 & 2) != 0) { + D_801933A4[0] = 0x140; + D_801933A4[3] = 0x80; + if (p[0x37] == 4) { + D_801933A4[0] = 0x140; + D_801933A4[3] = 0; + } + if (p[0x37] == 0) { + D_801933A4[0] = 0x140; + D_801933A4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80190CA8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80190CA8; +extern s16 *D_80190CAC; +extern s32 D_80190CBC; +extern s32 D_80190CDC; +extern s32 D_80190CE0; +extern s32 D_80190CE4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80190CAC != 0) { + D_80190CBC = 0; + p = (int *)(param_1 * 12 + (int)D_80190CA8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80190CDC != x) { + flag = 1; + if (D_80190CDC < x) { + if (x - D_80190CDC < 5) { + D_80190CDC = x; + } else { + D_80190CDC = D_80190CDC + 4; + } + } else { + if (D_80190CDC - x < 5) { + D_80190CDC = x; + } else { + D_80190CDC = D_80190CDC - 4; + } + } + } + if (D_80190CE0 != y) { + flag = 1; + if (D_80190CE0 < y) { + if (y - D_80190CE0 < 5) { + D_80190CE0 = y; + } else { + D_80190CE0 = D_80190CE0 + 4; + } + } else { + if (D_80190CE0 - y < 5) { + D_80190CE0 = y; + } else { + D_80190CE0 = D_80190CE0 - 4; + } + } + } + if (D_80190CE4 != z) { + flag = 1; + if (D_80190CE4 < z) { + if (z - D_80190CE4 < 5) { + D_80190CE4 = z; + } else { + D_80190CE4 = D_80190CE4 + 4; + } + } else { + if (D_80190CE4 - z < 5) { + D_80190CE4 = z; + } else { + D_80190CE4 = D_80190CE4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80190CBC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F468[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80190CAC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80190CDC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80190CE0); + uVar5 = (*(int*)&D_80190CE4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F468); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80190CC4; + +s32 func_8013E054(void) { + return D_80190CC4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FE64; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FE3C; +extern s16 D_8017FE3E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FE64; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FE3C = 2; + D_8017FE3E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FE3E = 0; + D_8017FE3C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80190CF8; + extern void * D_80190CFC; + extern unsigned char D_8017FADC; + extern unsigned char D_8017FAF4; + extern unsigned char D_8017FB68; + extern unsigned char D_8017FB70; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80190CF8 = &D_8017FADC; + D_80190CFC = &D_8017FB68; + } else { + D_80190CF8 = &D_8017FAF4; + D_80190CFC = &D_8017FB70; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FE64/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE64 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FE64)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FE40; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE40)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE40)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FE3C; +extern s16 D_8017FE3E; +extern unsigned char D_8017FE40; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE3E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FE3C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FE3E; + if (*r < 3) { + *r = *r + 1; + } + D_8017FE3C = (u16)D_8017FE3C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FE40; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_009/ov_SC04_009_jr_8012ACE0.c b/src/ov_SC04_009/ov_SC04_009_jr_8012ACE0.c index 6a81d6966..bdc1f67ef 100644 --- a/src/ov_SC04_009/ov_SC04_009_jr_8012ACE0.c +++ b/src/ov_SC04_009/ov_SC04_009_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F0F4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F0F4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F138; -extern u8 D_8017F17C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F138; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F17C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F1C0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F1FC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F1FC; - if (((s16)a1) < 0xC00) { - tbl = D_8017F1C0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F238, D_8017F23A, D_8017F23C, D_8017F23E, D_8017F240, D_8017F242; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F23A < ang)) goto outer_else; - if (!(ang < D_8017F240)) goto inner_else; - if (ang < D_8017F23C) { *(s16 *)L = D_8017F23C; goto done; } - if (D_8017F23E < ang) { *(s16 *)L = D_8017F23E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F238) { *(s16 *)L = D_8017F238; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F242 < ang) { *(s16 *)L = D_8017F242; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80196EA8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80196EA8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80196EA8; -extern s8 D_80196EAC; -extern s8 D_80196EAD; - -void func_8013C9C4(void * arg0) -{ - D_80196EA8 = arg0; - D_80196EAC = 0; - D_80196EAD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80196EA8; -extern s8 D_80196EAC; -extern s8 D_80196EAD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80196EA8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80196EAD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80196EAC)) * 2) + D_80196EA8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80196EAD = (unsigned char) p[1]; - D_80196EAC = D_80196EAC + 1; - if (D_80196EAD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80196EAC = 0; - *base = 0; - } - } - else - { - D_80196EAD = c - 1; - } - } - return; -} - - - -extern s32 D_80196ECC; -extern s32 D_80196EC0; -extern s32 D_80196EC4; -extern s32 D_80196ED0; - -void func_8013CABC(void) { - D_80196ECC = 1; - D_80196EC0 = 1; - D_80196EC4 = 0; - D_80196ED0 = 1; -} - - - -extern s32 D_80196EC0; -extern s32 D_80196EC4; -extern s32 D_80196EC8; -extern s32 D_80196ECC; -extern s32 D_80196ED0; - -void func_8013CAE8(void) { - D_80196EC0 = 1; - D_80196ECC = 0; - D_80196EC4 = 0; - D_80196EC8 = -1; - D_80196ED0 = 0; -} - - - -extern s32 D_80196ECC; -extern s32 D_80196ED0; -extern s32 D_80196EF8; -extern s32 D_80196EFC; - -void func_8013CB20(void) -{ - D_80196EF8 = D_80196ED0; - D_80196EFC = D_80196ECC; - D_80196ED0 = 1; - D_80196ECC = 0; -} - - - -extern s32 D_80196EF8; -extern s32 D_80196EFC; -extern s32 D_80196ED0; -extern s32 D_80196ECC; - -void func_8013CB5C(void) { - D_80196ED0 = D_80196EF8; - D_80196ECC = D_80196EFC; -} - - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80198118; - extern u8 D_80198119; - extern u8 D_8019811A; - extern u8 D_8019811B; - extern u8 D_8019811C; - extern u8 D_8019811D; - extern u8 D_8019811E; - extern u8 D_8019811F; - extern u8 D_80198120; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80198118; t1 = D_80198119; t2 = D_8019811A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019811B; t1 = D_8019811C; t2 = D_8019811D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019811E; t1 = D_8019811F; t2 = D_80198120; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80196ED8; -extern s32 D_80196EC0; -extern s32 D_80196EDC; -extern s32 D_80196ECC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80196ED8 != 0) { - if (D_80196ED8 != 2) { - if (((D_80196ED8 < 3) && (D_80196ED8 == 1)) && - (D_80196EDC = D_80196EDC + 1, 0x23a < D_80196EDC)) { - D_80196EC0 = D_80196ED8; - D_80196ED8 = 2; - } - } else { - D_80196EC0 = D_80196EC0 + -1; - if (D_80196EC0 == 0) { - D_80196EC0 = D_80196ED8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80196ECC == 0) { - D_80196ED8 = D_80196ED8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80196ECC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80196ECC; -} - - - -extern s32 D_80196ED8; - -void func_8013D164(void) { - D_80196ED8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801981FA; -extern u8 D_8019826E; -extern u8 D_80198122; -extern u8 D_801981DC; -extern u8 D_80198100; -extern u8 D_80198121; -extern s32 D_801981E0; - -void func_8013D330(void) { - if ((D_801981FA & 0xff) != D_8019826E) { - D_801981FA = ((D_801981FA & 0xff) < D_8019826E) ? (D_801981FA + 1) : (D_801981FA - 1); - } - if ((D_80198122 & 0xff) != D_801981DC) { - D_80198122 = ((D_80198122 & 0xff) < D_801981DC) ? (D_80198122 + 1) : (D_80198122 - 1); - } - if ((D_80198100 & 0xff) != D_80198121) { - D_80198100 = ((D_80198100 & 0xff) < D_80198121) ? (D_80198100 + 1) : (D_80198100 - 1); - } - D_801981E0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80196EB0; -extern void *D_80196EB4; -extern void *D_80196EB8; -extern s32 D_80196EE0; -extern s32 D_80196EE4; -extern s32 D_80196EE8; -extern s32 D_80198154[]; - -extern u8 D_8017F330[]; -extern u8 D_8017F3D8[]; -extern u8 D_8017F288[]; -extern u8 D_8017F384[]; -extern u8 D_8017F404[]; -extern u8 D_8017F2DC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80196EE0 = param_2; - D_80196EE4 = (param_2 >> 2) & 3; - D_80196EE8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80196EB0 = D_8017F330; - D_80196EB4 = D_8017F3D8; - D_80196EB8 = D_8017F288; - } else { - D_80196EB0 = D_8017F384; - D_80196EB4 = D_8017F404; - D_80196EB8 = D_8017F2DC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80196EE8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80196EE0 & 2) != 0) { - D_80198154[0] = 0x140; - D_80198154[3] = 0x80; - if (p[0x37] == 4) { - D_80198154[0] = 0x140; - D_80198154[3] = 0; - } - if (p[0x37] == 0) { - D_80198154[0] = 0x140; - D_80198154[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80196EB8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80196EB8; -extern s16 *D_80196EBC; -extern s32 D_80196ECC; -extern s32 D_80196EEC; -extern s32 D_80196EF0; -extern s32 D_80196EF4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80196EBC != 0) { - D_80196ECC = 0; - p = (int *)(param_1 * 12 + (int)D_80196EB8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80196EEC != x) { - flag = 1; - if (D_80196EEC < x) { - if (x - D_80196EEC < 5) { - D_80196EEC = x; - } else { - D_80196EEC = D_80196EEC + 4; - } - } else { - if (D_80196EEC - x < 5) { - D_80196EEC = x; - } else { - D_80196EEC = D_80196EEC - 4; - } - } - } - if (D_80196EF0 != y) { - flag = 1; - if (D_80196EF0 < y) { - if (y - D_80196EF0 < 5) { - D_80196EF0 = y; - } else { - D_80196EF0 = D_80196EF0 + 4; - } - } else { - if (D_80196EF0 - y < 5) { - D_80196EF0 = y; - } else { - D_80196EF0 = D_80196EF0 - 4; - } - } - } - if (D_80196EF4 != z) { - flag = 1; - if (D_80196EF4 < z) { - if (z - D_80196EF4 < 5) { - D_80196EF4 = z; - } else { - D_80196EF4 = D_80196EF4 + 4; - } - } else { - if (D_80196EF4 - z < 5) { - D_80196EF4 = z; - } else { - D_80196EF4 = D_80196EF4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80196ECC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F494[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80196EBC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80196EEC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80196EF0); - uVar5 = (*(int*)&D_80196EF4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F494); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80196ED4; - -s32 func_8013E054(void) { - return D_80196ED4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FE90; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FE68; -extern s16 D_8017FE6A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FE90; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FE68 = 2; - D_8017FE6A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FE6A = 0; - D_8017FE68 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80196F08; - extern void * D_80196F0C; - extern unsigned char D_8017FB08; - extern unsigned char D_8017FB20; - extern unsigned char D_8017FB94; - extern unsigned char D_8017FB9C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80196F08 = &D_8017FB08; - D_80196F0C = &D_8017FB94; - } else { - D_80196F08 = &D_8017FB20; - D_80196F0C = &D_8017FB9C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FE90/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE90 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FE90)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FE6C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE6C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE6C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FE68; -extern s16 D_8017FE6A; -extern unsigned char D_8017FE6C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE6A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FE68` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FE6A; - if (*r < 3) { - *r = *r + 1; - } - D_8017FE68 = (u16)D_8017FE68 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE6C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FE6C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE6C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_009/ov_SC04_009_jr_801380E0.c b/src/ov_SC04_009/ov_SC04_009_jr_801380E0.c new file mode 100644 index 000000000..69d766b2e --- /dev/null +++ b/src/ov_SC04_009/ov_SC04_009_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80195C60; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017ED88[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80196DC4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80198200; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80195C60; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EAC4)(); +extern s16 (*D_8017EAC8)(); +extern M2C_UNK (*D_8017EAD0)(); +extern s32 (*D_8017EAD4)(); +extern s32 D_80196DC0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_80195C64; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017EE1C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182300; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017EE34; +extern M2C_UNK D_8017EE3C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017EE44; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EE60[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EE6C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EE80[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EED0[]; +extern s16 D_8017EF00[]; +extern s16 D_8017EF60[]; +extern s16 D_8017EF68[]; +extern s16 D_8017EF88[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EFC0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F018[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F060[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F068[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F070[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F078[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F020; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F040; +extern void func_801321B0(int param_1); +extern int D_8017F050; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80196E30; +extern s32 D_80196E34[]; +extern int D_80196E38; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F084; +extern u8 D_8017F080; +extern s16 *D_8017F088; +extern u8 D_8017F08C; +extern int D_80196E30; +extern u16 D_80196E40; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F088; /* holds a pointer value (*(u16**)&D_8017F088) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F09C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F0F0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F0F4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F0F4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F138; +extern u8 D_8017F17C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F138; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F17C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F1C0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F1FC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F1FC; + if (((s16)a1) < 0xC00) { + tbl = D_8017F1C0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F238, D_8017F23A, D_8017F23C, D_8017F23E, D_8017F240, D_8017F242; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F23A < ang)) goto outer_else; + if (!(ang < D_8017F240)) goto inner_else; + if (ang < D_8017F23C) { *(s16 *)L = D_8017F23C; goto done; } + if (D_8017F23E < ang) { *(s16 *)L = D_8017F23E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F238) { *(s16 *)L = D_8017F238; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F242 < ang) { *(s16 *)L = D_8017F242; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80196EA8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80196EA8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80196EA8; +extern s8 D_80196EAC; +extern s8 D_80196EAD; + +void func_8013C9C4(void * arg0) +{ + D_80196EA8 = arg0; + D_80196EAC = 0; + D_80196EAD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80196EA8; +extern s8 D_80196EAC; +extern s8 D_80196EAD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80196EA8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80196EAD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80196EAC)) * 2) + D_80196EA8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80196EAD = (unsigned char) p[1]; + D_80196EAC = D_80196EAC + 1; + if (D_80196EAD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80196EAC = 0; + *base = 0; + } + } + else + { + D_80196EAD = c - 1; + } + } + return; +} + + + +extern s32 D_80196ECC; +extern s32 D_80196EC0; +extern s32 D_80196EC4; +extern s32 D_80196ED0; + +void func_8013CABC(void) { + D_80196ECC = 1; + D_80196EC0 = 1; + D_80196EC4 = 0; + D_80196ED0 = 1; +} + + + +extern s32 D_80196EC0; +extern s32 D_80196EC4; +extern s32 D_80196EC8; +extern s32 D_80196ECC; +extern s32 D_80196ED0; + +void func_8013CAE8(void) { + D_80196EC0 = 1; + D_80196ECC = 0; + D_80196EC4 = 0; + D_80196EC8 = -1; + D_80196ED0 = 0; +} + + + +extern s32 D_80196ECC; +extern s32 D_80196ED0; +extern s32 D_80196EF8; +extern s32 D_80196EFC; + +void func_8013CB20(void) +{ + D_80196EF8 = D_80196ED0; + D_80196EFC = D_80196ECC; + D_80196ED0 = 1; + D_80196ECC = 0; +} + + + +extern s32 D_80196EF8; +extern s32 D_80196EFC; +extern s32 D_80196ED0; +extern s32 D_80196ECC; + +void func_8013CB5C(void) { + D_80196ED0 = D_80196EF8; + D_80196ECC = D_80196EFC; +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80198118; + extern u8 D_80198119; + extern u8 D_8019811A; + extern u8 D_8019811B; + extern u8 D_8019811C; + extern u8 D_8019811D; + extern u8 D_8019811E; + extern u8 D_8019811F; + extern u8 D_80198120; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80198118; t1 = D_80198119; t2 = D_8019811A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019811B; t1 = D_8019811C; t2 = D_8019811D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019811E; t1 = D_8019811F; t2 = D_80198120; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80196ED8; +extern s32 D_80196EC0; +extern s32 D_80196EDC; +extern s32 D_80196ECC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80196ED8 != 0) { + if (D_80196ED8 != 2) { + if (((D_80196ED8 < 3) && (D_80196ED8 == 1)) && + (D_80196EDC = D_80196EDC + 1, 0x23a < D_80196EDC)) { + D_80196EC0 = D_80196ED8; + D_80196ED8 = 2; + } + } else { + D_80196EC0 = D_80196EC0 + -1; + if (D_80196EC0 == 0) { + D_80196EC0 = D_80196ED8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80196ECC == 0) { + D_80196ED8 = D_80196ED8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80196ECC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80196ECC; +} + + + +extern s32 D_80196ED8; + +void func_8013D164(void) { + D_80196ED8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801981FA; +extern u8 D_8019826E; +extern u8 D_80198122; +extern u8 D_801981DC; +extern u8 D_80198100; +extern u8 D_80198121; +extern s32 D_801981E0; + +void func_8013D330(void) { + if ((D_801981FA & 0xff) != D_8019826E) { + D_801981FA = ((D_801981FA & 0xff) < D_8019826E) ? (D_801981FA + 1) : (D_801981FA - 1); + } + if ((D_80198122 & 0xff) != D_801981DC) { + D_80198122 = ((D_80198122 & 0xff) < D_801981DC) ? (D_80198122 + 1) : (D_80198122 - 1); + } + if ((D_80198100 & 0xff) != D_80198121) { + D_80198100 = ((D_80198100 & 0xff) < D_80198121) ? (D_80198100 + 1) : (D_80198100 - 1); + } + D_801981E0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80196EB0; +extern void *D_80196EB4; +extern void *D_80196EB8; +extern s32 D_80196EE0; +extern s32 D_80196EE4; +extern s32 D_80196EE8; +extern s32 D_80198154[]; + +extern u8 D_8017F330[]; +extern u8 D_8017F3D8[]; +extern u8 D_8017F288[]; +extern u8 D_8017F384[]; +extern u8 D_8017F404[]; +extern u8 D_8017F2DC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80196EE0 = param_2; + D_80196EE4 = (param_2 >> 2) & 3; + D_80196EE8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80196EB0 = D_8017F330; + D_80196EB4 = D_8017F3D8; + D_80196EB8 = D_8017F288; + } else { + D_80196EB0 = D_8017F384; + D_80196EB4 = D_8017F404; + D_80196EB8 = D_8017F2DC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80196EE8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80196EE0 & 2) != 0) { + D_80198154[0] = 0x140; + D_80198154[3] = 0x80; + if (p[0x37] == 4) { + D_80198154[0] = 0x140; + D_80198154[3] = 0; + } + if (p[0x37] == 0) { + D_80198154[0] = 0x140; + D_80198154[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80196EB8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80196EB8; +extern s16 *D_80196EBC; +extern s32 D_80196ECC; +extern s32 D_80196EEC; +extern s32 D_80196EF0; +extern s32 D_80196EF4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80196EBC != 0) { + D_80196ECC = 0; + p = (int *)(param_1 * 12 + (int)D_80196EB8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80196EEC != x) { + flag = 1; + if (D_80196EEC < x) { + if (x - D_80196EEC < 5) { + D_80196EEC = x; + } else { + D_80196EEC = D_80196EEC + 4; + } + } else { + if (D_80196EEC - x < 5) { + D_80196EEC = x; + } else { + D_80196EEC = D_80196EEC - 4; + } + } + } + if (D_80196EF0 != y) { + flag = 1; + if (D_80196EF0 < y) { + if (y - D_80196EF0 < 5) { + D_80196EF0 = y; + } else { + D_80196EF0 = D_80196EF0 + 4; + } + } else { + if (D_80196EF0 - y < 5) { + D_80196EF0 = y; + } else { + D_80196EF0 = D_80196EF0 - 4; + } + } + } + if (D_80196EF4 != z) { + flag = 1; + if (D_80196EF4 < z) { + if (z - D_80196EF4 < 5) { + D_80196EF4 = z; + } else { + D_80196EF4 = D_80196EF4 + 4; + } + } else { + if (D_80196EF4 - z < 5) { + D_80196EF4 = z; + } else { + D_80196EF4 = D_80196EF4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80196ECC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F494[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80196EBC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80196EEC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80196EF0); + uVar5 = (*(int*)&D_80196EF4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F494); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80196ED4; + +s32 func_8013E054(void) { + return D_80196ED4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FE90; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FE68; +extern s16 D_8017FE6A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FE90; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FE68 = 2; + D_8017FE6A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FE6A = 0; + D_8017FE68 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80196F08; + extern void * D_80196F0C; + extern unsigned char D_8017FB08; + extern unsigned char D_8017FB20; + extern unsigned char D_8017FB94; + extern unsigned char D_8017FB9C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80196F08 = &D_8017FB08; + D_80196F0C = &D_8017FB94; + } else { + D_80196F08 = &D_8017FB20; + D_80196F0C = &D_8017FB9C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FE90/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE90 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FE90)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FE6C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE6C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE6C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FE68; +extern s16 D_8017FE6A; +extern unsigned char D_8017FE6C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE6A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FE68` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FE6A; + if (*r < 3) { + *r = *r + 1; + } + D_8017FE68 = (u16)D_8017FE68 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE6C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FE6C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE6C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_009/nonmatchings/ov_SC04_009_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_010/ov_SC04_010_jr_8012ACE0.c b/src/ov_SC04_010/ov_SC04_010_jr_8012ACE0.c index 09f6c97fa..8414c83c0 100644 --- a/src/ov_SC04_010/ov_SC04_010_jr_8012ACE0.c +++ b/src/ov_SC04_010/ov_SC04_010_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E7A0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E7A0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E7E4; -extern u8 D_8017E828; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E7E4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E828 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E86C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E8A8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E8A8; - if (((s16)a1) < 0xC00) { - tbl = D_8017E86C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E8E4, D_8017E8E6, D_8017E8E8, D_8017E8EA, D_8017E8EC, D_8017E8EE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E8E6 < ang)) goto outer_else; - if (!(ang < D_8017E8EC)) goto inner_else; - if (ang < D_8017E8E8) { *(s16 *)L = D_8017E8E8; goto done; } - if (D_8017E8EA < ang) { *(s16 *)L = D_8017E8EA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E8E4) { *(s16 *)L = D_8017E8E4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E8EE < ang) { *(s16 *)L = D_8017E8EE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018E340; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018E340, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018E340; -extern s8 D_8018E344; -extern s8 D_8018E345; - -void func_8013C9C4(void * arg0) -{ - D_8018E340 = arg0; - D_8018E344 = 0; - D_8018E345 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018E340; -extern s8 D_8018E344; -extern s8 D_8018E345; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018E340; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018E345; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E344)) * 2) + D_8018E340); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018E345 = (unsigned char) p[1]; - D_8018E344 = D_8018E344 + 1; - if (D_8018E345 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018E344 = 0; - *base = 0; - } - } - else - { - D_8018E345 = c - 1; - } - } - return; -} - - - -extern s32 D_8018E364; -extern s32 D_8018E358; -extern s32 D_8018E35C; -extern s32 D_8018E368; - -void func_8013CABC(void) { - D_8018E364 = 1; - D_8018E358 = 1; - D_8018E35C = 0; - D_8018E368 = 1; -} - - - -extern s32 D_8018E358; -extern s32 D_8018E35C; -extern s32 D_8018E360; -extern s32 D_8018E364; -extern s32 D_8018E368; - -void func_8013CAE8(void) { - D_8018E358 = 1; - D_8018E364 = 0; - D_8018E35C = 0; - D_8018E360 = -1; - D_8018E368 = 0; -} - - - -extern s32 D_8018E364; -extern s32 D_8018E368; -extern s32 D_8018E390; -extern s32 D_8018E394; - -void func_8013CB20(void) -{ - D_8018E390 = D_8018E368; - D_8018E394 = D_8018E364; - D_8018E368 = 1; - D_8018E364 = 0; -} - - - -extern s32 D_8018E390; -extern s32 D_8018E394; -extern s32 D_8018E368; -extern s32 D_8018E364; - -void func_8013CB5C(void) { - D_8018E368 = D_8018E390; - D_8018E364 = D_8018E394; -} - - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8018F5F0; - extern u8 D_8018F5F1; - extern u8 D_8018F5F2; - extern u8 D_8018F5F3; - extern u8 D_8018F5F4; - extern u8 D_8018F5F5; - extern u8 D_8018F5F6; - extern u8 D_8018F5F7; - extern u8 D_8018F5F8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8018F5F0; t1 = D_8018F5F1; t2 = D_8018F5F2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8018F5F3; t1 = D_8018F5F4; t2 = D_8018F5F5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8018F5F6; t1 = D_8018F5F7; t2 = D_8018F5F8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018E370; -extern s32 D_8018E358; -extern s32 D_8018E374; -extern s32 D_8018E364; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018E370 != 0) { - if (D_8018E370 != 2) { - if (((D_8018E370 < 3) && (D_8018E370 == 1)) && - (D_8018E374 = D_8018E374 + 1, 0x23a < D_8018E374)) { - D_8018E358 = D_8018E370; - D_8018E370 = 2; - } - } else { - D_8018E358 = D_8018E358 + -1; - if (D_8018E358 == 0) { - D_8018E358 = D_8018E370; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018E364 == 0) { - D_8018E370 = D_8018E370 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018E364; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018E364; -} - - - -extern s32 D_8018E370; - -void func_8013D164(void) { - D_8018E370 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8018F6D2; -extern u8 D_8018F746; -extern u8 D_8018F5FA; -extern u8 D_8018F6B4; -extern u8 D_8018F5D8; -extern u8 D_8018F5F9; -extern s32 D_8018F6B8; - -void func_8013D330(void) { - if ((D_8018F6D2 & 0xff) != D_8018F746) { - D_8018F6D2 = ((D_8018F6D2 & 0xff) < D_8018F746) ? (D_8018F6D2 + 1) : (D_8018F6D2 - 1); - } - if ((D_8018F5FA & 0xff) != D_8018F6B4) { - D_8018F5FA = ((D_8018F5FA & 0xff) < D_8018F6B4) ? (D_8018F5FA + 1) : (D_8018F5FA - 1); - } - if ((D_8018F5D8 & 0xff) != D_8018F5F9) { - D_8018F5D8 = ((D_8018F5D8 & 0xff) < D_8018F5F9) ? (D_8018F5D8 + 1) : (D_8018F5D8 - 1); - } - D_8018F6B8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018E348; -extern void *D_8018E34C; -extern void *D_8018E350; -extern s32 D_8018E378; -extern s32 D_8018E37C; -extern s32 D_8018E380; -extern s32 D_8018F62C[]; - -extern u8 D_8017E9DC[]; -extern u8 D_8017EA84[]; -extern u8 D_8017E934[]; -extern u8 D_8017EA30[]; -extern u8 D_8017EAB0[]; -extern u8 D_8017E988[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018E378 = param_2; - D_8018E37C = (param_2 >> 2) & 3; - D_8018E380 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018E348 = D_8017E9DC; - D_8018E34C = D_8017EA84; - D_8018E350 = D_8017E934; - } else { - D_8018E348 = D_8017EA30; - D_8018E34C = D_8017EAB0; - D_8018E350 = D_8017E988; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018E380 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018E378 & 2) != 0) { - D_8018F62C[0] = 0x140; - D_8018F62C[3] = 0x80; - if (p[0x37] == 4) { - D_8018F62C[0] = 0x140; - D_8018F62C[3] = 0; - } - if (p[0x37] == 0) { - D_8018F62C[0] = 0x140; - D_8018F62C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018E350)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018E350; -extern s16 *D_8018E354; -extern s32 D_8018E364; -extern s32 D_8018E384; -extern s32 D_8018E388; -extern s32 D_8018E38C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018E354 != 0) { - D_8018E364 = 0; - p = (int *)(param_1 * 12 + (int)D_8018E350); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018E384 != x) { - flag = 1; - if (D_8018E384 < x) { - if (x - D_8018E384 < 5) { - D_8018E384 = x; - } else { - D_8018E384 = D_8018E384 + 4; - } - } else { - if (D_8018E384 - x < 5) { - D_8018E384 = x; - } else { - D_8018E384 = D_8018E384 - 4; - } - } - } - if (D_8018E388 != y) { - flag = 1; - if (D_8018E388 < y) { - if (y - D_8018E388 < 5) { - D_8018E388 = y; - } else { - D_8018E388 = D_8018E388 + 4; - } - } else { - if (D_8018E388 - y < 5) { - D_8018E388 = y; - } else { - D_8018E388 = D_8018E388 - 4; - } - } - } - if (D_8018E38C != z) { - flag = 1; - if (D_8018E38C < z) { - if (z - D_8018E38C < 5) { - D_8018E38C = z; - } else { - D_8018E38C = D_8018E38C + 4; - } - } else { - if (D_8018E38C - z < 5) { - D_8018E38C = z; - } else { - D_8018E38C = D_8018E38C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018E364 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017EB40[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018E354); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E384); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E388); - uVar5 = (*(int*)&D_8018E38C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017EB40); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018E36C; - -s32 func_8013E054(void) { - return D_8018E36C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F53C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F514; -extern s16 D_8017F516; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F53C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F514 = 2; - D_8017F516 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F516 = 0; - D_8017F514 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018E3A0; - extern void * D_8018E3A4; - extern unsigned char D_8017F1B4; - extern unsigned char D_8017F1CC; - extern unsigned char D_8017F240; - extern unsigned char D_8017F248; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018E3A0 = &D_8017F1B4; - D_8018E3A4 = &D_8017F240; - } else { - D_8018E3A0 = &D_8017F1CC; - D_8018E3A4 = &D_8017F248; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F53C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F53C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F53C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F518; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F518)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F518)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F514; -extern s16 D_8017F516; -extern unsigned char D_8017F518; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F516` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F514` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F516; - if (*r < 3) { - *r = *r + 1; - } - D_8017F514 = (u16)D_8017F514 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F518); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F518; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F518); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_010/ov_SC04_010_jr_801380E0.c b/src/ov_SC04_010/ov_SC04_010_jr_801380E0.c new file mode 100644 index 000000000..8d36cfccc --- /dev/null +++ b/src/ov_SC04_010/ov_SC04_010_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D0EC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E434[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018E25C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8018F6D8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D0EC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E170)(); +extern s16 (*D_8017E174)(); +extern M2C_UNK (*D_8017E17C)(); +extern s32 (*D_8017E180)(); +extern s32 D_8018E258; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D0F0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E4C8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801819AC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E4E0; +extern M2C_UNK D_8017E4E8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E4F0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E50C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E518[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E52C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E57C[]; +extern s16 D_8017E5AC[]; +extern s16 D_8017E60C[]; +extern s16 D_8017E614[]; +extern s16 D_8017E634[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E66C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E6C4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E70C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E714[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E71C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E724[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E6CC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E6EC; +extern void func_801321B0(int param_1); +extern int D_8017E6FC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018E2C8; +extern s32 D_8018E2CC[]; +extern int D_8018E2D0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E730; +extern u8 D_8017E72C; +extern s16 *D_8017E734; +extern u8 D_8017E738; +extern int D_8018E2C8; +extern u16 D_8018E2D8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E734; /* holds a pointer value (*(u16**)&D_8017E734) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E748[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E79C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E7A0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E7A0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E7E4; +extern u8 D_8017E828; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E7E4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E828 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E86C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E8A8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E8A8; + if (((s16)a1) < 0xC00) { + tbl = D_8017E86C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E8E4, D_8017E8E6, D_8017E8E8, D_8017E8EA, D_8017E8EC, D_8017E8EE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E8E6 < ang)) goto outer_else; + if (!(ang < D_8017E8EC)) goto inner_else; + if (ang < D_8017E8E8) { *(s16 *)L = D_8017E8E8; goto done; } + if (D_8017E8EA < ang) { *(s16 *)L = D_8017E8EA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E8E4) { *(s16 *)L = D_8017E8E4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E8EE < ang) { *(s16 *)L = D_8017E8EE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018E340; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018E340, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018E340; +extern s8 D_8018E344; +extern s8 D_8018E345; + +void func_8013C9C4(void * arg0) +{ + D_8018E340 = arg0; + D_8018E344 = 0; + D_8018E345 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018E340; +extern s8 D_8018E344; +extern s8 D_8018E345; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018E340; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018E345; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E344)) * 2) + D_8018E340); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018E345 = (unsigned char) p[1]; + D_8018E344 = D_8018E344 + 1; + if (D_8018E345 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018E344 = 0; + *base = 0; + } + } + else + { + D_8018E345 = c - 1; + } + } + return; +} + + + +extern s32 D_8018E364; +extern s32 D_8018E358; +extern s32 D_8018E35C; +extern s32 D_8018E368; + +void func_8013CABC(void) { + D_8018E364 = 1; + D_8018E358 = 1; + D_8018E35C = 0; + D_8018E368 = 1; +} + + + +extern s32 D_8018E358; +extern s32 D_8018E35C; +extern s32 D_8018E360; +extern s32 D_8018E364; +extern s32 D_8018E368; + +void func_8013CAE8(void) { + D_8018E358 = 1; + D_8018E364 = 0; + D_8018E35C = 0; + D_8018E360 = -1; + D_8018E368 = 0; +} + + + +extern s32 D_8018E364; +extern s32 D_8018E368; +extern s32 D_8018E390; +extern s32 D_8018E394; + +void func_8013CB20(void) +{ + D_8018E390 = D_8018E368; + D_8018E394 = D_8018E364; + D_8018E368 = 1; + D_8018E364 = 0; +} + + + +extern s32 D_8018E390; +extern s32 D_8018E394; +extern s32 D_8018E368; +extern s32 D_8018E364; + +void func_8013CB5C(void) { + D_8018E368 = D_8018E390; + D_8018E364 = D_8018E394; +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8018F5F0; + extern u8 D_8018F5F1; + extern u8 D_8018F5F2; + extern u8 D_8018F5F3; + extern u8 D_8018F5F4; + extern u8 D_8018F5F5; + extern u8 D_8018F5F6; + extern u8 D_8018F5F7; + extern u8 D_8018F5F8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8018F5F0; t1 = D_8018F5F1; t2 = D_8018F5F2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8018F5F3; t1 = D_8018F5F4; t2 = D_8018F5F5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8018F5F6; t1 = D_8018F5F7; t2 = D_8018F5F8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018E370; +extern s32 D_8018E358; +extern s32 D_8018E374; +extern s32 D_8018E364; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018E370 != 0) { + if (D_8018E370 != 2) { + if (((D_8018E370 < 3) && (D_8018E370 == 1)) && + (D_8018E374 = D_8018E374 + 1, 0x23a < D_8018E374)) { + D_8018E358 = D_8018E370; + D_8018E370 = 2; + } + } else { + D_8018E358 = D_8018E358 + -1; + if (D_8018E358 == 0) { + D_8018E358 = D_8018E370; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018E364 == 0) { + D_8018E370 = D_8018E370 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018E364; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018E364; +} + + + +extern s32 D_8018E370; + +void func_8013D164(void) { + D_8018E370 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8018F6D2; +extern u8 D_8018F746; +extern u8 D_8018F5FA; +extern u8 D_8018F6B4; +extern u8 D_8018F5D8; +extern u8 D_8018F5F9; +extern s32 D_8018F6B8; + +void func_8013D330(void) { + if ((D_8018F6D2 & 0xff) != D_8018F746) { + D_8018F6D2 = ((D_8018F6D2 & 0xff) < D_8018F746) ? (D_8018F6D2 + 1) : (D_8018F6D2 - 1); + } + if ((D_8018F5FA & 0xff) != D_8018F6B4) { + D_8018F5FA = ((D_8018F5FA & 0xff) < D_8018F6B4) ? (D_8018F5FA + 1) : (D_8018F5FA - 1); + } + if ((D_8018F5D8 & 0xff) != D_8018F5F9) { + D_8018F5D8 = ((D_8018F5D8 & 0xff) < D_8018F5F9) ? (D_8018F5D8 + 1) : (D_8018F5D8 - 1); + } + D_8018F6B8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018E348; +extern void *D_8018E34C; +extern void *D_8018E350; +extern s32 D_8018E378; +extern s32 D_8018E37C; +extern s32 D_8018E380; +extern s32 D_8018F62C[]; + +extern u8 D_8017E9DC[]; +extern u8 D_8017EA84[]; +extern u8 D_8017E934[]; +extern u8 D_8017EA30[]; +extern u8 D_8017EAB0[]; +extern u8 D_8017E988[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018E378 = param_2; + D_8018E37C = (param_2 >> 2) & 3; + D_8018E380 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018E348 = D_8017E9DC; + D_8018E34C = D_8017EA84; + D_8018E350 = D_8017E934; + } else { + D_8018E348 = D_8017EA30; + D_8018E34C = D_8017EAB0; + D_8018E350 = D_8017E988; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018E380 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018E378 & 2) != 0) { + D_8018F62C[0] = 0x140; + D_8018F62C[3] = 0x80; + if (p[0x37] == 4) { + D_8018F62C[0] = 0x140; + D_8018F62C[3] = 0; + } + if (p[0x37] == 0) { + D_8018F62C[0] = 0x140; + D_8018F62C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018E350)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018E350; +extern s16 *D_8018E354; +extern s32 D_8018E364; +extern s32 D_8018E384; +extern s32 D_8018E388; +extern s32 D_8018E38C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018E354 != 0) { + D_8018E364 = 0; + p = (int *)(param_1 * 12 + (int)D_8018E350); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018E384 != x) { + flag = 1; + if (D_8018E384 < x) { + if (x - D_8018E384 < 5) { + D_8018E384 = x; + } else { + D_8018E384 = D_8018E384 + 4; + } + } else { + if (D_8018E384 - x < 5) { + D_8018E384 = x; + } else { + D_8018E384 = D_8018E384 - 4; + } + } + } + if (D_8018E388 != y) { + flag = 1; + if (D_8018E388 < y) { + if (y - D_8018E388 < 5) { + D_8018E388 = y; + } else { + D_8018E388 = D_8018E388 + 4; + } + } else { + if (D_8018E388 - y < 5) { + D_8018E388 = y; + } else { + D_8018E388 = D_8018E388 - 4; + } + } + } + if (D_8018E38C != z) { + flag = 1; + if (D_8018E38C < z) { + if (z - D_8018E38C < 5) { + D_8018E38C = z; + } else { + D_8018E38C = D_8018E38C + 4; + } + } else { + if (D_8018E38C - z < 5) { + D_8018E38C = z; + } else { + D_8018E38C = D_8018E38C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018E364 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017EB40[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018E354); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E384); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E388); + uVar5 = (*(int*)&D_8018E38C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017EB40); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018E36C; + +s32 func_8013E054(void) { + return D_8018E36C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F53C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F514; +extern s16 D_8017F516; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F53C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F514 = 2; + D_8017F516 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F516 = 0; + D_8017F514 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018E3A0; + extern void * D_8018E3A4; + extern unsigned char D_8017F1B4; + extern unsigned char D_8017F1CC; + extern unsigned char D_8017F240; + extern unsigned char D_8017F248; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018E3A0 = &D_8017F1B4; + D_8018E3A4 = &D_8017F240; + } else { + D_8018E3A0 = &D_8017F1CC; + D_8018E3A4 = &D_8017F248; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F53C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F53C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F53C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F518; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F518)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F518)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F514; +extern s16 D_8017F516; +extern unsigned char D_8017F518; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F516` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F514` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F516; + if (*r < 3) { + *r = *r + 1; + } + D_8017F514 = (u16)D_8017F514 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F518); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F518; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F518); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_010/nonmatchings/ov_SC04_010_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.c b/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.c index 73b35ae36..cad70da53 100644 --- a/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.c +++ b/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80190A30[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80190A30[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80190A74; -extern u8 D_80190AB8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80190A74; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80190AB8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80190AFC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80190B38[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80190B38; - if (((s16)a1) < 0xC00) { - tbl = D_80190AFC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80190B74, D_80190B76, D_80190B78, D_80190B7A, D_80190B7C, D_80190B7E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80190B76 < ang)) goto outer_else; - if (!(ang < D_80190B7C)) goto inner_else; - if (ang < D_80190B78) { *(s16 *)L = D_80190B78; goto done; } - if (D_80190B7A < ang) { *(s16 *)L = D_80190B7A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80190B74) { *(s16 *)L = D_80190B74; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80190B7E < ang) { *(s16 *)L = D_80190B7E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801EDAA8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801EDAA8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801EDAA8; -extern s8 D_801EDAAC; -extern s8 D_801EDAAD; - -void func_8013C9C4(void * arg0) -{ - D_801EDAA8 = arg0; - D_801EDAAC = 0; - D_801EDAAD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801EDAA8; -extern s8 D_801EDAAC; -extern s8 D_801EDAAD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801EDAA8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801EDAAD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801EDAAC)) * 2) + D_801EDAA8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801EDAAD = (unsigned char) p[1]; - D_801EDAAC = D_801EDAAC + 1; - if (D_801EDAAD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801EDAAC = 0; - *base = 0; - } - } - else - { - D_801EDAAD = c - 1; - } - } - return; -} - - - -extern s32 D_801EDACC; -extern s32 D_801EDAC0; -extern s32 D_801EDAC4; -extern s32 D_801EDAD0; - -void func_8013CABC(void) { - D_801EDACC = 1; - D_801EDAC0 = 1; - D_801EDAC4 = 0; - D_801EDAD0 = 1; -} - - - -extern s32 D_801EDAC0; -extern s32 D_801EDAC4; -extern s32 D_801EDAC8; -extern s32 D_801EDACC; -extern s32 D_801EDAD0; - -void func_8013CAE8(void) { - D_801EDAC0 = 1; - D_801EDACC = 0; - D_801EDAC4 = 0; - D_801EDAC8 = -1; - D_801EDAD0 = 0; -} - - - -extern s32 D_801EDACC; -extern s32 D_801EDAD0; -extern s32 D_801EDAF8; -extern s32 D_801EDAFC; - -void func_8013CB20(void) -{ - D_801EDAF8 = D_801EDAD0; - D_801EDAFC = D_801EDACC; - D_801EDAD0 = 1; - D_801EDACC = 0; -} - - - -extern s32 D_801EDAF8; -extern s32 D_801EDAFC; -extern s32 D_801EDAD0; -extern s32 D_801EDACC; - -void func_8013CB5C(void) { - D_801EDAD0 = D_801EDAF8; - D_801EDACC = D_801EDAFC; -} - - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801F1558; - extern u8 D_801F1559; - extern u8 D_801F155A; - extern u8 D_801F155B; - extern u8 D_801F155C; - extern u8 D_801F155D; - extern u8 D_801F155E; - extern u8 D_801F155F; - extern u8 D_801F1560; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801F1558; t1 = D_801F1559; t2 = D_801F155A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801F155B; t1 = D_801F155C; t2 = D_801F155D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801F155E; t1 = D_801F155F; t2 = D_801F1560; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801EDAD8; -extern s32 D_801EDAC0; -extern s32 D_801EDADC; -extern s32 D_801EDACC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801EDAD8 != 0) { - if (D_801EDAD8 != 2) { - if (((D_801EDAD8 < 3) && (D_801EDAD8 == 1)) && - (D_801EDADC = D_801EDADC + 1, 0x23a < D_801EDADC)) { - D_801EDAC0 = D_801EDAD8; - D_801EDAD8 = 2; - } - } else { - D_801EDAC0 = D_801EDAC0 + -1; - if (D_801EDAC0 == 0) { - D_801EDAC0 = D_801EDAD8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801EDACC == 0) { - D_801EDAD8 = D_801EDAD8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801EDACC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801EDACC; -} - - - -extern s32 D_801EDAD8; - -void func_8013D164(void) { - D_801EDAD8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801F163A; -extern u8 D_801F16AE; -extern u8 D_801F1562; -extern u8 D_801F161C; -extern u8 D_801F1540; -extern u8 D_801F1561; -extern s32 D_801F1620; - -void func_8013D330(void) { - if ((D_801F163A & 0xff) != D_801F16AE) { - D_801F163A = ((D_801F163A & 0xff) < D_801F16AE) ? (D_801F163A + 1) : (D_801F163A - 1); - } - if ((D_801F1562 & 0xff) != D_801F161C) { - D_801F1562 = ((D_801F1562 & 0xff) < D_801F161C) ? (D_801F1562 + 1) : (D_801F1562 - 1); - } - if ((D_801F1540 & 0xff) != D_801F1561) { - D_801F1540 = ((D_801F1540 & 0xff) < D_801F1561) ? (D_801F1540 + 1) : (D_801F1540 - 1); - } - D_801F1620 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801EDAB0; -extern void *D_801EDAB4; -extern void *D_801EDAB8; -extern s32 D_801EDAE0; -extern s32 D_801EDAE4; -extern s32 D_801EDAE8; -extern s32 D_801F1594[]; - -extern u8 D_80190C6C[]; -extern u8 D_80190D14[]; -extern u8 D_80190BC4[]; -extern u8 D_80190CC0[]; -extern u8 D_80190D40[]; -extern u8 D_80190C18[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801EDAE0 = param_2; - D_801EDAE4 = (param_2 >> 2) & 3; - D_801EDAE8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801EDAB0 = D_80190C6C; - D_801EDAB4 = D_80190D14; - D_801EDAB8 = D_80190BC4; - } else { - D_801EDAB0 = D_80190CC0; - D_801EDAB4 = D_80190D40; - D_801EDAB8 = D_80190C18; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801EDAE8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801EDAE0 & 2) != 0) { - D_801F1594[0] = 0x140; - D_801F1594[3] = 0x80; - if (p[0x37] == 4) { - D_801F1594[0] = 0x140; - D_801F1594[3] = 0; - } - if (p[0x37] == 0) { - D_801F1594[0] = 0x140; - D_801F1594[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801EDAB8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801EDAB8; -extern s16 *D_801EDABC; -extern s32 D_801EDACC; -extern s32 D_801EDAEC; -extern s32 D_801EDAF0; -extern s32 D_801EDAF4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801EDABC != 0) { - D_801EDACC = 0; - p = (int *)(param_1 * 12 + (int)D_801EDAB8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801EDAEC != x) { - flag = 1; - if (D_801EDAEC < x) { - if (x - D_801EDAEC < 5) { - D_801EDAEC = x; - } else { - D_801EDAEC = D_801EDAEC + 4; - } - } else { - if (D_801EDAEC - x < 5) { - D_801EDAEC = x; - } else { - D_801EDAEC = D_801EDAEC - 4; - } - } - } - if (D_801EDAF0 != y) { - flag = 1; - if (D_801EDAF0 < y) { - if (y - D_801EDAF0 < 5) { - D_801EDAF0 = y; - } else { - D_801EDAF0 = D_801EDAF0 + 4; - } - } else { - if (D_801EDAF0 - y < 5) { - D_801EDAF0 = y; - } else { - D_801EDAF0 = D_801EDAF0 - 4; - } - } - } - if (D_801EDAF4 != z) { - flag = 1; - if (D_801EDAF4 < z) { - if (z - D_801EDAF4 < 5) { - D_801EDAF4 = z; - } else { - D_801EDAF4 = D_801EDAF4 + 4; - } - } else { - if (D_801EDAF4 - z < 5) { - D_801EDAF4 = z; - } else { - D_801EDAF4 = D_801EDAF4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801EDACC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80190DD0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801EDABC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EDAEC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EDAF0); - uVar5 = (*(int*)&D_801EDAF4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80190DD0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801EDAD4; - -s32 func_8013E054(void) { - return D_801EDAD4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801917CC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801917A4; -extern s16 D_801917A6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801917CC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801917A4 = 2; - D_801917A6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801917A6 = 0; - D_801917A4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801EDB08; - extern void * D_801EDB0C; - extern unsigned char D_80191444; - extern unsigned char D_8019145C; - extern unsigned char D_801914D0; - extern unsigned char D_801914D8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801EDB08 = &D_80191444; - D_801EDB0C = &D_801914D0; - } else { - D_801EDB08 = &D_8019145C; - D_801EDB0C = &D_801914D8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801917CC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801917CC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801917CC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801917A8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801917A8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801917A8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801917A4; -extern s16 D_801917A6; -extern unsigned char D_801917A8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801917A6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801917A4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801917A6; - if (*r < 3) { - *r = *r + 1; - } - D_801917A4 = (u16)D_801917A4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801917A8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801917A8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801917A8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_011/ov_SC04_011_jr_801380E0.c b/src/ov_SC04_011/ov_SC04_011_jr_801380E0.c new file mode 100644 index 000000000..e9e752cbe --- /dev/null +++ b/src/ov_SC04_011/ov_SC04_011_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801EC688; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801906C4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801ED9C4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801F1640; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801EC688; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80190400)(); +extern s16 (*D_80190404)(); +extern M2C_UNK (*D_8019040C)(); +extern s32 (*D_80190410)(); +extern s32 D_801ED9C0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801EC68C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80190758; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80193C3C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80190770; +extern M2C_UNK D_80190778; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80190780; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8019079C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801907A8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801907BC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8019080C[]; +extern s16 D_8019083C[]; +extern s16 D_8019089C[]; +extern s16 D_801908A4[]; +extern s16 D_801908C4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801908FC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80190954[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8019099C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801909A4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801909AC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801909B4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8019095C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8019097C; +extern void func_801321B0(int param_1); +extern int D_8019098C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801EDA30; +extern s32 D_801EDA34[]; +extern int D_801EDA38; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801909C0; +extern u8 D_801909BC; +extern s16 *D_801909C4; +extern u8 D_801909C8; +extern int D_801EDA30; +extern u16 D_801EDA40; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801909C4; /* holds a pointer value (*(u16**)&D_801909C4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801909D8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80190A2C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80190A30[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80190A30[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80190A74; +extern u8 D_80190AB8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80190A74; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80190AB8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80190AFC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80190B38[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80190B38; + if (((s16)a1) < 0xC00) { + tbl = D_80190AFC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80190B74, D_80190B76, D_80190B78, D_80190B7A, D_80190B7C, D_80190B7E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80190B76 < ang)) goto outer_else; + if (!(ang < D_80190B7C)) goto inner_else; + if (ang < D_80190B78) { *(s16 *)L = D_80190B78; goto done; } + if (D_80190B7A < ang) { *(s16 *)L = D_80190B7A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80190B74) { *(s16 *)L = D_80190B74; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80190B7E < ang) { *(s16 *)L = D_80190B7E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801EDAA8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801EDAA8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801EDAA8; +extern s8 D_801EDAAC; +extern s8 D_801EDAAD; + +void func_8013C9C4(void * arg0) +{ + D_801EDAA8 = arg0; + D_801EDAAC = 0; + D_801EDAAD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801EDAA8; +extern s8 D_801EDAAC; +extern s8 D_801EDAAD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801EDAA8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801EDAAD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801EDAAC)) * 2) + D_801EDAA8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801EDAAD = (unsigned char) p[1]; + D_801EDAAC = D_801EDAAC + 1; + if (D_801EDAAD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801EDAAC = 0; + *base = 0; + } + } + else + { + D_801EDAAD = c - 1; + } + } + return; +} + + + +extern s32 D_801EDACC; +extern s32 D_801EDAC0; +extern s32 D_801EDAC4; +extern s32 D_801EDAD0; + +void func_8013CABC(void) { + D_801EDACC = 1; + D_801EDAC0 = 1; + D_801EDAC4 = 0; + D_801EDAD0 = 1; +} + + + +extern s32 D_801EDAC0; +extern s32 D_801EDAC4; +extern s32 D_801EDAC8; +extern s32 D_801EDACC; +extern s32 D_801EDAD0; + +void func_8013CAE8(void) { + D_801EDAC0 = 1; + D_801EDACC = 0; + D_801EDAC4 = 0; + D_801EDAC8 = -1; + D_801EDAD0 = 0; +} + + + +extern s32 D_801EDACC; +extern s32 D_801EDAD0; +extern s32 D_801EDAF8; +extern s32 D_801EDAFC; + +void func_8013CB20(void) +{ + D_801EDAF8 = D_801EDAD0; + D_801EDAFC = D_801EDACC; + D_801EDAD0 = 1; + D_801EDACC = 0; +} + + + +extern s32 D_801EDAF8; +extern s32 D_801EDAFC; +extern s32 D_801EDAD0; +extern s32 D_801EDACC; + +void func_8013CB5C(void) { + D_801EDAD0 = D_801EDAF8; + D_801EDACC = D_801EDAFC; +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801F1558; + extern u8 D_801F1559; + extern u8 D_801F155A; + extern u8 D_801F155B; + extern u8 D_801F155C; + extern u8 D_801F155D; + extern u8 D_801F155E; + extern u8 D_801F155F; + extern u8 D_801F1560; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801F1558; t1 = D_801F1559; t2 = D_801F155A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801F155B; t1 = D_801F155C; t2 = D_801F155D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801F155E; t1 = D_801F155F; t2 = D_801F1560; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801EDAD8; +extern s32 D_801EDAC0; +extern s32 D_801EDADC; +extern s32 D_801EDACC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801EDAD8 != 0) { + if (D_801EDAD8 != 2) { + if (((D_801EDAD8 < 3) && (D_801EDAD8 == 1)) && + (D_801EDADC = D_801EDADC + 1, 0x23a < D_801EDADC)) { + D_801EDAC0 = D_801EDAD8; + D_801EDAD8 = 2; + } + } else { + D_801EDAC0 = D_801EDAC0 + -1; + if (D_801EDAC0 == 0) { + D_801EDAC0 = D_801EDAD8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801EDACC == 0) { + D_801EDAD8 = D_801EDAD8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801EDACC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801EDACC; +} + + + +extern s32 D_801EDAD8; + +void func_8013D164(void) { + D_801EDAD8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801F163A; +extern u8 D_801F16AE; +extern u8 D_801F1562; +extern u8 D_801F161C; +extern u8 D_801F1540; +extern u8 D_801F1561; +extern s32 D_801F1620; + +void func_8013D330(void) { + if ((D_801F163A & 0xff) != D_801F16AE) { + D_801F163A = ((D_801F163A & 0xff) < D_801F16AE) ? (D_801F163A + 1) : (D_801F163A - 1); + } + if ((D_801F1562 & 0xff) != D_801F161C) { + D_801F1562 = ((D_801F1562 & 0xff) < D_801F161C) ? (D_801F1562 + 1) : (D_801F1562 - 1); + } + if ((D_801F1540 & 0xff) != D_801F1561) { + D_801F1540 = ((D_801F1540 & 0xff) < D_801F1561) ? (D_801F1540 + 1) : (D_801F1540 - 1); + } + D_801F1620 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801EDAB0; +extern void *D_801EDAB4; +extern void *D_801EDAB8; +extern s32 D_801EDAE0; +extern s32 D_801EDAE4; +extern s32 D_801EDAE8; +extern s32 D_801F1594[]; + +extern u8 D_80190C6C[]; +extern u8 D_80190D14[]; +extern u8 D_80190BC4[]; +extern u8 D_80190CC0[]; +extern u8 D_80190D40[]; +extern u8 D_80190C18[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801EDAE0 = param_2; + D_801EDAE4 = (param_2 >> 2) & 3; + D_801EDAE8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801EDAB0 = D_80190C6C; + D_801EDAB4 = D_80190D14; + D_801EDAB8 = D_80190BC4; + } else { + D_801EDAB0 = D_80190CC0; + D_801EDAB4 = D_80190D40; + D_801EDAB8 = D_80190C18; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801EDAE8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801EDAE0 & 2) != 0) { + D_801F1594[0] = 0x140; + D_801F1594[3] = 0x80; + if (p[0x37] == 4) { + D_801F1594[0] = 0x140; + D_801F1594[3] = 0; + } + if (p[0x37] == 0) { + D_801F1594[0] = 0x140; + D_801F1594[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801EDAB8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801EDAB8; +extern s16 *D_801EDABC; +extern s32 D_801EDACC; +extern s32 D_801EDAEC; +extern s32 D_801EDAF0; +extern s32 D_801EDAF4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801EDABC != 0) { + D_801EDACC = 0; + p = (int *)(param_1 * 12 + (int)D_801EDAB8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801EDAEC != x) { + flag = 1; + if (D_801EDAEC < x) { + if (x - D_801EDAEC < 5) { + D_801EDAEC = x; + } else { + D_801EDAEC = D_801EDAEC + 4; + } + } else { + if (D_801EDAEC - x < 5) { + D_801EDAEC = x; + } else { + D_801EDAEC = D_801EDAEC - 4; + } + } + } + if (D_801EDAF0 != y) { + flag = 1; + if (D_801EDAF0 < y) { + if (y - D_801EDAF0 < 5) { + D_801EDAF0 = y; + } else { + D_801EDAF0 = D_801EDAF0 + 4; + } + } else { + if (D_801EDAF0 - y < 5) { + D_801EDAF0 = y; + } else { + D_801EDAF0 = D_801EDAF0 - 4; + } + } + } + if (D_801EDAF4 != z) { + flag = 1; + if (D_801EDAF4 < z) { + if (z - D_801EDAF4 < 5) { + D_801EDAF4 = z; + } else { + D_801EDAF4 = D_801EDAF4 + 4; + } + } else { + if (D_801EDAF4 - z < 5) { + D_801EDAF4 = z; + } else { + D_801EDAF4 = D_801EDAF4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801EDACC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80190DD0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801EDABC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EDAEC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EDAF0); + uVar5 = (*(int*)&D_801EDAF4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80190DD0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801EDAD4; + +s32 func_8013E054(void) { + return D_801EDAD4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801917CC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801917A4; +extern s16 D_801917A6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801917CC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801917A4 = 2; + D_801917A6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801917A6 = 0; + D_801917A4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801EDB08; + extern void * D_801EDB0C; + extern unsigned char D_80191444; + extern unsigned char D_8019145C; + extern unsigned char D_801914D0; + extern unsigned char D_801914D8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801EDB08 = &D_80191444; + D_801EDB0C = &D_801914D0; + } else { + D_801EDB08 = &D_8019145C; + D_801EDB0C = &D_801914D8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801917CC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801917CC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801917CC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801917A8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801917A8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801917A8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801917A4; +extern s16 D_801917A6; +extern unsigned char D_801917A8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801917A6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801917A4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801917A6; + if (*r < 3) { + *r = *r + 1; + } + D_801917A4 = (u16)D_801917A4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801917A8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801917A8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801917A8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_012/ov_SC04_012_jr_8012ACE0.c b/src/ov_SC04_012/ov_SC04_012_jr_8012ACE0.c index 74d255ea2..b9c432564 100644 --- a/src/ov_SC04_012/ov_SC04_012_jr_8012ACE0.c +++ b/src/ov_SC04_012/ov_SC04_012_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017EC04[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017EC04[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017EC48; -extern u8 D_8017EC8C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017EC48; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017EC8C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017ECD0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017ED0C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017ED0C; - if (((s16)a1) < 0xC00) { - tbl = D_8017ECD0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017ED48, D_8017ED4A, D_8017ED4C, D_8017ED4E, D_8017ED50, D_8017ED52; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017ED4A < ang)) goto outer_else; - if (!(ang < D_8017ED50)) goto inner_else; - if (ang < D_8017ED4C) { *(s16 *)L = D_8017ED4C; goto done; } - if (D_8017ED4E < ang) { *(s16 *)L = D_8017ED4E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017ED48) { *(s16 *)L = D_8017ED48; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017ED52 < ang) { *(s16 *)L = D_8017ED52; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80190A18; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80190A18, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80190A18; -extern s8 D_80190A1C; -extern s8 D_80190A1D; - -void func_8013C9C4(void * arg0) -{ - D_80190A18 = arg0; - D_80190A1C = 0; - D_80190A1D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80190A18; -extern s8 D_80190A1C; -extern s8 D_80190A1D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80190A18; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80190A1D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80190A1C)) * 2) + D_80190A18); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80190A1D = (unsigned char) p[1]; - D_80190A1C = D_80190A1C + 1; - if (D_80190A1D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80190A1C = 0; - *base = 0; - } - } - else - { - D_80190A1D = c - 1; - } - } - return; -} - - - -extern s32 D_80190A3C; -extern s32 D_80190A30; -extern s32 D_80190A34; -extern s32 D_80190A40; - -void func_8013CABC(void) { - D_80190A3C = 1; - D_80190A30 = 1; - D_80190A34 = 0; - D_80190A40 = 1; -} - - - -extern s32 D_80190A30; -extern s32 D_80190A34; -extern s32 D_80190A38; -extern s32 D_80190A3C; -extern s32 D_80190A40; - -void func_8013CAE8(void) { - D_80190A30 = 1; - D_80190A3C = 0; - D_80190A34 = 0; - D_80190A38 = -1; - D_80190A40 = 0; -} - - - -extern s32 D_80190A3C; -extern s32 D_80190A40; -extern s32 D_80190A68; -extern s32 D_80190A6C; - -void func_8013CB20(void) -{ - D_80190A68 = D_80190A40; - D_80190A6C = D_80190A3C; - D_80190A40 = 1; - D_80190A3C = 0; -} - - - -extern s32 D_80190A68; -extern s32 D_80190A6C; -extern s32 D_80190A40; -extern s32 D_80190A3C; - -void func_8013CB5C(void) { - D_80190A40 = D_80190A68; - D_80190A3C = D_80190A6C; -} - - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801930E8; - extern u8 D_801930E9; - extern u8 D_801930EA; - extern u8 D_801930EB; - extern u8 D_801930EC; - extern u8 D_801930ED; - extern u8 D_801930EE; - extern u8 D_801930EF; - extern u8 D_801930F0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801930E8; t1 = D_801930E9; t2 = D_801930EA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801930EB; t1 = D_801930EC; t2 = D_801930ED; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801930EE; t1 = D_801930EF; t2 = D_801930F0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80190A48; -extern s32 D_80190A30; -extern s32 D_80190A4C; -extern s32 D_80190A3C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80190A48 != 0) { - if (D_80190A48 != 2) { - if (((D_80190A48 < 3) && (D_80190A48 == 1)) && - (D_80190A4C = D_80190A4C + 1, 0x23a < D_80190A4C)) { - D_80190A30 = D_80190A48; - D_80190A48 = 2; - } - } else { - D_80190A30 = D_80190A30 + -1; - if (D_80190A30 == 0) { - D_80190A30 = D_80190A48; - ((void (*)(s32))func_8013D9B0)(2); - if (D_80190A3C == 0) { - D_80190A48 = D_80190A48 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_80190A3C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_80190A3C; -} - - - -extern s32 D_80190A48; - -void func_8013D164(void) { - D_80190A48 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801931CA; -extern u8 D_8019323E; -extern u8 D_801930F2; -extern u8 D_801931AC; -extern u8 D_801930D0; -extern u8 D_801930F1; -extern s32 D_801931B0; - -void func_8013D330(void) { - if ((D_801931CA & 0xff) != D_8019323E) { - D_801931CA = ((D_801931CA & 0xff) < D_8019323E) ? (D_801931CA + 1) : (D_801931CA - 1); - } - if ((D_801930F2 & 0xff) != D_801931AC) { - D_801930F2 = ((D_801930F2 & 0xff) < D_801931AC) ? (D_801930F2 + 1) : (D_801930F2 - 1); - } - if ((D_801930D0 & 0xff) != D_801930F1) { - D_801930D0 = ((D_801930D0 & 0xff) < D_801930F1) ? (D_801930D0 + 1) : (D_801930D0 - 1); - } - D_801931B0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80190A20; -extern void *D_80190A24; -extern void *D_80190A28; -extern s32 D_80190A50; -extern s32 D_80190A54; -extern s32 D_80190A58; -extern s32 D_80193124[]; - -extern u8 D_8017EE40[]; -extern u8 D_8017EEE8[]; -extern u8 D_8017ED98[]; -extern u8 D_8017EE94[]; -extern u8 D_8017EF14[]; -extern u8 D_8017EDEC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80190A50 = param_2; - D_80190A54 = (param_2 >> 2) & 3; - D_80190A58 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80190A20 = D_8017EE40; - D_80190A24 = D_8017EEE8; - D_80190A28 = D_8017ED98; - } else { - D_80190A20 = D_8017EE94; - D_80190A24 = D_8017EF14; - D_80190A28 = D_8017EDEC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80190A58 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80190A50 & 2) != 0) { - D_80193124[0] = 0x140; - D_80193124[3] = 0x80; - if (p[0x37] == 4) { - D_80193124[0] = 0x140; - D_80193124[3] = 0; - } - if (p[0x37] == 0) { - D_80193124[0] = 0x140; - D_80193124[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80190A28)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80190A28; -extern s16 *D_80190A2C; -extern s32 D_80190A3C; -extern s32 D_80190A5C; -extern s32 D_80190A60; -extern s32 D_80190A64; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80190A2C != 0) { - D_80190A3C = 0; - p = (int *)(param_1 * 12 + (int)D_80190A28); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_80190A5C != x) { - flag = 1; - if (D_80190A5C < x) { - if (x - D_80190A5C < 5) { - D_80190A5C = x; - } else { - D_80190A5C = D_80190A5C + 4; - } - } else { - if (D_80190A5C - x < 5) { - D_80190A5C = x; - } else { - D_80190A5C = D_80190A5C - 4; - } - } - } - if (D_80190A60 != y) { - flag = 1; - if (D_80190A60 < y) { - if (y - D_80190A60 < 5) { - D_80190A60 = y; - } else { - D_80190A60 = D_80190A60 + 4; - } - } else { - if (D_80190A60 - y < 5) { - D_80190A60 = y; - } else { - D_80190A60 = D_80190A60 - 4; - } - } - } - if (D_80190A64 != z) { - flag = 1; - if (D_80190A64 < z) { - if (z - D_80190A64 < 5) { - D_80190A64 = z; - } else { - D_80190A64 = D_80190A64 + 4; - } - } else { - if (D_80190A64 - z < 5) { - D_80190A64 = z; - } else { - D_80190A64 = D_80190A64 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_80190A3C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017EFA4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80190A2C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80190A5C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80190A60); - uVar5 = (*(int*)&D_80190A64); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017EFA4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80190A44; - -s32 func_8013E054(void) { - return D_80190A44; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F9A0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F978; -extern s16 D_8017F97A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F9A0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F978 = 2; - D_8017F97A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F97A = 0; - D_8017F978 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80190A78; - extern void * D_80190A7C; - extern unsigned char D_8017F618; - extern unsigned char D_8017F630; - extern unsigned char D_8017F6A4; - extern unsigned char D_8017F6AC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80190A78 = &D_8017F618; - D_80190A7C = &D_8017F6A4; - } else { - D_80190A78 = &D_8017F630; - D_80190A7C = &D_8017F6AC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F9A0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F9A0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F9A0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F97C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F97C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F97C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F978; -extern s16 D_8017F97A; -extern unsigned char D_8017F97C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F97A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F978` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F97A; - if (*r < 3) { - *r = *r + 1; - } - D_8017F978 = (u16)D_8017F978 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F97C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F97C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F97C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_012/ov_SC04_012_jr_801380E0.c b/src/ov_SC04_012/ov_SC04_012_jr_801380E0.c new file mode 100644 index 000000000..4397ec08d --- /dev/null +++ b/src/ov_SC04_012/ov_SC04_012_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018F7CC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E898[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80190934; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801931D0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018F7CC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E5D4)(); +extern s16 (*D_8017E5D8)(); +extern M2C_UNK (*D_8017E5E0)(); +extern s32 (*D_8017E5E4)(); +extern s32 D_80190930; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018F7D0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E92C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181E10; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E944; +extern M2C_UNK D_8017E94C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E954; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E970[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E97C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E990[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E9E0[]; +extern s16 D_8017EA10[]; +extern s16 D_8017EA70[]; +extern s16 D_8017EA78[]; +extern s16 D_8017EA98[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EAD0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017EB28[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017EB70[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017EB78[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017EB80[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017EB88[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017EB30; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017EB50; +extern void func_801321B0(int param_1); +extern int D_8017EB60; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801909A0; +extern s32 D_801909A4[]; +extern int D_801909A8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017EB94; +extern u8 D_8017EB90; +extern s16 *D_8017EB98; +extern u8 D_8017EB9C; +extern int D_801909A0; +extern u16 D_801909B0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017EB98; /* holds a pointer value (*(u16**)&D_8017EB98) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017EBAC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017EC00; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017EC04[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017EC04[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017EC48; +extern u8 D_8017EC8C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017EC48; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017EC8C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017ECD0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017ED0C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017ED0C; + if (((s16)a1) < 0xC00) { + tbl = D_8017ECD0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017ED48, D_8017ED4A, D_8017ED4C, D_8017ED4E, D_8017ED50, D_8017ED52; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017ED4A < ang)) goto outer_else; + if (!(ang < D_8017ED50)) goto inner_else; + if (ang < D_8017ED4C) { *(s16 *)L = D_8017ED4C; goto done; } + if (D_8017ED4E < ang) { *(s16 *)L = D_8017ED4E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017ED48) { *(s16 *)L = D_8017ED48; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017ED52 < ang) { *(s16 *)L = D_8017ED52; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80190A18; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80190A18, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80190A18; +extern s8 D_80190A1C; +extern s8 D_80190A1D; + +void func_8013C9C4(void * arg0) +{ + D_80190A18 = arg0; + D_80190A1C = 0; + D_80190A1D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80190A18; +extern s8 D_80190A1C; +extern s8 D_80190A1D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80190A18; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80190A1D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80190A1C)) * 2) + D_80190A18); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80190A1D = (unsigned char) p[1]; + D_80190A1C = D_80190A1C + 1; + if (D_80190A1D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80190A1C = 0; + *base = 0; + } + } + else + { + D_80190A1D = c - 1; + } + } + return; +} + + + +extern s32 D_80190A3C; +extern s32 D_80190A30; +extern s32 D_80190A34; +extern s32 D_80190A40; + +void func_8013CABC(void) { + D_80190A3C = 1; + D_80190A30 = 1; + D_80190A34 = 0; + D_80190A40 = 1; +} + + + +extern s32 D_80190A30; +extern s32 D_80190A34; +extern s32 D_80190A38; +extern s32 D_80190A3C; +extern s32 D_80190A40; + +void func_8013CAE8(void) { + D_80190A30 = 1; + D_80190A3C = 0; + D_80190A34 = 0; + D_80190A38 = -1; + D_80190A40 = 0; +} + + + +extern s32 D_80190A3C; +extern s32 D_80190A40; +extern s32 D_80190A68; +extern s32 D_80190A6C; + +void func_8013CB20(void) +{ + D_80190A68 = D_80190A40; + D_80190A6C = D_80190A3C; + D_80190A40 = 1; + D_80190A3C = 0; +} + + + +extern s32 D_80190A68; +extern s32 D_80190A6C; +extern s32 D_80190A40; +extern s32 D_80190A3C; + +void func_8013CB5C(void) { + D_80190A40 = D_80190A68; + D_80190A3C = D_80190A6C; +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801930E8; + extern u8 D_801930E9; + extern u8 D_801930EA; + extern u8 D_801930EB; + extern u8 D_801930EC; + extern u8 D_801930ED; + extern u8 D_801930EE; + extern u8 D_801930EF; + extern u8 D_801930F0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801930E8; t1 = D_801930E9; t2 = D_801930EA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801930EB; t1 = D_801930EC; t2 = D_801930ED; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801930EE; t1 = D_801930EF; t2 = D_801930F0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80190A48; +extern s32 D_80190A30; +extern s32 D_80190A4C; +extern s32 D_80190A3C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80190A48 != 0) { + if (D_80190A48 != 2) { + if (((D_80190A48 < 3) && (D_80190A48 == 1)) && + (D_80190A4C = D_80190A4C + 1, 0x23a < D_80190A4C)) { + D_80190A30 = D_80190A48; + D_80190A48 = 2; + } + } else { + D_80190A30 = D_80190A30 + -1; + if (D_80190A30 == 0) { + D_80190A30 = D_80190A48; + ((void (*)(s32))func_8013D9B0)(2); + if (D_80190A3C == 0) { + D_80190A48 = D_80190A48 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_80190A3C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_80190A3C; +} + + + +extern s32 D_80190A48; + +void func_8013D164(void) { + D_80190A48 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801931CA; +extern u8 D_8019323E; +extern u8 D_801930F2; +extern u8 D_801931AC; +extern u8 D_801930D0; +extern u8 D_801930F1; +extern s32 D_801931B0; + +void func_8013D330(void) { + if ((D_801931CA & 0xff) != D_8019323E) { + D_801931CA = ((D_801931CA & 0xff) < D_8019323E) ? (D_801931CA + 1) : (D_801931CA - 1); + } + if ((D_801930F2 & 0xff) != D_801931AC) { + D_801930F2 = ((D_801930F2 & 0xff) < D_801931AC) ? (D_801930F2 + 1) : (D_801930F2 - 1); + } + if ((D_801930D0 & 0xff) != D_801930F1) { + D_801930D0 = ((D_801930D0 & 0xff) < D_801930F1) ? (D_801930D0 + 1) : (D_801930D0 - 1); + } + D_801931B0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80190A20; +extern void *D_80190A24; +extern void *D_80190A28; +extern s32 D_80190A50; +extern s32 D_80190A54; +extern s32 D_80190A58; +extern s32 D_80193124[]; + +extern u8 D_8017EE40[]; +extern u8 D_8017EEE8[]; +extern u8 D_8017ED98[]; +extern u8 D_8017EE94[]; +extern u8 D_8017EF14[]; +extern u8 D_8017EDEC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80190A50 = param_2; + D_80190A54 = (param_2 >> 2) & 3; + D_80190A58 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80190A20 = D_8017EE40; + D_80190A24 = D_8017EEE8; + D_80190A28 = D_8017ED98; + } else { + D_80190A20 = D_8017EE94; + D_80190A24 = D_8017EF14; + D_80190A28 = D_8017EDEC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80190A58 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80190A50 & 2) != 0) { + D_80193124[0] = 0x140; + D_80193124[3] = 0x80; + if (p[0x37] == 4) { + D_80193124[0] = 0x140; + D_80193124[3] = 0; + } + if (p[0x37] == 0) { + D_80193124[0] = 0x140; + D_80193124[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80190A28)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80190A28; +extern s16 *D_80190A2C; +extern s32 D_80190A3C; +extern s32 D_80190A5C; +extern s32 D_80190A60; +extern s32 D_80190A64; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80190A2C != 0) { + D_80190A3C = 0; + p = (int *)(param_1 * 12 + (int)D_80190A28); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_80190A5C != x) { + flag = 1; + if (D_80190A5C < x) { + if (x - D_80190A5C < 5) { + D_80190A5C = x; + } else { + D_80190A5C = D_80190A5C + 4; + } + } else { + if (D_80190A5C - x < 5) { + D_80190A5C = x; + } else { + D_80190A5C = D_80190A5C - 4; + } + } + } + if (D_80190A60 != y) { + flag = 1; + if (D_80190A60 < y) { + if (y - D_80190A60 < 5) { + D_80190A60 = y; + } else { + D_80190A60 = D_80190A60 + 4; + } + } else { + if (D_80190A60 - y < 5) { + D_80190A60 = y; + } else { + D_80190A60 = D_80190A60 - 4; + } + } + } + if (D_80190A64 != z) { + flag = 1; + if (D_80190A64 < z) { + if (z - D_80190A64 < 5) { + D_80190A64 = z; + } else { + D_80190A64 = D_80190A64 + 4; + } + } else { + if (D_80190A64 - z < 5) { + D_80190A64 = z; + } else { + D_80190A64 = D_80190A64 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_80190A3C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017EFA4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80190A2C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_80190A5C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80190A60); + uVar5 = (*(int*)&D_80190A64); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017EFA4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80190A44; + +s32 func_8013E054(void) { + return D_80190A44; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F9A0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F978; +extern s16 D_8017F97A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F9A0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F978 = 2; + D_8017F97A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F97A = 0; + D_8017F978 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80190A78; + extern void * D_80190A7C; + extern unsigned char D_8017F618; + extern unsigned char D_8017F630; + extern unsigned char D_8017F6A4; + extern unsigned char D_8017F6AC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80190A78 = &D_8017F618; + D_80190A7C = &D_8017F6A4; + } else { + D_80190A78 = &D_8017F630; + D_80190A7C = &D_8017F6AC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F9A0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F9A0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F9A0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F97C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F97C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F97C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F978; +extern s16 D_8017F97A; +extern unsigned char D_8017F97C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F97A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F978` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F97A; + if (*r < 3) { + *r = *r + 1; + } + D_8017F978 = (u16)D_8017F978 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F97C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F97C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F97C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_015/ov_SC04_015_jr_8012ACE0.c b/src/ov_SC04_015/ov_SC04_015_jr_8012ACE0.c index 9c3086aaf..1cf763f64 100644 --- a/src/ov_SC04_015/ov_SC04_015_jr_8012ACE0.c +++ b/src/ov_SC04_015/ov_SC04_015_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80184B3C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80184B3C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80184B80; -extern u8 D_80184BC4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80184B80; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80184BC4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80184C08[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80184C44[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80184C44; - if (((s16)a1) < 0xC00) { - tbl = D_80184C08; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80184C80, D_80184C82, D_80184C84, D_80184C86, D_80184C88, D_80184C8A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80184C82 < ang)) goto outer_else; - if (!(ang < D_80184C88)) goto inner_else; - if (ang < D_80184C84) { *(s16 *)L = D_80184C84; goto done; } - if (D_80184C86 < ang) { *(s16 *)L = D_80184C86; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80184C80) { *(s16 *)L = D_80184C80; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80184C8A < ang) { *(s16 *)L = D_80184C8A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C7700; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C7700, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C7700; -extern s8 D_801C7704; -extern s8 D_801C7705; - -void func_8013C9C4(void * arg0) -{ - D_801C7700 = arg0; - D_801C7704 = 0; - D_801C7705 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C7700; -extern s8 D_801C7704; -extern s8 D_801C7705; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C7700; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C7705; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C7704)) * 2) + D_801C7700); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C7705 = (unsigned char) p[1]; - D_801C7704 = D_801C7704 + 1; - if (D_801C7705 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C7704 = 0; - *base = 0; - } - } - else - { - D_801C7705 = c - 1; - } - } - return; -} - - - -extern s32 D_801C7724; -extern s32 D_801C7718; -extern s32 D_801C771C; -extern s32 D_801C7728; - -void func_8013CABC(void) { - D_801C7724 = 1; - D_801C7718 = 1; - D_801C771C = 0; - D_801C7728 = 1; -} - - - -extern s32 D_801C7718; -extern s32 D_801C771C; -extern s32 D_801C7720; -extern s32 D_801C7724; -extern s32 D_801C7728; - -void func_8013CAE8(void) { - D_801C7718 = 1; - D_801C7724 = 0; - D_801C771C = 0; - D_801C7720 = -1; - D_801C7728 = 0; -} - - - -extern s32 D_801C7724; -extern s32 D_801C7728; -extern s32 D_801C7750; -extern s32 D_801C7754; - -void func_8013CB20(void) -{ - D_801C7750 = D_801C7728; - D_801C7754 = D_801C7724; - D_801C7728 = 1; - D_801C7724 = 0; -} - - - -extern s32 D_801C7750; -extern s32 D_801C7754; -extern s32 D_801C7728; -extern s32 D_801C7724; - -void func_8013CB5C(void) { - D_801C7728 = D_801C7750; - D_801C7724 = D_801C7754; -} - - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C9260; - extern u8 D_801C9261; - extern u8 D_801C9262; - extern u8 D_801C9263; - extern u8 D_801C9264; - extern u8 D_801C9265; - extern u8 D_801C9266; - extern u8 D_801C9267; - extern u8 D_801C9268; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C9260; t1 = D_801C9261; t2 = D_801C9262; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C9263; t1 = D_801C9264; t2 = D_801C9265; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C9266; t1 = D_801C9267; t2 = D_801C9268; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C7730; -extern s32 D_801C7718; -extern s32 D_801C7734; -extern s32 D_801C7724; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C7730 != 0) { - if (D_801C7730 != 2) { - if (((D_801C7730 < 3) && (D_801C7730 == 1)) && - (D_801C7734 = D_801C7734 + 1, 0x23a < D_801C7734)) { - D_801C7718 = D_801C7730; - D_801C7730 = 2; - } - } else { - D_801C7718 = D_801C7718 + -1; - if (D_801C7718 == 0) { - D_801C7718 = D_801C7730; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C7724 == 0) { - D_801C7730 = D_801C7730 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C7724; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C7724; -} - - - -extern s32 D_801C7730; - -void func_8013D164(void) { - D_801C7730 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C936A; -extern u8 D_801C93DE; -extern u8 D_801C926A; -extern u8 D_801C9334; -extern u8 D_801C9240; -extern u8 D_801C9269; -extern s32 D_801C9338; - -void func_8013D330(void) { - if ((D_801C936A & 0xff) != D_801C93DE) { - D_801C936A = ((D_801C936A & 0xff) < D_801C93DE) ? (D_801C936A + 1) : (D_801C936A - 1); - } - if ((D_801C926A & 0xff) != D_801C9334) { - D_801C926A = ((D_801C926A & 0xff) < D_801C9334) ? (D_801C926A + 1) : (D_801C926A - 1); - } - if ((D_801C9240 & 0xff) != D_801C9269) { - D_801C9240 = ((D_801C9240 & 0xff) < D_801C9269) ? (D_801C9240 + 1) : (D_801C9240 - 1); - } - D_801C9338 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C7708; -extern void *D_801C770C; -extern void *D_801C7710; -extern s32 D_801C7738; -extern s32 D_801C773C; -extern s32 D_801C7740; -extern s32 D_801C92AC[]; - -extern u8 D_80184D78[]; -extern u8 D_80184E20[]; -extern u8 D_80184CD0[]; -extern u8 D_80184DCC[]; -extern u8 D_80184E4C[]; -extern u8 D_80184D24[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C7738 = param_2; - D_801C773C = (param_2 >> 2) & 3; - D_801C7740 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C7708 = D_80184D78; - D_801C770C = D_80184E20; - D_801C7710 = D_80184CD0; - } else { - D_801C7708 = D_80184DCC; - D_801C770C = D_80184E4C; - D_801C7710 = D_80184D24; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C7740 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C7738 & 2) != 0) { - D_801C92AC[0] = 0x140; - D_801C92AC[3] = 0x80; - if (p[0x37] == 4) { - D_801C92AC[0] = 0x140; - D_801C92AC[3] = 0; - } - if (p[0x37] == 0) { - D_801C92AC[0] = 0x140; - D_801C92AC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C7710)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C7710; -extern s16 *D_801C7714; -extern s32 D_801C7724; -extern s32 D_801C7744; -extern s32 D_801C7748; -extern s32 D_801C774C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C7714 != 0) { - D_801C7724 = 0; - p = (int *)(param_1 * 12 + (int)D_801C7710); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C7744 != x) { - flag = 1; - if (D_801C7744 < x) { - if (x - D_801C7744 < 5) { - D_801C7744 = x; - } else { - D_801C7744 = D_801C7744 + 4; - } - } else { - if (D_801C7744 - x < 5) { - D_801C7744 = x; - } else { - D_801C7744 = D_801C7744 - 4; - } - } - } - if (D_801C7748 != y) { - flag = 1; - if (D_801C7748 < y) { - if (y - D_801C7748 < 5) { - D_801C7748 = y; - } else { - D_801C7748 = D_801C7748 + 4; - } - } else { - if (D_801C7748 - y < 5) { - D_801C7748 = y; - } else { - D_801C7748 = D_801C7748 - 4; - } - } - } - if (D_801C774C != z) { - flag = 1; - if (D_801C774C < z) { - if (z - D_801C774C < 5) { - D_801C774C = z; - } else { - D_801C774C = D_801C774C + 4; - } - } else { - if (D_801C774C - z < 5) { - D_801C774C = z; - } else { - D_801C774C = D_801C774C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C7724 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80184EDC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C7714); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C7744); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C7748); - uVar5 = (*(int*)&D_801C774C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80184EDC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C772C; - -s32 func_8013E054(void) { - return D_801C772C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801858D8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801858B0; -extern s16 D_801858B2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801858D8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801858B0 = 2; - D_801858B2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801858B2 = 0; - D_801858B0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C7760; - extern void * D_801C7764; - extern unsigned char D_80185550; - extern unsigned char D_80185568; - extern unsigned char D_801855DC; - extern unsigned char D_801855E4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C7760 = &D_80185550; - D_801C7764 = &D_801855DC; - } else { - D_801C7760 = &D_80185568; - D_801C7764 = &D_801855E4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801858D8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801858D8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801858D8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801858B4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801858B4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801858B4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801858B0; -extern s16 D_801858B2; -extern unsigned char D_801858B4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801858B2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801858B0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801858B2; - if (*r < 3) { - *r = *r + 1; - } - D_801858B0 = (u16)D_801858B0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801858B4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801858B4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801858B4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c b/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c new file mode 100644 index 000000000..ee890428b --- /dev/null +++ b/src/ov_SC04_015/ov_SC04_015_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C6464; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801847D0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C761C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C9370; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C6464; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184504)(); +extern s16 (*D_80184508)(); +extern M2C_UNK (*D_80184510)(); +extern s32 (*D_80184514)(); +extern s32 D_801C7618; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C6468; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80184864; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80187D48; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018487C; +extern M2C_UNK D_80184884; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018488C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801848A8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801848B4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801848C8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80184918[]; +extern s16 D_80184948[]; +extern s16 D_801849A8[]; +extern s16 D_801849B0[]; +extern s16 D_801849D0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80184A08[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80184A60[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80184AA8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80184AB0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80184AB8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80184AC0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80184A68; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80184A88; +extern void func_801321B0(int param_1); +extern int D_80184A98; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C7688; +extern s32 D_801C768C[]; +extern int D_801C7690; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80184ACC; +extern u8 D_80184AC8; +extern s16 *D_80184AD0; +extern u8 D_80184AD4; +extern int D_801C7688; +extern u16 D_801C7698; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80184AD0; /* holds a pointer value (*(u16**)&D_80184AD0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80184AE4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80184B38; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80184B3C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80184B3C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80184B80; +extern u8 D_80184BC4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80184B80; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80184BC4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80184C08[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80184C44[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80184C44; + if (((s16)a1) < 0xC00) { + tbl = D_80184C08; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80184C80, D_80184C82, D_80184C84, D_80184C86, D_80184C88, D_80184C8A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80184C82 < ang)) goto outer_else; + if (!(ang < D_80184C88)) goto inner_else; + if (ang < D_80184C84) { *(s16 *)L = D_80184C84; goto done; } + if (D_80184C86 < ang) { *(s16 *)L = D_80184C86; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80184C80) { *(s16 *)L = D_80184C80; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80184C8A < ang) { *(s16 *)L = D_80184C8A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C7700; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C7700, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C7700; +extern s8 D_801C7704; +extern s8 D_801C7705; + +void func_8013C9C4(void * arg0) +{ + D_801C7700 = arg0; + D_801C7704 = 0; + D_801C7705 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C7700; +extern s8 D_801C7704; +extern s8 D_801C7705; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C7700; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C7705; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C7704)) * 2) + D_801C7700); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C7705 = (unsigned char) p[1]; + D_801C7704 = D_801C7704 + 1; + if (D_801C7705 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C7704 = 0; + *base = 0; + } + } + else + { + D_801C7705 = c - 1; + } + } + return; +} + + + +extern s32 D_801C7724; +extern s32 D_801C7718; +extern s32 D_801C771C; +extern s32 D_801C7728; + +void func_8013CABC(void) { + D_801C7724 = 1; + D_801C7718 = 1; + D_801C771C = 0; + D_801C7728 = 1; +} + + + +extern s32 D_801C7718; +extern s32 D_801C771C; +extern s32 D_801C7720; +extern s32 D_801C7724; +extern s32 D_801C7728; + +void func_8013CAE8(void) { + D_801C7718 = 1; + D_801C7724 = 0; + D_801C771C = 0; + D_801C7720 = -1; + D_801C7728 = 0; +} + + + +extern s32 D_801C7724; +extern s32 D_801C7728; +extern s32 D_801C7750; +extern s32 D_801C7754; + +void func_8013CB20(void) +{ + D_801C7750 = D_801C7728; + D_801C7754 = D_801C7724; + D_801C7728 = 1; + D_801C7724 = 0; +} + + + +extern s32 D_801C7750; +extern s32 D_801C7754; +extern s32 D_801C7728; +extern s32 D_801C7724; + +void func_8013CB5C(void) { + D_801C7728 = D_801C7750; + D_801C7724 = D_801C7754; +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C9260; + extern u8 D_801C9261; + extern u8 D_801C9262; + extern u8 D_801C9263; + extern u8 D_801C9264; + extern u8 D_801C9265; + extern u8 D_801C9266; + extern u8 D_801C9267; + extern u8 D_801C9268; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C9260; t1 = D_801C9261; t2 = D_801C9262; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C9263; t1 = D_801C9264; t2 = D_801C9265; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C9266; t1 = D_801C9267; t2 = D_801C9268; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C7730; +extern s32 D_801C7718; +extern s32 D_801C7734; +extern s32 D_801C7724; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C7730 != 0) { + if (D_801C7730 != 2) { + if (((D_801C7730 < 3) && (D_801C7730 == 1)) && + (D_801C7734 = D_801C7734 + 1, 0x23a < D_801C7734)) { + D_801C7718 = D_801C7730; + D_801C7730 = 2; + } + } else { + D_801C7718 = D_801C7718 + -1; + if (D_801C7718 == 0) { + D_801C7718 = D_801C7730; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C7724 == 0) { + D_801C7730 = D_801C7730 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C7724; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C7724; +} + + + +extern s32 D_801C7730; + +void func_8013D164(void) { + D_801C7730 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C936A; +extern u8 D_801C93DE; +extern u8 D_801C926A; +extern u8 D_801C9334; +extern u8 D_801C9240; +extern u8 D_801C9269; +extern s32 D_801C9338; + +void func_8013D330(void) { + if ((D_801C936A & 0xff) != D_801C93DE) { + D_801C936A = ((D_801C936A & 0xff) < D_801C93DE) ? (D_801C936A + 1) : (D_801C936A - 1); + } + if ((D_801C926A & 0xff) != D_801C9334) { + D_801C926A = ((D_801C926A & 0xff) < D_801C9334) ? (D_801C926A + 1) : (D_801C926A - 1); + } + if ((D_801C9240 & 0xff) != D_801C9269) { + D_801C9240 = ((D_801C9240 & 0xff) < D_801C9269) ? (D_801C9240 + 1) : (D_801C9240 - 1); + } + D_801C9338 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C7708; +extern void *D_801C770C; +extern void *D_801C7710; +extern s32 D_801C7738; +extern s32 D_801C773C; +extern s32 D_801C7740; +extern s32 D_801C92AC[]; + +extern u8 D_80184D78[]; +extern u8 D_80184E20[]; +extern u8 D_80184CD0[]; +extern u8 D_80184DCC[]; +extern u8 D_80184E4C[]; +extern u8 D_80184D24[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C7738 = param_2; + D_801C773C = (param_2 >> 2) & 3; + D_801C7740 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C7708 = D_80184D78; + D_801C770C = D_80184E20; + D_801C7710 = D_80184CD0; + } else { + D_801C7708 = D_80184DCC; + D_801C770C = D_80184E4C; + D_801C7710 = D_80184D24; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C7740 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C7738 & 2) != 0) { + D_801C92AC[0] = 0x140; + D_801C92AC[3] = 0x80; + if (p[0x37] == 4) { + D_801C92AC[0] = 0x140; + D_801C92AC[3] = 0; + } + if (p[0x37] == 0) { + D_801C92AC[0] = 0x140; + D_801C92AC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C7710)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C7710; +extern s16 *D_801C7714; +extern s32 D_801C7724; +extern s32 D_801C7744; +extern s32 D_801C7748; +extern s32 D_801C774C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C7714 != 0) { + D_801C7724 = 0; + p = (int *)(param_1 * 12 + (int)D_801C7710); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C7744 != x) { + flag = 1; + if (D_801C7744 < x) { + if (x - D_801C7744 < 5) { + D_801C7744 = x; + } else { + D_801C7744 = D_801C7744 + 4; + } + } else { + if (D_801C7744 - x < 5) { + D_801C7744 = x; + } else { + D_801C7744 = D_801C7744 - 4; + } + } + } + if (D_801C7748 != y) { + flag = 1; + if (D_801C7748 < y) { + if (y - D_801C7748 < 5) { + D_801C7748 = y; + } else { + D_801C7748 = D_801C7748 + 4; + } + } else { + if (D_801C7748 - y < 5) { + D_801C7748 = y; + } else { + D_801C7748 = D_801C7748 - 4; + } + } + } + if (D_801C774C != z) { + flag = 1; + if (D_801C774C < z) { + if (z - D_801C774C < 5) { + D_801C774C = z; + } else { + D_801C774C = D_801C774C + 4; + } + } else { + if (D_801C774C - z < 5) { + D_801C774C = z; + } else { + D_801C774C = D_801C774C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C7724 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80184EDC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C7714); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C7744); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C7748); + uVar5 = (*(int*)&D_801C774C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80184EDC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C772C; + +s32 func_8013E054(void) { + return D_801C772C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801858D8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801858B0; +extern s16 D_801858B2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801858D8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801858B0 = 2; + D_801858B2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801858B2 = 0; + D_801858B0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C7760; + extern void * D_801C7764; + extern unsigned char D_80185550; + extern unsigned char D_80185568; + extern unsigned char D_801855DC; + extern unsigned char D_801855E4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C7760 = &D_80185550; + D_801C7764 = &D_801855DC; + } else { + D_801C7760 = &D_80185568; + D_801C7764 = &D_801855E4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801858D8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801858D8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801858D8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801858B4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801858B4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801858B4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801858B0; +extern s16 D_801858B2; +extern unsigned char D_801858B4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801858B2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801858B0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801858B2; + if (*r < 3) { + *r = *r + 1; + } + D_801858B0 = (u16)D_801858B0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801858B4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801858B4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801858B4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_015/nonmatchings/ov_SC04_015_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_016/ov_SC04_016_jr_8012ACE0.c b/src/ov_SC04_016/ov_SC04_016_jr_8012ACE0.c index b9880521d..30c4674a1 100644 --- a/src/ov_SC04_016/ov_SC04_016_jr_8012ACE0.c +++ b/src/ov_SC04_016/ov_SC04_016_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80180600[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80180600[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180644; -extern u8 D_80180688; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180644; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80180688 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801806CC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80180708[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80180708; - if (((s16)a1) < 0xC00) { - tbl = D_801806CC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180744, D_80180746, D_80180748, D_8018074A, D_8018074C, D_8018074E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80180746 < ang)) goto outer_else; - if (!(ang < D_8018074C)) goto inner_else; - if (ang < D_80180748) { *(s16 *)L = D_80180748; goto done; } - if (D_8018074A < ang) { *(s16 *)L = D_8018074A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180744) { *(s16 *)L = D_80180744; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018074E < ang) { *(s16 *)L = D_8018074E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A58A8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A58A8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A58A8; -extern s8 D_801A58AC; -extern s8 D_801A58AD; - -void func_8013C9C4(void * arg0) -{ - D_801A58A8 = arg0; - D_801A58AC = 0; - D_801A58AD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A58A8; -extern s8 D_801A58AC; -extern s8 D_801A58AD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A58A8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A58AD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A58AC)) * 2) + D_801A58A8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A58AD = (unsigned char) p[1]; - D_801A58AC = D_801A58AC + 1; - if (D_801A58AD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A58AC = 0; - *base = 0; - } - } - else - { - D_801A58AD = c - 1; - } - } - return; -} - - - -extern s32 D_801A58CC; -extern s32 D_801A58C0; -extern s32 D_801A58C4; -extern s32 D_801A58D0; - -void func_8013CABC(void) { - D_801A58CC = 1; - D_801A58C0 = 1; - D_801A58C4 = 0; - D_801A58D0 = 1; -} - - - -extern s32 D_801A58C0; -extern s32 D_801A58C4; -extern s32 D_801A58C8; -extern s32 D_801A58CC; -extern s32 D_801A58D0; - -void func_8013CAE8(void) { - D_801A58C0 = 1; - D_801A58CC = 0; - D_801A58C4 = 0; - D_801A58C8 = -1; - D_801A58D0 = 0; -} - - - -extern s32 D_801A58CC; -extern s32 D_801A58D0; -extern s32 D_801A58F8; -extern s32 D_801A58FC; - -void func_8013CB20(void) -{ - D_801A58F8 = D_801A58D0; - D_801A58FC = D_801A58CC; - D_801A58D0 = 1; - D_801A58CC = 0; -} - - - -extern s32 D_801A58F8; -extern s32 D_801A58FC; -extern s32 D_801A58D0; -extern s32 D_801A58CC; - -void func_8013CB5C(void) { - D_801A58D0 = D_801A58F8; - D_801A58CC = D_801A58FC; -} - - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AC188; - extern u8 D_801AC189; - extern u8 D_801AC18A; - extern u8 D_801AC18B; - extern u8 D_801AC18C; - extern u8 D_801AC18D; - extern u8 D_801AC18E; - extern u8 D_801AC18F; - extern u8 D_801AC190; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AC188; t1 = D_801AC189; t2 = D_801AC18A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AC18B; t1 = D_801AC18C; t2 = D_801AC18D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AC18E; t1 = D_801AC18F; t2 = D_801AC190; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A58D8; -extern s32 D_801A58C0; -extern s32 D_801A58DC; -extern s32 D_801A58CC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A58D8 != 0) { - if (D_801A58D8 != 2) { - if (((D_801A58D8 < 3) && (D_801A58D8 == 1)) && - (D_801A58DC = D_801A58DC + 1, 0x23a < D_801A58DC)) { - D_801A58C0 = D_801A58D8; - D_801A58D8 = 2; - } - } else { - D_801A58C0 = D_801A58C0 + -1; - if (D_801A58C0 == 0) { - D_801A58C0 = D_801A58D8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A58CC == 0) { - D_801A58D8 = D_801A58D8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A58CC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A58CC; -} - - - -extern s32 D_801A58D8; - -void func_8013D164(void) { - D_801A58D8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AC26A; -extern u8 D_801AC2DE; -extern u8 D_801AC192; -extern u8 D_801AC24C; -extern u8 D_801AC170; -extern u8 D_801AC191; -extern s32 D_801AC250; - -void func_8013D330(void) { - if ((D_801AC26A & 0xff) != D_801AC2DE) { - D_801AC26A = ((D_801AC26A & 0xff) < D_801AC2DE) ? (D_801AC26A + 1) : (D_801AC26A - 1); - } - if ((D_801AC192 & 0xff) != D_801AC24C) { - D_801AC192 = ((D_801AC192 & 0xff) < D_801AC24C) ? (D_801AC192 + 1) : (D_801AC192 - 1); - } - if ((D_801AC170 & 0xff) != D_801AC191) { - D_801AC170 = ((D_801AC170 & 0xff) < D_801AC191) ? (D_801AC170 + 1) : (D_801AC170 - 1); - } - D_801AC250 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A58B0; -extern void *D_801A58B4; -extern void *D_801A58B8; -extern s32 D_801A58E0; -extern s32 D_801A58E4; -extern s32 D_801A58E8; -extern s32 D_801AC1C4[]; - -extern u8 D_8018083C[]; -extern u8 D_801808E4[]; -extern u8 D_80180794[]; -extern u8 D_80180890[]; -extern u8 D_80180910[]; -extern u8 D_801807E8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A58E0 = param_2; - D_801A58E4 = (param_2 >> 2) & 3; - D_801A58E8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A58B0 = D_8018083C; - D_801A58B4 = D_801808E4; - D_801A58B8 = D_80180794; - } else { - D_801A58B0 = D_80180890; - D_801A58B4 = D_80180910; - D_801A58B8 = D_801807E8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A58E8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A58E0 & 2) != 0) { - D_801AC1C4[0] = 0x140; - D_801AC1C4[3] = 0x80; - if (p[0x37] == 4) { - D_801AC1C4[0] = 0x140; - D_801AC1C4[3] = 0; - } - if (p[0x37] == 0) { - D_801AC1C4[0] = 0x140; - D_801AC1C4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A58B8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A58B8; -extern s16 *D_801A58BC; -extern s32 D_801A58CC; -extern s32 D_801A58EC; -extern s32 D_801A58F0; -extern s32 D_801A58F4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A58BC != 0) { - D_801A58CC = 0; - p = (int *)(param_1 * 12 + (int)D_801A58B8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A58EC != x) { - flag = 1; - if (D_801A58EC < x) { - if (x - D_801A58EC < 5) { - D_801A58EC = x; - } else { - D_801A58EC = D_801A58EC + 4; - } - } else { - if (D_801A58EC - x < 5) { - D_801A58EC = x; - } else { - D_801A58EC = D_801A58EC - 4; - } - } - } - if (D_801A58F0 != y) { - flag = 1; - if (D_801A58F0 < y) { - if (y - D_801A58F0 < 5) { - D_801A58F0 = y; - } else { - D_801A58F0 = D_801A58F0 + 4; - } - } else { - if (D_801A58F0 - y < 5) { - D_801A58F0 = y; - } else { - D_801A58F0 = D_801A58F0 - 4; - } - } - } - if (D_801A58F4 != z) { - flag = 1; - if (D_801A58F4 < z) { - if (z - D_801A58F4 < 5) { - D_801A58F4 = z; - } else { - D_801A58F4 = D_801A58F4 + 4; - } - } else { - if (D_801A58F4 - z < 5) { - D_801A58F4 = z; - } else { - D_801A58F4 = D_801A58F4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A58CC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801809A0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A58BC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A58EC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A58F0); - uVar5 = (*(int*)&D_801A58F4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801809A0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A58D4; - -s32 func_8013E054(void) { - return D_801A58D4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018139C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80181374; -extern s16 D_80181376; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018139C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80181374 = 2; - D_80181376 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80181376 = 0; - D_80181374 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A5908; - extern void * D_801A590C; - extern unsigned char D_80181014; - extern unsigned char D_8018102C; - extern unsigned char D_801810A0; - extern unsigned char D_801810A8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A5908 = &D_80181014; - D_801A590C = &D_801810A0; - } else { - D_801A5908 = &D_8018102C; - D_801A590C = &D_801810A8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018139C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018139C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018139C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80181378; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181378)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181378)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80181374; -extern s16 D_80181376; -extern unsigned char D_80181378; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181376` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80181374` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80181376; - if (*r < 3) { - *r = *r + 1; - } - D_80181374 = (u16)D_80181374 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181378); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80181378; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181378); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_016/ov_SC04_016_jr_801380E0.c b/src/ov_SC04_016/ov_SC04_016_jr_801380E0.c new file mode 100644 index 000000000..e06cd035c --- /dev/null +++ b/src/ov_SC04_016/ov_SC04_016_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A461C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80180294[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A57C4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AC270; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A461C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017FFD0)(); +extern s16 (*D_8017FFD4)(); +extern M2C_UNK (*D_8017FFDC)(); +extern s32 (*D_8017FFE0)(); +extern s32 D_801A57C0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A4620; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80180328; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018380C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80180340; +extern M2C_UNK D_80180348; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80180350; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018036C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80180378[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018038C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801803DC[]; +extern s16 D_8018040C[]; +extern s16 D_8018046C[]; +extern s16 D_80180474[]; +extern s16 D_80180494[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801804CC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180524[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018056C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80180574[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018057C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80180584[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018052C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018054C; +extern void func_801321B0(int param_1); +extern int D_8018055C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A5830; +extern s32 D_801A5834[]; +extern int D_801A5838; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80180590; +extern u8 D_8018058C; +extern s16 *D_80180594; +extern u8 D_80180598; +extern int D_801A5830; +extern u16 D_801A5840; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80180594; /* holds a pointer value (*(u16**)&D_80180594) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801805A8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801805FC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80180600[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80180600[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180644; +extern u8 D_80180688; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180644; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80180688 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801806CC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80180708[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80180708; + if (((s16)a1) < 0xC00) { + tbl = D_801806CC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180744, D_80180746, D_80180748, D_8018074A, D_8018074C, D_8018074E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180746 < ang)) goto outer_else; + if (!(ang < D_8018074C)) goto inner_else; + if (ang < D_80180748) { *(s16 *)L = D_80180748; goto done; } + if (D_8018074A < ang) { *(s16 *)L = D_8018074A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180744) { *(s16 *)L = D_80180744; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018074E < ang) { *(s16 *)L = D_8018074E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A58A8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A58A8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A58A8; +extern s8 D_801A58AC; +extern s8 D_801A58AD; + +void func_8013C9C4(void * arg0) +{ + D_801A58A8 = arg0; + D_801A58AC = 0; + D_801A58AD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A58A8; +extern s8 D_801A58AC; +extern s8 D_801A58AD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A58A8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A58AD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A58AC)) * 2) + D_801A58A8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A58AD = (unsigned char) p[1]; + D_801A58AC = D_801A58AC + 1; + if (D_801A58AD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A58AC = 0; + *base = 0; + } + } + else + { + D_801A58AD = c - 1; + } + } + return; +} + + + +extern s32 D_801A58CC; +extern s32 D_801A58C0; +extern s32 D_801A58C4; +extern s32 D_801A58D0; + +void func_8013CABC(void) { + D_801A58CC = 1; + D_801A58C0 = 1; + D_801A58C4 = 0; + D_801A58D0 = 1; +} + + + +extern s32 D_801A58C0; +extern s32 D_801A58C4; +extern s32 D_801A58C8; +extern s32 D_801A58CC; +extern s32 D_801A58D0; + +void func_8013CAE8(void) { + D_801A58C0 = 1; + D_801A58CC = 0; + D_801A58C4 = 0; + D_801A58C8 = -1; + D_801A58D0 = 0; +} + + + +extern s32 D_801A58CC; +extern s32 D_801A58D0; +extern s32 D_801A58F8; +extern s32 D_801A58FC; + +void func_8013CB20(void) +{ + D_801A58F8 = D_801A58D0; + D_801A58FC = D_801A58CC; + D_801A58D0 = 1; + D_801A58CC = 0; +} + + + +extern s32 D_801A58F8; +extern s32 D_801A58FC; +extern s32 D_801A58D0; +extern s32 D_801A58CC; + +void func_8013CB5C(void) { + D_801A58D0 = D_801A58F8; + D_801A58CC = D_801A58FC; +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AC188; + extern u8 D_801AC189; + extern u8 D_801AC18A; + extern u8 D_801AC18B; + extern u8 D_801AC18C; + extern u8 D_801AC18D; + extern u8 D_801AC18E; + extern u8 D_801AC18F; + extern u8 D_801AC190; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AC188; t1 = D_801AC189; t2 = D_801AC18A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AC18B; t1 = D_801AC18C; t2 = D_801AC18D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AC18E; t1 = D_801AC18F; t2 = D_801AC190; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A58D8; +extern s32 D_801A58C0; +extern s32 D_801A58DC; +extern s32 D_801A58CC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A58D8 != 0) { + if (D_801A58D8 != 2) { + if (((D_801A58D8 < 3) && (D_801A58D8 == 1)) && + (D_801A58DC = D_801A58DC + 1, 0x23a < D_801A58DC)) { + D_801A58C0 = D_801A58D8; + D_801A58D8 = 2; + } + } else { + D_801A58C0 = D_801A58C0 + -1; + if (D_801A58C0 == 0) { + D_801A58C0 = D_801A58D8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A58CC == 0) { + D_801A58D8 = D_801A58D8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A58CC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A58CC; +} + + + +extern s32 D_801A58D8; + +void func_8013D164(void) { + D_801A58D8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AC26A; +extern u8 D_801AC2DE; +extern u8 D_801AC192; +extern u8 D_801AC24C; +extern u8 D_801AC170; +extern u8 D_801AC191; +extern s32 D_801AC250; + +void func_8013D330(void) { + if ((D_801AC26A & 0xff) != D_801AC2DE) { + D_801AC26A = ((D_801AC26A & 0xff) < D_801AC2DE) ? (D_801AC26A + 1) : (D_801AC26A - 1); + } + if ((D_801AC192 & 0xff) != D_801AC24C) { + D_801AC192 = ((D_801AC192 & 0xff) < D_801AC24C) ? (D_801AC192 + 1) : (D_801AC192 - 1); + } + if ((D_801AC170 & 0xff) != D_801AC191) { + D_801AC170 = ((D_801AC170 & 0xff) < D_801AC191) ? (D_801AC170 + 1) : (D_801AC170 - 1); + } + D_801AC250 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A58B0; +extern void *D_801A58B4; +extern void *D_801A58B8; +extern s32 D_801A58E0; +extern s32 D_801A58E4; +extern s32 D_801A58E8; +extern s32 D_801AC1C4[]; + +extern u8 D_8018083C[]; +extern u8 D_801808E4[]; +extern u8 D_80180794[]; +extern u8 D_80180890[]; +extern u8 D_80180910[]; +extern u8 D_801807E8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A58E0 = param_2; + D_801A58E4 = (param_2 >> 2) & 3; + D_801A58E8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A58B0 = D_8018083C; + D_801A58B4 = D_801808E4; + D_801A58B8 = D_80180794; + } else { + D_801A58B0 = D_80180890; + D_801A58B4 = D_80180910; + D_801A58B8 = D_801807E8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A58E8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A58E0 & 2) != 0) { + D_801AC1C4[0] = 0x140; + D_801AC1C4[3] = 0x80; + if (p[0x37] == 4) { + D_801AC1C4[0] = 0x140; + D_801AC1C4[3] = 0; + } + if (p[0x37] == 0) { + D_801AC1C4[0] = 0x140; + D_801AC1C4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A58B8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A58B8; +extern s16 *D_801A58BC; +extern s32 D_801A58CC; +extern s32 D_801A58EC; +extern s32 D_801A58F0; +extern s32 D_801A58F4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A58BC != 0) { + D_801A58CC = 0; + p = (int *)(param_1 * 12 + (int)D_801A58B8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A58EC != x) { + flag = 1; + if (D_801A58EC < x) { + if (x - D_801A58EC < 5) { + D_801A58EC = x; + } else { + D_801A58EC = D_801A58EC + 4; + } + } else { + if (D_801A58EC - x < 5) { + D_801A58EC = x; + } else { + D_801A58EC = D_801A58EC - 4; + } + } + } + if (D_801A58F0 != y) { + flag = 1; + if (D_801A58F0 < y) { + if (y - D_801A58F0 < 5) { + D_801A58F0 = y; + } else { + D_801A58F0 = D_801A58F0 + 4; + } + } else { + if (D_801A58F0 - y < 5) { + D_801A58F0 = y; + } else { + D_801A58F0 = D_801A58F0 - 4; + } + } + } + if (D_801A58F4 != z) { + flag = 1; + if (D_801A58F4 < z) { + if (z - D_801A58F4 < 5) { + D_801A58F4 = z; + } else { + D_801A58F4 = D_801A58F4 + 4; + } + } else { + if (D_801A58F4 - z < 5) { + D_801A58F4 = z; + } else { + D_801A58F4 = D_801A58F4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A58CC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801809A0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A58BC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A58EC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A58F0); + uVar5 = (*(int*)&D_801A58F4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801809A0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A58D4; + +s32 func_8013E054(void) { + return D_801A58D4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018139C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80181374; +extern s16 D_80181376; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018139C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80181374 = 2; + D_80181376 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80181376 = 0; + D_80181374 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A5908; + extern void * D_801A590C; + extern unsigned char D_80181014; + extern unsigned char D_8018102C; + extern unsigned char D_801810A0; + extern unsigned char D_801810A8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A5908 = &D_80181014; + D_801A590C = &D_801810A0; + } else { + D_801A5908 = &D_8018102C; + D_801A590C = &D_801810A8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018139C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018139C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018139C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80181378; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181378)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181378)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80181374; +extern s16 D_80181376; +extern unsigned char D_80181378; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181376` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80181374` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80181376; + if (*r < 3) { + *r = *r + 1; + } + D_80181374 = (u16)D_80181374 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181378); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80181378; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181378); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_018/ov_SC04_018_jr_8012ACE0.c b/src/ov_SC04_018/ov_SC04_018_jr_8012ACE0.c index c0795f31a..5a39e90a8 100644 --- a/src/ov_SC04_018/ov_SC04_018_jr_8012ACE0.c +++ b/src/ov_SC04_018/ov_SC04_018_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018D818[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018D818[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018D85C; -extern u8 D_8018D8A0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018D85C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018D8A0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018D8E4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018D920[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018D920; - if (((s16)a1) < 0xC00) { - tbl = D_8018D8E4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018D95C, D_8018D95E, D_8018D960, D_8018D962, D_8018D964, D_8018D966; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018D95E < ang)) goto outer_else; - if (!(ang < D_8018D964)) goto inner_else; - if (ang < D_8018D960) { *(s16 *)L = D_8018D960; goto done; } - if (D_8018D962 < ang) { *(s16 *)L = D_8018D962; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018D95C) { *(s16 *)L = D_8018D95C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018D966 < ang) { *(s16 *)L = D_8018D966; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E5AF8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E5AF8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E5AF8; -extern s8 D_801E5AFC; -extern s8 D_801E5AFD; - -void func_8013C9C4(void * arg0) -{ - D_801E5AF8 = arg0; - D_801E5AFC = 0; - D_801E5AFD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E5AF8; -extern s8 D_801E5AFC; -extern s8 D_801E5AFD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E5AF8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E5AFD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E5AFC)) * 2) + D_801E5AF8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E5AFD = (unsigned char) p[1]; - D_801E5AFC = D_801E5AFC + 1; - if (D_801E5AFD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E5AFC = 0; - *base = 0; - } - } - else - { - D_801E5AFD = c - 1; - } - } - return; -} - - - -extern s32 D_801E5B1C; -extern s32 D_801E5B10; -extern s32 D_801E5B14; -extern s32 D_801E5B20; - -void func_8013CABC(void) { - D_801E5B1C = 1; - D_801E5B10 = 1; - D_801E5B14 = 0; - D_801E5B20 = 1; -} - - - -extern s32 D_801E5B10; -extern s32 D_801E5B14; -extern s32 D_801E5B18; -extern s32 D_801E5B1C; -extern s32 D_801E5B20; - -void func_8013CAE8(void) { - D_801E5B10 = 1; - D_801E5B1C = 0; - D_801E5B14 = 0; - D_801E5B18 = -1; - D_801E5B20 = 0; -} - - - -extern s32 D_801E5B1C; -extern s32 D_801E5B20; -extern s32 D_801E5B48; -extern s32 D_801E5B4C; - -void func_8013CB20(void) -{ - D_801E5B48 = D_801E5B20; - D_801E5B4C = D_801E5B1C; - D_801E5B20 = 1; - D_801E5B1C = 0; -} - - - -extern s32 D_801E5B48; -extern s32 D_801E5B4C; -extern s32 D_801E5B20; -extern s32 D_801E5B1C; - -void func_8013CB5C(void) { - D_801E5B20 = D_801E5B48; - D_801E5B1C = D_801E5B4C; -} - - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E79A8; - extern u8 D_801E79A9; - extern u8 D_801E79AA; - extern u8 D_801E79AB; - extern u8 D_801E79AC; - extern u8 D_801E79AD; - extern u8 D_801E79AE; - extern u8 D_801E79AF; - extern u8 D_801E79B0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E79A8; t1 = D_801E79A9; t2 = D_801E79AA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E79AB; t1 = D_801E79AC; t2 = D_801E79AD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E79AE; t1 = D_801E79AF; t2 = D_801E79B0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E5B28; -extern s32 D_801E5B10; -extern s32 D_801E5B2C; -extern s32 D_801E5B1C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E5B28 != 0) { - if (D_801E5B28 != 2) { - if (((D_801E5B28 < 3) && (D_801E5B28 == 1)) && - (D_801E5B2C = D_801E5B2C + 1, 0x23a < D_801E5B2C)) { - D_801E5B10 = D_801E5B28; - D_801E5B28 = 2; - } - } else { - D_801E5B10 = D_801E5B10 + -1; - if (D_801E5B10 == 0) { - D_801E5B10 = D_801E5B28; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E5B1C == 0) { - D_801E5B28 = D_801E5B28 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E5B1C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E5B1C; -} - - - -extern s32 D_801E5B28; - -void func_8013D164(void) { - D_801E5B28 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E7AB2; -extern u8 D_801E7B26; -extern u8 D_801E79B2; -extern u8 D_801E7A7C; -extern u8 D_801E7988; -extern u8 D_801E79B1; -extern s32 D_801E7A80; - -void func_8013D330(void) { - if ((D_801E7AB2 & 0xff) != D_801E7B26) { - D_801E7AB2 = ((D_801E7AB2 & 0xff) < D_801E7B26) ? (D_801E7AB2 + 1) : (D_801E7AB2 - 1); - } - if ((D_801E79B2 & 0xff) != D_801E7A7C) { - D_801E79B2 = ((D_801E79B2 & 0xff) < D_801E7A7C) ? (D_801E79B2 + 1) : (D_801E79B2 - 1); - } - if ((D_801E7988 & 0xff) != D_801E79B1) { - D_801E7988 = ((D_801E7988 & 0xff) < D_801E79B1) ? (D_801E7988 + 1) : (D_801E7988 - 1); - } - D_801E7A80 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E5B00; -extern void *D_801E5B04; -extern void *D_801E5B08; -extern s32 D_801E5B30; -extern s32 D_801E5B34; -extern s32 D_801E5B38; -extern s32 D_801E79F4[]; - -extern u8 D_8018DA54[]; -extern u8 D_8018DAFC[]; -extern u8 D_8018D9AC[]; -extern u8 D_8018DAA8[]; -extern u8 D_8018DB28[]; -extern u8 D_8018DA00[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E5B30 = param_2; - D_801E5B34 = (param_2 >> 2) & 3; - D_801E5B38 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E5B00 = D_8018DA54; - D_801E5B04 = D_8018DAFC; - D_801E5B08 = D_8018D9AC; - } else { - D_801E5B00 = D_8018DAA8; - D_801E5B04 = D_8018DB28; - D_801E5B08 = D_8018DA00; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E5B38 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E5B30 & 2) != 0) { - D_801E79F4[0] = 0x140; - D_801E79F4[3] = 0x80; - if (p[0x37] == 4) { - D_801E79F4[0] = 0x140; - D_801E79F4[3] = 0; - } - if (p[0x37] == 0) { - D_801E79F4[0] = 0x140; - D_801E79F4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E5B08)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E5B08; -extern s16 *D_801E5B0C; -extern s32 D_801E5B1C; -extern s32 D_801E5B3C; -extern s32 D_801E5B40; -extern s32 D_801E5B44; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E5B0C != 0) { - D_801E5B1C = 0; - p = (int *)(param_1 * 12 + (int)D_801E5B08); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E5B3C != x) { - flag = 1; - if (D_801E5B3C < x) { - if (x - D_801E5B3C < 5) { - D_801E5B3C = x; - } else { - D_801E5B3C = D_801E5B3C + 4; - } - } else { - if (D_801E5B3C - x < 5) { - D_801E5B3C = x; - } else { - D_801E5B3C = D_801E5B3C - 4; - } - } - } - if (D_801E5B40 != y) { - flag = 1; - if (D_801E5B40 < y) { - if (y - D_801E5B40 < 5) { - D_801E5B40 = y; - } else { - D_801E5B40 = D_801E5B40 + 4; - } - } else { - if (D_801E5B40 - y < 5) { - D_801E5B40 = y; - } else { - D_801E5B40 = D_801E5B40 - 4; - } - } - } - if (D_801E5B44 != z) { - flag = 1; - if (D_801E5B44 < z) { - if (z - D_801E5B44 < 5) { - D_801E5B44 = z; - } else { - D_801E5B44 = D_801E5B44 + 4; - } - } else { - if (D_801E5B44 - z < 5) { - D_801E5B44 = z; - } else { - D_801E5B44 = D_801E5B44 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E5B1C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018DBB8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E5B0C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E5B3C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E5B40); - uVar5 = (*(int*)&D_801E5B44); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018DBB8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E5B24; - -s32 func_8013E054(void) { - return D_801E5B24; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018E5B4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018E58C; -extern s16 D_8018E58E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018E5B4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018E58C = 2; - D_8018E58E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018E58E = 0; - D_8018E58C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E5B58; - extern void * D_801E5B5C; - extern unsigned char D_8018E22C; - extern unsigned char D_8018E244; - extern unsigned char D_8018E2B8; - extern unsigned char D_8018E2C0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E5B58 = &D_8018E22C; - D_801E5B5C = &D_8018E2B8; - } else { - D_801E5B58 = &D_8018E244; - D_801E5B5C = &D_8018E2C0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018E5B4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E5B4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018E5B4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018E590; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E590)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E590)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018E58C; -extern s16 D_8018E58E; -extern unsigned char D_8018E590; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E58E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018E58C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018E58E; - if (*r < 3) { - *r = *r + 1; - } - D_8018E58C = (u16)D_8018E58C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018E590; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c b/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c new file mode 100644 index 000000000..a6a675821 --- /dev/null +++ b/src/ov_SC04_018/ov_SC04_018_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E4434; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018D4AC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E5A14; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E7AB8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E4434; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018D1E0)(); +extern s16 (*D_8018D1E4)(); +extern M2C_UNK (*D_8018D1EC)(); +extern s32 (*D_8018D1F0)(); +extern s32 D_801E5A10; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E4438; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018D540; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80190A24; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018D558; +extern M2C_UNK D_8018D560; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018D568; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018D584[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018D590[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018D5A4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D5F4[]; +extern s16 D_8018D624[]; +extern s16 D_8018D684[]; +extern s16 D_8018D68C[]; +extern s16 D_8018D6AC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018D6E4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018D73C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018D784[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018D78C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018D794[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018D79C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018D744; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018D764; +extern void func_801321B0(int param_1); +extern int D_8018D774; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E5A80; +extern s32 D_801E5A84[]; +extern int D_801E5A88; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018D7A8; +extern u8 D_8018D7A4; +extern s16 *D_8018D7AC; +extern u8 D_8018D7B0; +extern int D_801E5A80; +extern u16 D_801E5A90; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018D7AC; /* holds a pointer value (*(u16**)&D_8018D7AC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018D7C0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018D814; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018D818[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018D818[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018D85C; +extern u8 D_8018D8A0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018D85C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018D8A0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018D8E4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018D920[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018D920; + if (((s16)a1) < 0xC00) { + tbl = D_8018D8E4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018D95C, D_8018D95E, D_8018D960, D_8018D962, D_8018D964, D_8018D966; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D95E < ang)) goto outer_else; + if (!(ang < D_8018D964)) goto inner_else; + if (ang < D_8018D960) { *(s16 *)L = D_8018D960; goto done; } + if (D_8018D962 < ang) { *(s16 *)L = D_8018D962; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D95C) { *(s16 *)L = D_8018D95C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D966 < ang) { *(s16 *)L = D_8018D966; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E5AF8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E5AF8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E5AF8; +extern s8 D_801E5AFC; +extern s8 D_801E5AFD; + +void func_8013C9C4(void * arg0) +{ + D_801E5AF8 = arg0; + D_801E5AFC = 0; + D_801E5AFD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E5AF8; +extern s8 D_801E5AFC; +extern s8 D_801E5AFD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E5AF8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E5AFD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E5AFC)) * 2) + D_801E5AF8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E5AFD = (unsigned char) p[1]; + D_801E5AFC = D_801E5AFC + 1; + if (D_801E5AFD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E5AFC = 0; + *base = 0; + } + } + else + { + D_801E5AFD = c - 1; + } + } + return; +} + + + +extern s32 D_801E5B1C; +extern s32 D_801E5B10; +extern s32 D_801E5B14; +extern s32 D_801E5B20; + +void func_8013CABC(void) { + D_801E5B1C = 1; + D_801E5B10 = 1; + D_801E5B14 = 0; + D_801E5B20 = 1; +} + + + +extern s32 D_801E5B10; +extern s32 D_801E5B14; +extern s32 D_801E5B18; +extern s32 D_801E5B1C; +extern s32 D_801E5B20; + +void func_8013CAE8(void) { + D_801E5B10 = 1; + D_801E5B1C = 0; + D_801E5B14 = 0; + D_801E5B18 = -1; + D_801E5B20 = 0; +} + + + +extern s32 D_801E5B1C; +extern s32 D_801E5B20; +extern s32 D_801E5B48; +extern s32 D_801E5B4C; + +void func_8013CB20(void) +{ + D_801E5B48 = D_801E5B20; + D_801E5B4C = D_801E5B1C; + D_801E5B20 = 1; + D_801E5B1C = 0; +} + + + +extern s32 D_801E5B48; +extern s32 D_801E5B4C; +extern s32 D_801E5B20; +extern s32 D_801E5B1C; + +void func_8013CB5C(void) { + D_801E5B20 = D_801E5B48; + D_801E5B1C = D_801E5B4C; +} + + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E79A8; + extern u8 D_801E79A9; + extern u8 D_801E79AA; + extern u8 D_801E79AB; + extern u8 D_801E79AC; + extern u8 D_801E79AD; + extern u8 D_801E79AE; + extern u8 D_801E79AF; + extern u8 D_801E79B0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E79A8; t1 = D_801E79A9; t2 = D_801E79AA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E79AB; t1 = D_801E79AC; t2 = D_801E79AD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E79AE; t1 = D_801E79AF; t2 = D_801E79B0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E5B28; +extern s32 D_801E5B10; +extern s32 D_801E5B2C; +extern s32 D_801E5B1C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E5B28 != 0) { + if (D_801E5B28 != 2) { + if (((D_801E5B28 < 3) && (D_801E5B28 == 1)) && + (D_801E5B2C = D_801E5B2C + 1, 0x23a < D_801E5B2C)) { + D_801E5B10 = D_801E5B28; + D_801E5B28 = 2; + } + } else { + D_801E5B10 = D_801E5B10 + -1; + if (D_801E5B10 == 0) { + D_801E5B10 = D_801E5B28; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E5B1C == 0) { + D_801E5B28 = D_801E5B28 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E5B1C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E5B1C; +} + + + +extern s32 D_801E5B28; + +void func_8013D164(void) { + D_801E5B28 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E7AB2; +extern u8 D_801E7B26; +extern u8 D_801E79B2; +extern u8 D_801E7A7C; +extern u8 D_801E7988; +extern u8 D_801E79B1; +extern s32 D_801E7A80; + +void func_8013D330(void) { + if ((D_801E7AB2 & 0xff) != D_801E7B26) { + D_801E7AB2 = ((D_801E7AB2 & 0xff) < D_801E7B26) ? (D_801E7AB2 + 1) : (D_801E7AB2 - 1); + } + if ((D_801E79B2 & 0xff) != D_801E7A7C) { + D_801E79B2 = ((D_801E79B2 & 0xff) < D_801E7A7C) ? (D_801E79B2 + 1) : (D_801E79B2 - 1); + } + if ((D_801E7988 & 0xff) != D_801E79B1) { + D_801E7988 = ((D_801E7988 & 0xff) < D_801E79B1) ? (D_801E7988 + 1) : (D_801E7988 - 1); + } + D_801E7A80 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E5B00; +extern void *D_801E5B04; +extern void *D_801E5B08; +extern s32 D_801E5B30; +extern s32 D_801E5B34; +extern s32 D_801E5B38; +extern s32 D_801E79F4[]; + +extern u8 D_8018DA54[]; +extern u8 D_8018DAFC[]; +extern u8 D_8018D9AC[]; +extern u8 D_8018DAA8[]; +extern u8 D_8018DB28[]; +extern u8 D_8018DA00[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E5B30 = param_2; + D_801E5B34 = (param_2 >> 2) & 3; + D_801E5B38 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E5B00 = D_8018DA54; + D_801E5B04 = D_8018DAFC; + D_801E5B08 = D_8018D9AC; + } else { + D_801E5B00 = D_8018DAA8; + D_801E5B04 = D_8018DB28; + D_801E5B08 = D_8018DA00; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E5B38 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E5B30 & 2) != 0) { + D_801E79F4[0] = 0x140; + D_801E79F4[3] = 0x80; + if (p[0x37] == 4) { + D_801E79F4[0] = 0x140; + D_801E79F4[3] = 0; + } + if (p[0x37] == 0) { + D_801E79F4[0] = 0x140; + D_801E79F4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E5B08)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E5B08; +extern s16 *D_801E5B0C; +extern s32 D_801E5B1C; +extern s32 D_801E5B3C; +extern s32 D_801E5B40; +extern s32 D_801E5B44; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E5B0C != 0) { + D_801E5B1C = 0; + p = (int *)(param_1 * 12 + (int)D_801E5B08); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E5B3C != x) { + flag = 1; + if (D_801E5B3C < x) { + if (x - D_801E5B3C < 5) { + D_801E5B3C = x; + } else { + D_801E5B3C = D_801E5B3C + 4; + } + } else { + if (D_801E5B3C - x < 5) { + D_801E5B3C = x; + } else { + D_801E5B3C = D_801E5B3C - 4; + } + } + } + if (D_801E5B40 != y) { + flag = 1; + if (D_801E5B40 < y) { + if (y - D_801E5B40 < 5) { + D_801E5B40 = y; + } else { + D_801E5B40 = D_801E5B40 + 4; + } + } else { + if (D_801E5B40 - y < 5) { + D_801E5B40 = y; + } else { + D_801E5B40 = D_801E5B40 - 4; + } + } + } + if (D_801E5B44 != z) { + flag = 1; + if (D_801E5B44 < z) { + if (z - D_801E5B44 < 5) { + D_801E5B44 = z; + } else { + D_801E5B44 = D_801E5B44 + 4; + } + } else { + if (D_801E5B44 - z < 5) { + D_801E5B44 = z; + } else { + D_801E5B44 = D_801E5B44 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E5B1C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018DBB8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E5B0C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E5B3C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E5B40); + uVar5 = (*(int*)&D_801E5B44); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018DBB8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E5B24; + +s32 func_8013E054(void) { + return D_801E5B24; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018E5B4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018E58C; +extern s16 D_8018E58E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018E5B4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018E58C = 2; + D_8018E58E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018E58E = 0; + D_8018E58C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E5B58; + extern void * D_801E5B5C; + extern unsigned char D_8018E22C; + extern unsigned char D_8018E244; + extern unsigned char D_8018E2B8; + extern unsigned char D_8018E2C0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E5B58 = &D_8018E22C; + D_801E5B5C = &D_8018E2B8; + } else { + D_801E5B58 = &D_8018E244; + D_801E5B5C = &D_8018E2C0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018E5B4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E5B4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018E5B4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018E590; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E590)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E590)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018E58C; +extern s16 D_8018E58E; +extern unsigned char D_8018E590; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E58E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018E58C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018E58E; + if (*r < 3) { + *r = *r + 1; + } + D_8018E58C = (u16)D_8018E58C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018E590; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_018/nonmatchings/ov_SC04_018_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_019/ov_SC04_019_jr_8012ACE0.c b/src/ov_SC04_019/ov_SC04_019_jr_8012ACE0.c index 2a3d0ba3c..f02185fbb 100644 --- a/src/ov_SC04_019/ov_SC04_019_jr_8012ACE0.c +++ b/src/ov_SC04_019/ov_SC04_019_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018D818[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018D818[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018D85C; -extern u8 D_8018D8A0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018D85C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018D8A0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018D8E4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018D920[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018D920; - if (((s16)a1) < 0xC00) { - tbl = D_8018D8E4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018D95C, D_8018D95E, D_8018D960, D_8018D962, D_8018D964, D_8018D966; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018D95E < ang)) goto outer_else; - if (!(ang < D_8018D964)) goto inner_else; - if (ang < D_8018D960) { *(s16 *)L = D_8018D960; goto done; } - if (D_8018D962 < ang) { *(s16 *)L = D_8018D962; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018D95C) { *(s16 *)L = D_8018D95C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018D966 < ang) { *(s16 *)L = D_8018D966; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E5AF8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E5AF8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E5AF8; -extern s8 D_801E5AFC; -extern s8 D_801E5AFD; - -void func_8013C9C4(void * arg0) -{ - D_801E5AF8 = arg0; - D_801E5AFC = 0; - D_801E5AFD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E5AF8; -extern s8 D_801E5AFC; -extern s8 D_801E5AFD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E5AF8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E5AFD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E5AFC)) * 2) + D_801E5AF8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E5AFD = (unsigned char) p[1]; - D_801E5AFC = D_801E5AFC + 1; - if (D_801E5AFD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E5AFC = 0; - *base = 0; - } - } - else - { - D_801E5AFD = c - 1; - } - } - return; -} - - - -extern s32 D_801E5B1C; -extern s32 D_801E5B10; -extern s32 D_801E5B14; -extern s32 D_801E5B20; - -void func_8013CABC(void) { - D_801E5B1C = 1; - D_801E5B10 = 1; - D_801E5B14 = 0; - D_801E5B20 = 1; -} - - - -extern s32 D_801E5B10; -extern s32 D_801E5B14; -extern s32 D_801E5B18; -extern s32 D_801E5B1C; -extern s32 D_801E5B20; - -void func_8013CAE8(void) { - D_801E5B10 = 1; - D_801E5B1C = 0; - D_801E5B14 = 0; - D_801E5B18 = -1; - D_801E5B20 = 0; -} - - - -extern s32 D_801E5B1C; -extern s32 D_801E5B20; -extern s32 D_801E5B48; -extern s32 D_801E5B4C; - -void func_8013CB20(void) -{ - D_801E5B48 = D_801E5B20; - D_801E5B4C = D_801E5B1C; - D_801E5B20 = 1; - D_801E5B1C = 0; -} - - - -extern s32 D_801E5B48; -extern s32 D_801E5B4C; -extern s32 D_801E5B20; -extern s32 D_801E5B1C; - -void func_8013CB5C(void) { - D_801E5B20 = D_801E5B48; - D_801E5B1C = D_801E5B4C; -} - - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E79A8; - extern u8 D_801E79A9; - extern u8 D_801E79AA; - extern u8 D_801E79AB; - extern u8 D_801E79AC; - extern u8 D_801E79AD; - extern u8 D_801E79AE; - extern u8 D_801E79AF; - extern u8 D_801E79B0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E79A8; t1 = D_801E79A9; t2 = D_801E79AA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E79AB; t1 = D_801E79AC; t2 = D_801E79AD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E79AE; t1 = D_801E79AF; t2 = D_801E79B0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E5B28; -extern s32 D_801E5B10; -extern s32 D_801E5B2C; -extern s32 D_801E5B1C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E5B28 != 0) { - if (D_801E5B28 != 2) { - if (((D_801E5B28 < 3) && (D_801E5B28 == 1)) && - (D_801E5B2C = D_801E5B2C + 1, 0x23a < D_801E5B2C)) { - D_801E5B10 = D_801E5B28; - D_801E5B28 = 2; - } - } else { - D_801E5B10 = D_801E5B10 + -1; - if (D_801E5B10 == 0) { - D_801E5B10 = D_801E5B28; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E5B1C == 0) { - D_801E5B28 = D_801E5B28 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E5B1C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E5B1C; -} - - - -extern s32 D_801E5B28; - -void func_8013D164(void) { - D_801E5B28 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E7AB2; -extern u8 D_801E7B26; -extern u8 D_801E79B2; -extern u8 D_801E7A7C; -extern u8 D_801E7988; -extern u8 D_801E79B1; -extern s32 D_801E7A80; - -void func_8013D330(void) { - if ((D_801E7AB2 & 0xff) != D_801E7B26) { - D_801E7AB2 = ((D_801E7AB2 & 0xff) < D_801E7B26) ? (D_801E7AB2 + 1) : (D_801E7AB2 - 1); - } - if ((D_801E79B2 & 0xff) != D_801E7A7C) { - D_801E79B2 = ((D_801E79B2 & 0xff) < D_801E7A7C) ? (D_801E79B2 + 1) : (D_801E79B2 - 1); - } - if ((D_801E7988 & 0xff) != D_801E79B1) { - D_801E7988 = ((D_801E7988 & 0xff) < D_801E79B1) ? (D_801E7988 + 1) : (D_801E7988 - 1); - } - D_801E7A80 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E5B00; -extern void *D_801E5B04; -extern void *D_801E5B08; -extern s32 D_801E5B30; -extern s32 D_801E5B34; -extern s32 D_801E5B38; -extern s32 D_801E79F4[]; - -extern u8 D_8018DA54[]; -extern u8 D_8018DAFC[]; -extern u8 D_8018D9AC[]; -extern u8 D_8018DAA8[]; -extern u8 D_8018DB28[]; -extern u8 D_8018DA00[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E5B30 = param_2; - D_801E5B34 = (param_2 >> 2) & 3; - D_801E5B38 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E5B00 = D_8018DA54; - D_801E5B04 = D_8018DAFC; - D_801E5B08 = D_8018D9AC; - } else { - D_801E5B00 = D_8018DAA8; - D_801E5B04 = D_8018DB28; - D_801E5B08 = D_8018DA00; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E5B38 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E5B30 & 2) != 0) { - D_801E79F4[0] = 0x140; - D_801E79F4[3] = 0x80; - if (p[0x37] == 4) { - D_801E79F4[0] = 0x140; - D_801E79F4[3] = 0; - } - if (p[0x37] == 0) { - D_801E79F4[0] = 0x140; - D_801E79F4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E5B08)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E5B08; -extern s16 *D_801E5B0C; -extern s32 D_801E5B1C; -extern s32 D_801E5B3C; -extern s32 D_801E5B40; -extern s32 D_801E5B44; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E5B0C != 0) { - D_801E5B1C = 0; - p = (int *)(param_1 * 12 + (int)D_801E5B08); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E5B3C != x) { - flag = 1; - if (D_801E5B3C < x) { - if (x - D_801E5B3C < 5) { - D_801E5B3C = x; - } else { - D_801E5B3C = D_801E5B3C + 4; - } - } else { - if (D_801E5B3C - x < 5) { - D_801E5B3C = x; - } else { - D_801E5B3C = D_801E5B3C - 4; - } - } - } - if (D_801E5B40 != y) { - flag = 1; - if (D_801E5B40 < y) { - if (y - D_801E5B40 < 5) { - D_801E5B40 = y; - } else { - D_801E5B40 = D_801E5B40 + 4; - } - } else { - if (D_801E5B40 - y < 5) { - D_801E5B40 = y; - } else { - D_801E5B40 = D_801E5B40 - 4; - } - } - } - if (D_801E5B44 != z) { - flag = 1; - if (D_801E5B44 < z) { - if (z - D_801E5B44 < 5) { - D_801E5B44 = z; - } else { - D_801E5B44 = D_801E5B44 + 4; - } - } else { - if (D_801E5B44 - z < 5) { - D_801E5B44 = z; - } else { - D_801E5B44 = D_801E5B44 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E5B1C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018DBB8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E5B0C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E5B3C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E5B40); - uVar5 = (*(int*)&D_801E5B44); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018DBB8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E5B24; - -s32 func_8013E054(void) { - return D_801E5B24; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018E5B4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018E58C; -extern s16 D_8018E58E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018E5B4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018E58C = 2; - D_8018E58E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018E58E = 0; - D_8018E58C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E5B58; - extern void * D_801E5B5C; - extern unsigned char D_8018E22C; - extern unsigned char D_8018E244; - extern unsigned char D_8018E2B8; - extern unsigned char D_8018E2C0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E5B58 = &D_8018E22C; - D_801E5B5C = &D_8018E2B8; - } else { - D_801E5B58 = &D_8018E244; - D_801E5B5C = &D_8018E2C0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018E5B4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E5B4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018E5B4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018E590; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E590)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E590)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018E58C; -extern s16 D_8018E58E; -extern unsigned char D_8018E590; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E58E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018E58C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018E58E; - if (*r < 3) { - *r = *r + 1; - } - D_8018E58C = (u16)D_8018E58C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018E590; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c b/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c new file mode 100644 index 000000000..4a9624856 --- /dev/null +++ b/src/ov_SC04_019/ov_SC04_019_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E4434; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018D4AC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E5A14; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E7AB8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E4434; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018D1E0)(); +extern s16 (*D_8018D1E4)(); +extern M2C_UNK (*D_8018D1EC)(); +extern s32 (*D_8018D1F0)(); +extern s32 D_801E5A10; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E4438; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018D540; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80190A24; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018D558; +extern M2C_UNK D_8018D560; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018D568; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018D584[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018D590[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018D5A4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D5F4[]; +extern s16 D_8018D624[]; +extern s16 D_8018D684[]; +extern s16 D_8018D68C[]; +extern s16 D_8018D6AC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018D6E4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018D73C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018D784[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018D78C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018D794[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018D79C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018D744; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018D764; +extern void func_801321B0(int param_1); +extern int D_8018D774; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E5A80; +extern s32 D_801E5A84[]; +extern int D_801E5A88; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018D7A8; +extern u8 D_8018D7A4; +extern s16 *D_8018D7AC; +extern u8 D_8018D7B0; +extern int D_801E5A80; +extern u16 D_801E5A90; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018D7AC; /* holds a pointer value (*(u16**)&D_8018D7AC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018D7C0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018D814; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018D818[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018D818[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018D85C; +extern u8 D_8018D8A0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018D85C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018D8A0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018D8E4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018D920[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018D920; + if (((s16)a1) < 0xC00) { + tbl = D_8018D8E4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018D95C, D_8018D95E, D_8018D960, D_8018D962, D_8018D964, D_8018D966; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D95E < ang)) goto outer_else; + if (!(ang < D_8018D964)) goto inner_else; + if (ang < D_8018D960) { *(s16 *)L = D_8018D960; goto done; } + if (D_8018D962 < ang) { *(s16 *)L = D_8018D962; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D95C) { *(s16 *)L = D_8018D95C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D966 < ang) { *(s16 *)L = D_8018D966; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E5AF8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E5AF8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E5AF8; +extern s8 D_801E5AFC; +extern s8 D_801E5AFD; + +void func_8013C9C4(void * arg0) +{ + D_801E5AF8 = arg0; + D_801E5AFC = 0; + D_801E5AFD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E5AF8; +extern s8 D_801E5AFC; +extern s8 D_801E5AFD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E5AF8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E5AFD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E5AFC)) * 2) + D_801E5AF8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E5AFD = (unsigned char) p[1]; + D_801E5AFC = D_801E5AFC + 1; + if (D_801E5AFD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E5AFC = 0; + *base = 0; + } + } + else + { + D_801E5AFD = c - 1; + } + } + return; +} + + + +extern s32 D_801E5B1C; +extern s32 D_801E5B10; +extern s32 D_801E5B14; +extern s32 D_801E5B20; + +void func_8013CABC(void) { + D_801E5B1C = 1; + D_801E5B10 = 1; + D_801E5B14 = 0; + D_801E5B20 = 1; +} + + + +extern s32 D_801E5B10; +extern s32 D_801E5B14; +extern s32 D_801E5B18; +extern s32 D_801E5B1C; +extern s32 D_801E5B20; + +void func_8013CAE8(void) { + D_801E5B10 = 1; + D_801E5B1C = 0; + D_801E5B14 = 0; + D_801E5B18 = -1; + D_801E5B20 = 0; +} + + + +extern s32 D_801E5B1C; +extern s32 D_801E5B20; +extern s32 D_801E5B48; +extern s32 D_801E5B4C; + +void func_8013CB20(void) +{ + D_801E5B48 = D_801E5B20; + D_801E5B4C = D_801E5B1C; + D_801E5B20 = 1; + D_801E5B1C = 0; +} + + + +extern s32 D_801E5B48; +extern s32 D_801E5B4C; +extern s32 D_801E5B20; +extern s32 D_801E5B1C; + +void func_8013CB5C(void) { + D_801E5B20 = D_801E5B48; + D_801E5B1C = D_801E5B4C; +} + + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E79A8; + extern u8 D_801E79A9; + extern u8 D_801E79AA; + extern u8 D_801E79AB; + extern u8 D_801E79AC; + extern u8 D_801E79AD; + extern u8 D_801E79AE; + extern u8 D_801E79AF; + extern u8 D_801E79B0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E79A8; t1 = D_801E79A9; t2 = D_801E79AA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E79AB; t1 = D_801E79AC; t2 = D_801E79AD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E79AE; t1 = D_801E79AF; t2 = D_801E79B0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E5B28; +extern s32 D_801E5B10; +extern s32 D_801E5B2C; +extern s32 D_801E5B1C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E5B28 != 0) { + if (D_801E5B28 != 2) { + if (((D_801E5B28 < 3) && (D_801E5B28 == 1)) && + (D_801E5B2C = D_801E5B2C + 1, 0x23a < D_801E5B2C)) { + D_801E5B10 = D_801E5B28; + D_801E5B28 = 2; + } + } else { + D_801E5B10 = D_801E5B10 + -1; + if (D_801E5B10 == 0) { + D_801E5B10 = D_801E5B28; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E5B1C == 0) { + D_801E5B28 = D_801E5B28 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E5B1C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E5B1C; +} + + + +extern s32 D_801E5B28; + +void func_8013D164(void) { + D_801E5B28 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E7AB2; +extern u8 D_801E7B26; +extern u8 D_801E79B2; +extern u8 D_801E7A7C; +extern u8 D_801E7988; +extern u8 D_801E79B1; +extern s32 D_801E7A80; + +void func_8013D330(void) { + if ((D_801E7AB2 & 0xff) != D_801E7B26) { + D_801E7AB2 = ((D_801E7AB2 & 0xff) < D_801E7B26) ? (D_801E7AB2 + 1) : (D_801E7AB2 - 1); + } + if ((D_801E79B2 & 0xff) != D_801E7A7C) { + D_801E79B2 = ((D_801E79B2 & 0xff) < D_801E7A7C) ? (D_801E79B2 + 1) : (D_801E79B2 - 1); + } + if ((D_801E7988 & 0xff) != D_801E79B1) { + D_801E7988 = ((D_801E7988 & 0xff) < D_801E79B1) ? (D_801E7988 + 1) : (D_801E7988 - 1); + } + D_801E7A80 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E5B00; +extern void *D_801E5B04; +extern void *D_801E5B08; +extern s32 D_801E5B30; +extern s32 D_801E5B34; +extern s32 D_801E5B38; +extern s32 D_801E79F4[]; + +extern u8 D_8018DA54[]; +extern u8 D_8018DAFC[]; +extern u8 D_8018D9AC[]; +extern u8 D_8018DAA8[]; +extern u8 D_8018DB28[]; +extern u8 D_8018DA00[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E5B30 = param_2; + D_801E5B34 = (param_2 >> 2) & 3; + D_801E5B38 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E5B00 = D_8018DA54; + D_801E5B04 = D_8018DAFC; + D_801E5B08 = D_8018D9AC; + } else { + D_801E5B00 = D_8018DAA8; + D_801E5B04 = D_8018DB28; + D_801E5B08 = D_8018DA00; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E5B38 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E5B30 & 2) != 0) { + D_801E79F4[0] = 0x140; + D_801E79F4[3] = 0x80; + if (p[0x37] == 4) { + D_801E79F4[0] = 0x140; + D_801E79F4[3] = 0; + } + if (p[0x37] == 0) { + D_801E79F4[0] = 0x140; + D_801E79F4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E5B08)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E5B08; +extern s16 *D_801E5B0C; +extern s32 D_801E5B1C; +extern s32 D_801E5B3C; +extern s32 D_801E5B40; +extern s32 D_801E5B44; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E5B0C != 0) { + D_801E5B1C = 0; + p = (int *)(param_1 * 12 + (int)D_801E5B08); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E5B3C != x) { + flag = 1; + if (D_801E5B3C < x) { + if (x - D_801E5B3C < 5) { + D_801E5B3C = x; + } else { + D_801E5B3C = D_801E5B3C + 4; + } + } else { + if (D_801E5B3C - x < 5) { + D_801E5B3C = x; + } else { + D_801E5B3C = D_801E5B3C - 4; + } + } + } + if (D_801E5B40 != y) { + flag = 1; + if (D_801E5B40 < y) { + if (y - D_801E5B40 < 5) { + D_801E5B40 = y; + } else { + D_801E5B40 = D_801E5B40 + 4; + } + } else { + if (D_801E5B40 - y < 5) { + D_801E5B40 = y; + } else { + D_801E5B40 = D_801E5B40 - 4; + } + } + } + if (D_801E5B44 != z) { + flag = 1; + if (D_801E5B44 < z) { + if (z - D_801E5B44 < 5) { + D_801E5B44 = z; + } else { + D_801E5B44 = D_801E5B44 + 4; + } + } else { + if (D_801E5B44 - z < 5) { + D_801E5B44 = z; + } else { + D_801E5B44 = D_801E5B44 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E5B1C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018DBB8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E5B0C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E5B3C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E5B40); + uVar5 = (*(int*)&D_801E5B44); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018DBB8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E5B24; + +s32 func_8013E054(void) { + return D_801E5B24; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018E5B4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018E58C; +extern s16 D_8018E58E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018E5B4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018E58C = 2; + D_8018E58E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018E58E = 0; + D_8018E58C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E5B58; + extern void * D_801E5B5C; + extern unsigned char D_8018E22C; + extern unsigned char D_8018E244; + extern unsigned char D_8018E2B8; + extern unsigned char D_8018E2C0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E5B58 = &D_8018E22C; + D_801E5B5C = &D_8018E2B8; + } else { + D_801E5B58 = &D_8018E244; + D_801E5B5C = &D_8018E2C0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018E5B4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E5B4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018E5B4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018E590; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E590)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E590)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018E58C; +extern s16 D_8018E58E; +extern unsigned char D_8018E590; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E58E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018E58C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018E58E; + if (*r < 3) { + *r = *r + 1; + } + D_8018E58C = (u16)D_8018E58C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018E590; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E590); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_020/ov_SC04_020_jr_8012ACE0.c b/src/ov_SC04_020/ov_SC04_020_jr_8012ACE0.c index 87137c890..10a625486 100644 --- a/src/ov_SC04_020/ov_SC04_020_jr_8012ACE0.c +++ b/src/ov_SC04_020/ov_SC04_020_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80183950[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80183950[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80183994; -extern u8 D_801839D8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80183994; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801839D8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183A1C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80183A58[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80183A58; - if (((s16)a1) < 0xC00) { - tbl = D_80183A1C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80183A94, D_80183A96, D_80183A98, D_80183A9A, D_80183A9C, D_80183A9E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80183A96 < ang)) goto outer_else; - if (!(ang < D_80183A9C)) goto inner_else; - if (ang < D_80183A98) { *(s16 *)L = D_80183A98; goto done; } - if (D_80183A9A < ang) { *(s16 *)L = D_80183A9A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80183A94) { *(s16 *)L = D_80183A94; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80183A9E < ang) { *(s16 *)L = D_80183A9E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801BB108; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801BB108, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801BB108; -extern s8 D_801BB10C; -extern s8 D_801BB10D; - -void func_8013C9C4(void * arg0) -{ - D_801BB108 = arg0; - D_801BB10C = 0; - D_801BB10D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801BB108; -extern s8 D_801BB10C; -extern s8 D_801BB10D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801BB108; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801BB10D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801BB10C)) * 2) + D_801BB108); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801BB10D = (unsigned char) p[1]; - D_801BB10C = D_801BB10C + 1; - if (D_801BB10D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801BB10C = 0; - *base = 0; - } - } - else - { - D_801BB10D = c - 1; - } - } - return; -} - - - -extern s32 D_801BB12C; -extern s32 D_801BB120; -extern s32 D_801BB124; -extern s32 D_801BB130; - -void func_8013CABC(void) { - D_801BB12C = 1; - D_801BB120 = 1; - D_801BB124 = 0; - D_801BB130 = 1; -} - - - -extern s32 D_801BB120; -extern s32 D_801BB124; -extern s32 D_801BB128; -extern s32 D_801BB12C; -extern s32 D_801BB130; - -void func_8013CAE8(void) { - D_801BB120 = 1; - D_801BB12C = 0; - D_801BB124 = 0; - D_801BB128 = -1; - D_801BB130 = 0; -} - - - -extern s32 D_801BB12C; -extern s32 D_801BB130; -extern s32 D_801BB158; -extern s32 D_801BB15C; - -void func_8013CB20(void) -{ - D_801BB158 = D_801BB130; - D_801BB15C = D_801BB12C; - D_801BB130 = 1; - D_801BB12C = 0; -} - - - -extern s32 D_801BB158; -extern s32 D_801BB15C; -extern s32 D_801BB130; -extern s32 D_801BB12C; - -void func_8013CB5C(void) { - D_801BB130 = D_801BB158; - D_801BB12C = D_801BB15C; -} - - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801BC630; - extern u8 D_801BC631; - extern u8 D_801BC632; - extern u8 D_801BC633; - extern u8 D_801BC634; - extern u8 D_801BC635; - extern u8 D_801BC636; - extern u8 D_801BC637; - extern u8 D_801BC638; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801BC630; t1 = D_801BC631; t2 = D_801BC632; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801BC633; t1 = D_801BC634; t2 = D_801BC635; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801BC636; t1 = D_801BC637; t2 = D_801BC638; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801BB138; -extern s32 D_801BB120; -extern s32 D_801BB13C; -extern s32 D_801BB12C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801BB138 != 0) { - if (D_801BB138 != 2) { - if (((D_801BB138 < 3) && (D_801BB138 == 1)) && - (D_801BB13C = D_801BB13C + 1, 0x23a < D_801BB13C)) { - D_801BB120 = D_801BB138; - D_801BB138 = 2; - } - } else { - D_801BB120 = D_801BB120 + -1; - if (D_801BB120 == 0) { - D_801BB120 = D_801BB138; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801BB12C == 0) { - D_801BB138 = D_801BB138 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801BB12C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801BB12C; -} - - - -extern s32 D_801BB138; - -void func_8013D164(void) { - D_801BB138 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801BC73A; -extern u8 D_801BC7AE; -extern u8 D_801BC63A; -extern u8 D_801BC704; -extern u8 D_801BC610; -extern u8 D_801BC639; -extern s32 D_801BC708; - -void func_8013D330(void) { - if ((D_801BC73A & 0xff) != D_801BC7AE) { - D_801BC73A = ((D_801BC73A & 0xff) < D_801BC7AE) ? (D_801BC73A + 1) : (D_801BC73A - 1); - } - if ((D_801BC63A & 0xff) != D_801BC704) { - D_801BC63A = ((D_801BC63A & 0xff) < D_801BC704) ? (D_801BC63A + 1) : (D_801BC63A - 1); - } - if ((D_801BC610 & 0xff) != D_801BC639) { - D_801BC610 = ((D_801BC610 & 0xff) < D_801BC639) ? (D_801BC610 + 1) : (D_801BC610 - 1); - } - D_801BC708 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801BB110; -extern void *D_801BB114; -extern void *D_801BB118; -extern s32 D_801BB140; -extern s32 D_801BB144; -extern s32 D_801BB148; -extern s32 D_801BC67C[]; - -extern u8 D_80183B8C[]; -extern u8 D_80183C34[]; -extern u8 D_80183AE4[]; -extern u8 D_80183BE0[]; -extern u8 D_80183C60[]; -extern u8 D_80183B38[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801BB140 = param_2; - D_801BB144 = (param_2 >> 2) & 3; - D_801BB148 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801BB110 = D_80183B8C; - D_801BB114 = D_80183C34; - D_801BB118 = D_80183AE4; - } else { - D_801BB110 = D_80183BE0; - D_801BB114 = D_80183C60; - D_801BB118 = D_80183B38; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801BB148 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801BB140 & 2) != 0) { - D_801BC67C[0] = 0x140; - D_801BC67C[3] = 0x80; - if (p[0x37] == 4) { - D_801BC67C[0] = 0x140; - D_801BC67C[3] = 0; - } - if (p[0x37] == 0) { - D_801BC67C[0] = 0x140; - D_801BC67C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801BB118)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801BB118; -extern s16 *D_801BB11C; -extern s32 D_801BB12C; -extern s32 D_801BB14C; -extern s32 D_801BB150; -extern s32 D_801BB154; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801BB11C != 0) { - D_801BB12C = 0; - p = (int *)(param_1 * 12 + (int)D_801BB118); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801BB14C != x) { - flag = 1; - if (D_801BB14C < x) { - if (x - D_801BB14C < 5) { - D_801BB14C = x; - } else { - D_801BB14C = D_801BB14C + 4; - } - } else { - if (D_801BB14C - x < 5) { - D_801BB14C = x; - } else { - D_801BB14C = D_801BB14C - 4; - } - } - } - if (D_801BB150 != y) { - flag = 1; - if (D_801BB150 < y) { - if (y - D_801BB150 < 5) { - D_801BB150 = y; - } else { - D_801BB150 = D_801BB150 + 4; - } - } else { - if (D_801BB150 - y < 5) { - D_801BB150 = y; - } else { - D_801BB150 = D_801BB150 - 4; - } - } - } - if (D_801BB154 != z) { - flag = 1; - if (D_801BB154 < z) { - if (z - D_801BB154 < 5) { - D_801BB154 = z; - } else { - D_801BB154 = D_801BB154 + 4; - } - } else { - if (D_801BB154 - z < 5) { - D_801BB154 = z; - } else { - D_801BB154 = D_801BB154 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801BB12C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183CF0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801BB11C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BB14C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BB150); - uVar5 = (*(int*)&D_801BB154); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183CF0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801BB134; - -s32 func_8013E054(void) { - return D_801BB134; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801846EC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801846C4; -extern s16 D_801846C6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801846EC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801846C4 = 2; - D_801846C6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801846C6 = 0; - D_801846C4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801BB168; - extern void * D_801BB16C; - extern unsigned char D_80184364; - extern unsigned char D_8018437C; - extern unsigned char D_801843F0; - extern unsigned char D_801843F8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801BB168 = &D_80184364; - D_801BB16C = &D_801843F0; - } else { - D_801BB168 = &D_8018437C; - D_801BB16C = &D_801843F8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801846EC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801846EC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801846EC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801846C8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801846C8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801846C8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801846C4; -extern s16 D_801846C6; -extern unsigned char D_801846C8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801846C6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801846C4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801846C6; - if (*r < 3) { - *r = *r + 1; - } - D_801846C4 = (u16)D_801846C4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801846C8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801846C8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801846C8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c b/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c new file mode 100644 index 000000000..4bf2769ca --- /dev/null +++ b/src/ov_SC04_020/ov_SC04_020_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B9E5C; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801835E4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801BB024; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801BC740; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B9E5C; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80183320)(); +extern s16 (*D_80183324)(); +extern M2C_UNK (*D_8018332C)(); +extern s32 (*D_80183330)(); +extern s32 D_801BB020; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B9E60; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80183678; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80186B5C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80183690; +extern M2C_UNK D_80183698; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801836A0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801836BC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801836C8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801836DC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018372C[]; +extern s16 D_8018375C[]; +extern s16 D_801837BC[]; +extern s16 D_801837C4[]; +extern s16 D_801837E4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018381C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80183874[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801838BC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801838C4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801838CC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801838D4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018387C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018389C; +extern void func_801321B0(int param_1); +extern int D_801838AC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801BB090; +extern s32 D_801BB094[]; +extern int D_801BB098; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801838E0; +extern u8 D_801838DC; +extern s16 *D_801838E4; +extern u8 D_801838E8; +extern int D_801BB090; +extern u16 D_801BB0A0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801838E4; /* holds a pointer value (*(u16**)&D_801838E4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801838F8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018394C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80183950[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80183950[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80183994; +extern u8 D_801839D8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80183994; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801839D8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183A1C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80183A58[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80183A58; + if (((s16)a1) < 0xC00) { + tbl = D_80183A1C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80183A94, D_80183A96, D_80183A98, D_80183A9A, D_80183A9C, D_80183A9E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80183A96 < ang)) goto outer_else; + if (!(ang < D_80183A9C)) goto inner_else; + if (ang < D_80183A98) { *(s16 *)L = D_80183A98; goto done; } + if (D_80183A9A < ang) { *(s16 *)L = D_80183A9A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80183A94) { *(s16 *)L = D_80183A94; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183A9E < ang) { *(s16 *)L = D_80183A9E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801BB108; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801BB108, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801BB108; +extern s8 D_801BB10C; +extern s8 D_801BB10D; + +void func_8013C9C4(void * arg0) +{ + D_801BB108 = arg0; + D_801BB10C = 0; + D_801BB10D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801BB108; +extern s8 D_801BB10C; +extern s8 D_801BB10D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801BB108; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801BB10D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801BB10C)) * 2) + D_801BB108); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801BB10D = (unsigned char) p[1]; + D_801BB10C = D_801BB10C + 1; + if (D_801BB10D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801BB10C = 0; + *base = 0; + } + } + else + { + D_801BB10D = c - 1; + } + } + return; +} + + + +extern s32 D_801BB12C; +extern s32 D_801BB120; +extern s32 D_801BB124; +extern s32 D_801BB130; + +void func_8013CABC(void) { + D_801BB12C = 1; + D_801BB120 = 1; + D_801BB124 = 0; + D_801BB130 = 1; +} + + + +extern s32 D_801BB120; +extern s32 D_801BB124; +extern s32 D_801BB128; +extern s32 D_801BB12C; +extern s32 D_801BB130; + +void func_8013CAE8(void) { + D_801BB120 = 1; + D_801BB12C = 0; + D_801BB124 = 0; + D_801BB128 = -1; + D_801BB130 = 0; +} + + + +extern s32 D_801BB12C; +extern s32 D_801BB130; +extern s32 D_801BB158; +extern s32 D_801BB15C; + +void func_8013CB20(void) +{ + D_801BB158 = D_801BB130; + D_801BB15C = D_801BB12C; + D_801BB130 = 1; + D_801BB12C = 0; +} + + + +extern s32 D_801BB158; +extern s32 D_801BB15C; +extern s32 D_801BB130; +extern s32 D_801BB12C; + +void func_8013CB5C(void) { + D_801BB130 = D_801BB158; + D_801BB12C = D_801BB15C; +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801BC630; + extern u8 D_801BC631; + extern u8 D_801BC632; + extern u8 D_801BC633; + extern u8 D_801BC634; + extern u8 D_801BC635; + extern u8 D_801BC636; + extern u8 D_801BC637; + extern u8 D_801BC638; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801BC630; t1 = D_801BC631; t2 = D_801BC632; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801BC633; t1 = D_801BC634; t2 = D_801BC635; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801BC636; t1 = D_801BC637; t2 = D_801BC638; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801BB138; +extern s32 D_801BB120; +extern s32 D_801BB13C; +extern s32 D_801BB12C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801BB138 != 0) { + if (D_801BB138 != 2) { + if (((D_801BB138 < 3) && (D_801BB138 == 1)) && + (D_801BB13C = D_801BB13C + 1, 0x23a < D_801BB13C)) { + D_801BB120 = D_801BB138; + D_801BB138 = 2; + } + } else { + D_801BB120 = D_801BB120 + -1; + if (D_801BB120 == 0) { + D_801BB120 = D_801BB138; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801BB12C == 0) { + D_801BB138 = D_801BB138 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801BB12C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801BB12C; +} + + + +extern s32 D_801BB138; + +void func_8013D164(void) { + D_801BB138 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801BC73A; +extern u8 D_801BC7AE; +extern u8 D_801BC63A; +extern u8 D_801BC704; +extern u8 D_801BC610; +extern u8 D_801BC639; +extern s32 D_801BC708; + +void func_8013D330(void) { + if ((D_801BC73A & 0xff) != D_801BC7AE) { + D_801BC73A = ((D_801BC73A & 0xff) < D_801BC7AE) ? (D_801BC73A + 1) : (D_801BC73A - 1); + } + if ((D_801BC63A & 0xff) != D_801BC704) { + D_801BC63A = ((D_801BC63A & 0xff) < D_801BC704) ? (D_801BC63A + 1) : (D_801BC63A - 1); + } + if ((D_801BC610 & 0xff) != D_801BC639) { + D_801BC610 = ((D_801BC610 & 0xff) < D_801BC639) ? (D_801BC610 + 1) : (D_801BC610 - 1); + } + D_801BC708 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801BB110; +extern void *D_801BB114; +extern void *D_801BB118; +extern s32 D_801BB140; +extern s32 D_801BB144; +extern s32 D_801BB148; +extern s32 D_801BC67C[]; + +extern u8 D_80183B8C[]; +extern u8 D_80183C34[]; +extern u8 D_80183AE4[]; +extern u8 D_80183BE0[]; +extern u8 D_80183C60[]; +extern u8 D_80183B38[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801BB140 = param_2; + D_801BB144 = (param_2 >> 2) & 3; + D_801BB148 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801BB110 = D_80183B8C; + D_801BB114 = D_80183C34; + D_801BB118 = D_80183AE4; + } else { + D_801BB110 = D_80183BE0; + D_801BB114 = D_80183C60; + D_801BB118 = D_80183B38; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801BB148 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801BB140 & 2) != 0) { + D_801BC67C[0] = 0x140; + D_801BC67C[3] = 0x80; + if (p[0x37] == 4) { + D_801BC67C[0] = 0x140; + D_801BC67C[3] = 0; + } + if (p[0x37] == 0) { + D_801BC67C[0] = 0x140; + D_801BC67C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801BB118)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801BB118; +extern s16 *D_801BB11C; +extern s32 D_801BB12C; +extern s32 D_801BB14C; +extern s32 D_801BB150; +extern s32 D_801BB154; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801BB11C != 0) { + D_801BB12C = 0; + p = (int *)(param_1 * 12 + (int)D_801BB118); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801BB14C != x) { + flag = 1; + if (D_801BB14C < x) { + if (x - D_801BB14C < 5) { + D_801BB14C = x; + } else { + D_801BB14C = D_801BB14C + 4; + } + } else { + if (D_801BB14C - x < 5) { + D_801BB14C = x; + } else { + D_801BB14C = D_801BB14C - 4; + } + } + } + if (D_801BB150 != y) { + flag = 1; + if (D_801BB150 < y) { + if (y - D_801BB150 < 5) { + D_801BB150 = y; + } else { + D_801BB150 = D_801BB150 + 4; + } + } else { + if (D_801BB150 - y < 5) { + D_801BB150 = y; + } else { + D_801BB150 = D_801BB150 - 4; + } + } + } + if (D_801BB154 != z) { + flag = 1; + if (D_801BB154 < z) { + if (z - D_801BB154 < 5) { + D_801BB154 = z; + } else { + D_801BB154 = D_801BB154 + 4; + } + } else { + if (D_801BB154 - z < 5) { + D_801BB154 = z; + } else { + D_801BB154 = D_801BB154 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801BB12C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183CF0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801BB11C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801BB14C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801BB150); + uVar5 = (*(int*)&D_801BB154); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183CF0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801BB134; + +s32 func_8013E054(void) { + return D_801BB134; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801846EC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801846C4; +extern s16 D_801846C6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801846EC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801846C4 = 2; + D_801846C6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801846C6 = 0; + D_801846C4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801BB168; + extern void * D_801BB16C; + extern unsigned char D_80184364; + extern unsigned char D_8018437C; + extern unsigned char D_801843F0; + extern unsigned char D_801843F8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801BB168 = &D_80184364; + D_801BB16C = &D_801843F0; + } else { + D_801BB168 = &D_8018437C; + D_801BB16C = &D_801843F8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801846EC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801846EC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801846EC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801846C8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801846C8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801846C8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801846C4; +extern s16 D_801846C6; +extern unsigned char D_801846C8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801846C6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801846C4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801846C6; + if (*r < 3) { + *r = *r + 1; + } + D_801846C4 = (u16)D_801846C4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801846C8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801846C8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801846C8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_020/nonmatchings/ov_SC04_020_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC04_021/ov_SC04_021_jr_8012ACE0.c b/src/ov_SC04_021/ov_SC04_021_jr_8012ACE0.c index d4d96dbb8..4063d323a 100644 --- a/src/ov_SC04_021/ov_SC04_021_jr_8012ACE0.c +++ b/src/ov_SC04_021/ov_SC04_021_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F87C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F87C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F8C0; -extern u8 D_8017F904; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F8C0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F904 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F948[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F984[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F984; - if (((s16)a1) < 0xC00) { - tbl = D_8017F948; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F9C2 < ang)) goto outer_else; - if (!(ang < D_8017F9C8)) goto inner_else; - if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } - if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018E760; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018E760, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018E760; -extern s8 D_8018E764; -extern s8 D_8018E765; - -void func_8013C9C4(void * arg0) -{ - D_8018E760 = arg0; - D_8018E764 = 0; - D_8018E765 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018E760; -extern s8 D_8018E764; -extern s8 D_8018E765; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018E760; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018E765; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E764)) * 2) + D_8018E760); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018E765 = (unsigned char) p[1]; - D_8018E764 = D_8018E764 + 1; - if (D_8018E765 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018E764 = 0; - *base = 0; - } - } - else - { - D_8018E765 = c - 1; - } - } - return; -} - - - -extern s32 D_8018E784; -extern s32 D_8018E778; -extern s32 D_8018E77C; -extern s32 D_8018E788; - -void func_8013CABC(void) { - D_8018E784 = 1; - D_8018E778 = 1; - D_8018E77C = 0; - D_8018E788 = 1; -} - - - -extern s32 D_8018E778; -extern s32 D_8018E77C; -extern s32 D_8018E780; -extern s32 D_8018E784; -extern s32 D_8018E788; - -void func_8013CAE8(void) { - D_8018E778 = 1; - D_8018E784 = 0; - D_8018E77C = 0; - D_8018E780 = -1; - D_8018E788 = 0; -} - - - -extern s32 D_8018E784; -extern s32 D_8018E788; -extern s32 D_8018E7B0; -extern s32 D_8018E7B4; - -void func_8013CB20(void) -{ - D_8018E7B0 = D_8018E788; - D_8018E7B4 = D_8018E784; - D_8018E788 = 1; - D_8018E784 = 0; -} - - - -extern s32 D_8018E7B0; -extern s32 D_8018E7B4; -extern s32 D_8018E788; -extern s32 D_8018E784; - -void func_8013CB5C(void) { - D_8018E788 = D_8018E7B0; - D_8018E784 = D_8018E7B4; -} - - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8018F9D0; - extern u8 D_8018F9D1; - extern u8 D_8018F9D2; - extern u8 D_8018F9D3; - extern u8 D_8018F9D4; - extern u8 D_8018F9D5; - extern u8 D_8018F9D6; - extern u8 D_8018F9D7; - extern u8 D_8018F9D8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8018F9D0; t1 = D_8018F9D1; t2 = D_8018F9D2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8018F9D3; t1 = D_8018F9D4; t2 = D_8018F9D5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8018F9D6; t1 = D_8018F9D7; t2 = D_8018F9D8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018E790; -extern s32 D_8018E778; -extern s32 D_8018E794; -extern s32 D_8018E784; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018E790 != 0) { - if (D_8018E790 != 2) { - if (((D_8018E790 < 3) && (D_8018E790 == 1)) && - (D_8018E794 = D_8018E794 + 1, 0x23a < D_8018E794)) { - D_8018E778 = D_8018E790; - D_8018E790 = 2; - } - } else { - D_8018E778 = D_8018E778 + -1; - if (D_8018E778 == 0) { - D_8018E778 = D_8018E790; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018E784 == 0) { - D_8018E790 = D_8018E790 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018E784; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018E784; -} - - - -extern s32 D_8018E790; - -void func_8013D164(void) { - D_8018E790 = 1; -} - - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8018FAB2; -extern u8 D_8018FB2C; -extern u8 D_8018F9DA; -extern u8 D_8018FA94; -extern u8 D_8018F9B8; -extern u8 D_8018F9D9; -extern s32 D_8018FA98; - -void func_8013D330(void) { - if ((D_8018FAB2 & 0xff) != D_8018FB2C) { - D_8018FAB2 = ((D_8018FAB2 & 0xff) < D_8018FB2C) ? (D_8018FAB2 + 1) : (D_8018FAB2 - 1); - } - if ((D_8018F9DA & 0xff) != D_8018FA94) { - D_8018F9DA = ((D_8018F9DA & 0xff) < D_8018FA94) ? (D_8018F9DA + 1) : (D_8018F9DA - 1); - } - if ((D_8018F9B8 & 0xff) != D_8018F9D9) { - D_8018F9B8 = ((D_8018F9B8 & 0xff) < D_8018F9D9) ? (D_8018F9B8 + 1) : (D_8018F9B8 - 1); - } - D_8018FA98 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018E768; -extern void *D_8018E76C; -extern void *D_8018E770; -extern s32 D_8018E798; -extern s32 D_8018E79C; -extern s32 D_8018E7A0; -extern s32 D_8018FA0C[]; - -extern u8 D_8017FAB8[]; -extern u8 D_8017FB60[]; -extern u8 D_8017FA10[]; -extern u8 D_8017FB0C[]; -extern u8 D_8017FB8C[]; -extern u8 D_8017FA64[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018E798 = param_2; - D_8018E79C = (param_2 >> 2) & 3; - D_8018E7A0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018E768 = D_8017FAB8; - D_8018E76C = D_8017FB60; - D_8018E770 = D_8017FA10; - } else { - D_8018E768 = D_8017FB0C; - D_8018E76C = D_8017FB8C; - D_8018E770 = D_8017FA64; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018E7A0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018E798 & 2) != 0) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0x80; - if (p[0x37] == 4) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0; - } - if (p[0x37] == 0) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018E770)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018E770; -extern s16 *D_8018E774; -extern s32 D_8018E784; -extern s32 D_8018E7A4; -extern s32 D_8018E7A8; -extern s32 D_8018E7AC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018E774 != 0) { - D_8018E784 = 0; - p = (int *)(param_1 * 12 + (int)D_8018E770); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018E7A4 != x) { - flag = 1; - if (D_8018E7A4 < x) { - if (x - D_8018E7A4 < 5) { - D_8018E7A4 = x; - } else { - D_8018E7A4 = D_8018E7A4 + 4; - } - } else { - if (D_8018E7A4 - x < 5) { - D_8018E7A4 = x; - } else { - D_8018E7A4 = D_8018E7A4 - 4; - } - } - } - if (D_8018E7A8 != y) { - flag = 1; - if (D_8018E7A8 < y) { - if (y - D_8018E7A8 < 5) { - D_8018E7A8 = y; - } else { - D_8018E7A8 = D_8018E7A8 + 4; - } - } else { - if (D_8018E7A8 - y < 5) { - D_8018E7A8 = y; - } else { - D_8018E7A8 = D_8018E7A8 - 4; - } - } - } - if (D_8018E7AC != z) { - flag = 1; - if (D_8018E7AC < z) { - if (z - D_8018E7AC < 5) { - D_8018E7AC = z; - } else { - D_8018E7AC = D_8018E7AC + 4; - } - } else { - if (D_8018E7AC - z < 5) { - D_8018E7AC = z; - } else { - D_8018E7AC = D_8018E7AC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018E784 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FC1C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018E774); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7A4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7A8); - uVar5 = (*(int*)&D_8018E7AC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FC1C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018E78C; - -s32 func_8013E054(void) { - return D_8018E78C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180618; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801805F0; -extern s16 D_801805F2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180618; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801805F0 = 2; - D_801805F2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801805F2 = 0; - D_801805F0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018E7C0; - extern void * D_8018E7C4; - extern unsigned char D_80180290; - extern unsigned char D_801802A8; - extern unsigned char D_8018031C; - extern unsigned char D_80180324; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018E7C0 = &D_80180290; - D_8018E7C4 = &D_8018031C; - } else { - D_8018E7C0 = &D_801802A8; - D_8018E7C4 = &D_80180324; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180618/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180618 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180618)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801805F4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801805F4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801805F4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801805F0; -extern s16 D_801805F2; -extern unsigned char D_801805F4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801805F2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801805F0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801805F2; - if (*r < 3) { - *r = *r + 1; - } - D_801805F0 = (u16)D_801805F0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801805F4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC04_021/ov_SC04_021_jr_801380E0.c b/src/ov_SC04_021/ov_SC04_021_jr_801380E0.c new file mode 100644 index 000000000..1bf46af8b --- /dev/null +++ b/src/ov_SC04_021/ov_SC04_021_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D4F8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F510[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018E67C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8018FAB8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D4F8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F24C)(); +extern s16 (*D_8017F250)(); +extern M2C_UNK (*D_8017F258)(); +extern s32 (*D_8017F25C)(); +extern s32 D_8018E678; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D4FC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F5A4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182A88; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F5BC; +extern M2C_UNK D_8017F5C4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F5CC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F5E8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F5F4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F608[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F658[]; +extern s16 D_8017F688[]; +extern s16 D_8017F6E8[]; +extern s16 D_8017F6F0[]; +extern s16 D_8017F710[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F748[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F7A0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F7E8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F7F0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F7F8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F800[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F7A8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F7C8; +extern void func_801321B0(int param_1); +extern int D_8017F7D8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018E6E8; +extern s32 D_8018E6EC[]; +extern int D_8018E6F0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F80C; +extern u8 D_8017F808; +extern s16 *D_8017F810; +extern u8 D_8017F814; +extern int D_8018E6E8; +extern u16 D_8018E6F8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F810; /* holds a pointer value (*(u16**)&D_8017F810) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F824[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F878; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F87C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F87C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F8C0; +extern u8 D_8017F904; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F8C0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F904 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F948[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F984[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F984; + if (((s16)a1) < 0xC00) { + tbl = D_8017F948; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F9C2 < ang)) goto outer_else; + if (!(ang < D_8017F9C8)) goto inner_else; + if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } + if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018E760; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018E760, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018E760; +extern s8 D_8018E764; +extern s8 D_8018E765; + +void func_8013C9C4(void * arg0) +{ + D_8018E760 = arg0; + D_8018E764 = 0; + D_8018E765 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018E760; +extern s8 D_8018E764; +extern s8 D_8018E765; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018E760; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018E765; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E764)) * 2) + D_8018E760); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018E765 = (unsigned char) p[1]; + D_8018E764 = D_8018E764 + 1; + if (D_8018E765 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018E764 = 0; + *base = 0; + } + } + else + { + D_8018E765 = c - 1; + } + } + return; +} + + + +extern s32 D_8018E784; +extern s32 D_8018E778; +extern s32 D_8018E77C; +extern s32 D_8018E788; + +void func_8013CABC(void) { + D_8018E784 = 1; + D_8018E778 = 1; + D_8018E77C = 0; + D_8018E788 = 1; +} + + + +extern s32 D_8018E778; +extern s32 D_8018E77C; +extern s32 D_8018E780; +extern s32 D_8018E784; +extern s32 D_8018E788; + +void func_8013CAE8(void) { + D_8018E778 = 1; + D_8018E784 = 0; + D_8018E77C = 0; + D_8018E780 = -1; + D_8018E788 = 0; +} + + + +extern s32 D_8018E784; +extern s32 D_8018E788; +extern s32 D_8018E7B0; +extern s32 D_8018E7B4; + +void func_8013CB20(void) +{ + D_8018E7B0 = D_8018E788; + D_8018E7B4 = D_8018E784; + D_8018E788 = 1; + D_8018E784 = 0; +} + + + +extern s32 D_8018E7B0; +extern s32 D_8018E7B4; +extern s32 D_8018E788; +extern s32 D_8018E784; + +void func_8013CB5C(void) { + D_8018E788 = D_8018E7B0; + D_8018E784 = D_8018E7B4; +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8018F9D0; + extern u8 D_8018F9D1; + extern u8 D_8018F9D2; + extern u8 D_8018F9D3; + extern u8 D_8018F9D4; + extern u8 D_8018F9D5; + extern u8 D_8018F9D6; + extern u8 D_8018F9D7; + extern u8 D_8018F9D8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8018F9D0; t1 = D_8018F9D1; t2 = D_8018F9D2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8018F9D3; t1 = D_8018F9D4; t2 = D_8018F9D5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8018F9D6; t1 = D_8018F9D7; t2 = D_8018F9D8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018E790; +extern s32 D_8018E778; +extern s32 D_8018E794; +extern s32 D_8018E784; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018E790 != 0) { + if (D_8018E790 != 2) { + if (((D_8018E790 < 3) && (D_8018E790 == 1)) && + (D_8018E794 = D_8018E794 + 1, 0x23a < D_8018E794)) { + D_8018E778 = D_8018E790; + D_8018E790 = 2; + } + } else { + D_8018E778 = D_8018E778 + -1; + if (D_8018E778 == 0) { + D_8018E778 = D_8018E790; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018E784 == 0) { + D_8018E790 = D_8018E790 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018E784; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018E784; +} + + + +extern s32 D_8018E790; + +void func_8013D164(void) { + D_8018E790 = 1; +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8018FAB2; +extern u8 D_8018FB2C; +extern u8 D_8018F9DA; +extern u8 D_8018FA94; +extern u8 D_8018F9B8; +extern u8 D_8018F9D9; +extern s32 D_8018FA98; + +void func_8013D330(void) { + if ((D_8018FAB2 & 0xff) != D_8018FB2C) { + D_8018FAB2 = ((D_8018FAB2 & 0xff) < D_8018FB2C) ? (D_8018FAB2 + 1) : (D_8018FAB2 - 1); + } + if ((D_8018F9DA & 0xff) != D_8018FA94) { + D_8018F9DA = ((D_8018F9DA & 0xff) < D_8018FA94) ? (D_8018F9DA + 1) : (D_8018F9DA - 1); + } + if ((D_8018F9B8 & 0xff) != D_8018F9D9) { + D_8018F9B8 = ((D_8018F9B8 & 0xff) < D_8018F9D9) ? (D_8018F9B8 + 1) : (D_8018F9B8 - 1); + } + D_8018FA98 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018E768; +extern void *D_8018E76C; +extern void *D_8018E770; +extern s32 D_8018E798; +extern s32 D_8018E79C; +extern s32 D_8018E7A0; +extern s32 D_8018FA0C[]; + +extern u8 D_8017FAB8[]; +extern u8 D_8017FB60[]; +extern u8 D_8017FA10[]; +extern u8 D_8017FB0C[]; +extern u8 D_8017FB8C[]; +extern u8 D_8017FA64[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018E798 = param_2; + D_8018E79C = (param_2 >> 2) & 3; + D_8018E7A0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018E768 = D_8017FAB8; + D_8018E76C = D_8017FB60; + D_8018E770 = D_8017FA10; + } else { + D_8018E768 = D_8017FB0C; + D_8018E76C = D_8017FB8C; + D_8018E770 = D_8017FA64; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018E7A0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018E798 & 2) != 0) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0x80; + if (p[0x37] == 4) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0; + } + if (p[0x37] == 0) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018E770)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018E770; +extern s16 *D_8018E774; +extern s32 D_8018E784; +extern s32 D_8018E7A4; +extern s32 D_8018E7A8; +extern s32 D_8018E7AC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018E774 != 0) { + D_8018E784 = 0; + p = (int *)(param_1 * 12 + (int)D_8018E770); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018E7A4 != x) { + flag = 1; + if (D_8018E7A4 < x) { + if (x - D_8018E7A4 < 5) { + D_8018E7A4 = x; + } else { + D_8018E7A4 = D_8018E7A4 + 4; + } + } else { + if (D_8018E7A4 - x < 5) { + D_8018E7A4 = x; + } else { + D_8018E7A4 = D_8018E7A4 - 4; + } + } + } + if (D_8018E7A8 != y) { + flag = 1; + if (D_8018E7A8 < y) { + if (y - D_8018E7A8 < 5) { + D_8018E7A8 = y; + } else { + D_8018E7A8 = D_8018E7A8 + 4; + } + } else { + if (D_8018E7A8 - y < 5) { + D_8018E7A8 = y; + } else { + D_8018E7A8 = D_8018E7A8 - 4; + } + } + } + if (D_8018E7AC != z) { + flag = 1; + if (D_8018E7AC < z) { + if (z - D_8018E7AC < 5) { + D_8018E7AC = z; + } else { + D_8018E7AC = D_8018E7AC + 4; + } + } else { + if (D_8018E7AC - z < 5) { + D_8018E7AC = z; + } else { + D_8018E7AC = D_8018E7AC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018E784 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FC1C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018E774); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7A4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7A8); + uVar5 = (*(int*)&D_8018E7AC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FC1C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018E78C; + +s32 func_8013E054(void) { + return D_8018E78C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180618; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801805F0; +extern s16 D_801805F2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180618; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801805F0 = 2; + D_801805F2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801805F2 = 0; + D_801805F0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018E7C0; + extern void * D_8018E7C4; + extern unsigned char D_80180290; + extern unsigned char D_801802A8; + extern unsigned char D_8018031C; + extern unsigned char D_80180324; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018E7C0 = &D_80180290; + D_8018E7C4 = &D_8018031C; + } else { + D_8018E7C0 = &D_801802A8; + D_8018E7C4 = &D_80180324; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180618/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180618 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180618)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801805F4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801805F4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801805F4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801805F0; +extern s16 D_801805F2; +extern unsigned char D_801805F4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801805F2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801805F0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801805F2; + if (*r < 3) { + *r = *r + 1; + } + D_801805F0 = (u16)D_801805F0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801805F4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC04_021/nonmatchings/ov_SC04_021_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_000/ov_SC05_000_jr_8012ACE0.c b/src/ov_SC05_000/ov_SC05_000_jr_8012ACE0.c index 9fa6bd7a3..6a3157e8a 100644 --- a/src/ov_SC05_000/ov_SC05_000_jr_8012ACE0.c +++ b/src/ov_SC05_000/ov_SC05_000_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E890[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E890[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E8D4; -extern u8 D_8017E918; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E8D4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E918 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E95C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E998[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E998; - if (((s16)a1) < 0xC00) { - tbl = D_8017E95C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E9D4, D_8017E9D6, D_8017E9D8, D_8017E9DA, D_8017E9DC, D_8017E9DE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E9D6 < ang)) goto outer_else; - if (!(ang < D_8017E9DC)) goto inner_else; - if (ang < D_8017E9D8) { *(s16 *)L = D_8017E9D8; goto done; } - if (D_8017E9DA < ang) { *(s16 *)L = D_8017E9DA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E9D4) { *(s16 *)L = D_8017E9D4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E9DE < ang) { *(s16 *)L = D_8017E9DE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80199890; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80199890, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80199890; -extern s8 D_80199894; -extern s8 D_80199895; - -void func_8013C9C4(void * arg0) -{ - D_80199890 = arg0; - D_80199894 = 0; - D_80199895 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80199890; -extern s8 D_80199894; -extern s8 D_80199895; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80199890; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80199895; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80199894)) * 2) + D_80199890); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80199895 = (unsigned char) p[1]; - D_80199894 = D_80199894 + 1; - if (D_80199895 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80199894 = 0; - *base = 0; - } - } - else - { - D_80199895 = c - 1; - } - } - return; -} - - - -extern s32 D_801998B4; -extern s32 D_801998A8; -extern s32 D_801998AC; -extern s32 D_801998B8; - -void func_8013CABC(void) { - D_801998B4 = 1; - D_801998A8 = 1; - D_801998AC = 0; - D_801998B8 = 1; -} - - - -extern s32 D_801998A8; -extern s32 D_801998AC; -extern s32 D_801998B0; -extern s32 D_801998B4; -extern s32 D_801998B8; - -void func_8013CAE8(void) { - D_801998A8 = 1; - D_801998B4 = 0; - D_801998AC = 0; - D_801998B0 = -1; - D_801998B8 = 0; -} - - - -extern s32 D_801998B4; -extern s32 D_801998B8; -extern s32 D_801998E0; -extern s32 D_801998E4; - -void func_8013CB20(void) -{ - D_801998E0 = D_801998B8; - D_801998E4 = D_801998B4; - D_801998B8 = 1; - D_801998B4 = 0; -} - - - -extern s32 D_801998E0; -extern s32 D_801998E4; -extern s32 D_801998B8; -extern s32 D_801998B4; - -void func_8013CB5C(void) { - D_801998B8 = D_801998E0; - D_801998B4 = D_801998E4; -} - - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019AB00; - extern u8 D_8019AB01; - extern u8 D_8019AB02; - extern u8 D_8019AB03; - extern u8 D_8019AB04; - extern u8 D_8019AB05; - extern u8 D_8019AB06; - extern u8 D_8019AB07; - extern u8 D_8019AB08; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019AB00; t1 = D_8019AB01; t2 = D_8019AB02; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019AB03; t1 = D_8019AB04; t2 = D_8019AB05; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019AB06; t1 = D_8019AB07; t2 = D_8019AB08; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801998C0; -extern s32 D_801998A8; -extern s32 D_801998C4; -extern s32 D_801998B4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801998C0 != 0) { - if (D_801998C0 != 2) { - if (((D_801998C0 < 3) && (D_801998C0 == 1)) && - (D_801998C4 = D_801998C4 + 1, 0x23a < D_801998C4)) { - D_801998A8 = D_801998C0; - D_801998C0 = 2; - } - } else { - D_801998A8 = D_801998A8 + -1; - if (D_801998A8 == 0) { - D_801998A8 = D_801998C0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801998B4 == 0) { - D_801998C0 = D_801998C0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801998B4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801998B4; -} - - - -extern s32 D_801998C0; - -void func_8013D164(void) { - D_801998C0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019ABE2; -extern u8 D_8019AC56; -extern u8 D_8019AB0A; -extern u8 D_8019ABC4; -extern u8 D_8019AAE8; -extern u8 D_8019AB09; -extern s32 D_8019ABC8; - -void func_8013D330(void) { - if ((D_8019ABE2 & 0xff) != D_8019AC56) { - D_8019ABE2 = ((D_8019ABE2 & 0xff) < D_8019AC56) ? (D_8019ABE2 + 1) : (D_8019ABE2 - 1); - } - if ((D_8019AB0A & 0xff) != D_8019ABC4) { - D_8019AB0A = ((D_8019AB0A & 0xff) < D_8019ABC4) ? (D_8019AB0A + 1) : (D_8019AB0A - 1); - } - if ((D_8019AAE8 & 0xff) != D_8019AB09) { - D_8019AAE8 = ((D_8019AAE8 & 0xff) < D_8019AB09) ? (D_8019AAE8 + 1) : (D_8019AAE8 - 1); - } - D_8019ABC8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80199898; -extern void *D_8019989C; -extern void *D_801998A0; -extern s32 D_801998C8; -extern s32 D_801998CC; -extern s32 D_801998D0; -extern s32 D_8019AB3C[]; - -extern u8 D_8017EACC[]; -extern u8 D_8017EB74[]; -extern u8 D_8017EA24[]; -extern u8 D_8017EB20[]; -extern u8 D_8017EBA0[]; -extern u8 D_8017EA78[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801998C8 = param_2; - D_801998CC = (param_2 >> 2) & 3; - D_801998D0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80199898 = D_8017EACC; - D_8019989C = D_8017EB74; - D_801998A0 = D_8017EA24; - } else { - D_80199898 = D_8017EB20; - D_8019989C = D_8017EBA0; - D_801998A0 = D_8017EA78; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801998D0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801998C8 & 2) != 0) { - D_8019AB3C[0] = 0x140; - D_8019AB3C[3] = 0x80; - if (p[0x37] == 4) { - D_8019AB3C[0] = 0x140; - D_8019AB3C[3] = 0; - } - if (p[0x37] == 0) { - D_8019AB3C[0] = 0x140; - D_8019AB3C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801998A0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801998A0; -extern s16 *D_801998A4; -extern s32 D_801998B4; -extern s32 D_801998D4; -extern s32 D_801998D8; -extern s32 D_801998DC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801998A4 != 0) { - D_801998B4 = 0; - p = (int *)(param_1 * 12 + (int)D_801998A0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801998D4 != x) { - flag = 1; - if (D_801998D4 < x) { - if (x - D_801998D4 < 5) { - D_801998D4 = x; - } else { - D_801998D4 = D_801998D4 + 4; - } - } else { - if (D_801998D4 - x < 5) { - D_801998D4 = x; - } else { - D_801998D4 = D_801998D4 - 4; - } - } - } - if (D_801998D8 != y) { - flag = 1; - if (D_801998D8 < y) { - if (y - D_801998D8 < 5) { - D_801998D8 = y; - } else { - D_801998D8 = D_801998D8 + 4; - } - } else { - if (D_801998D8 - y < 5) { - D_801998D8 = y; - } else { - D_801998D8 = D_801998D8 - 4; - } - } - } - if (D_801998DC != z) { - flag = 1; - if (D_801998DC < z) { - if (z - D_801998DC < 5) { - D_801998DC = z; - } else { - D_801998DC = D_801998DC + 4; - } - } else { - if (D_801998DC - z < 5) { - D_801998DC = z; - } else { - D_801998DC = D_801998DC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801998B4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017EC30[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801998A4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801998D4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801998D8); - uVar5 = (*(int*)&D_801998DC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017EC30); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801998BC; - -s32 func_8013E054(void) { - return D_801998BC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F62C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F604; -extern s16 D_8017F606; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F62C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F604 = 2; - D_8017F606 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F606 = 0; - D_8017F604 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801998F0; - extern void * D_801998F4; - extern unsigned char D_8017F2A4; - extern unsigned char D_8017F2BC; - extern unsigned char D_8017F330; - extern unsigned char D_8017F338; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801998F0 = &D_8017F2A4; - D_801998F4 = &D_8017F330; - } else { - D_801998F0 = &D_8017F2BC; - D_801998F4 = &D_8017F338; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F62C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F62C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F62C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F608; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F608)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F608)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F604; -extern s16 D_8017F606; -extern unsigned char D_8017F608; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F606` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F604` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F606; - if (*r < 3) { - *r = *r + 1; - } - D_8017F604 = (u16)D_8017F604 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F608); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F608; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F608); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_000/ov_SC05_000_jr_801380E0.c b/src/ov_SC05_000/ov_SC05_000_jr_801380E0.c new file mode 100644 index 000000000..f00bc3f3d --- /dev/null +++ b/src/ov_SC05_000/ov_SC05_000_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80198648; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E524[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801997AC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019ABE8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80198648; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017E260)(); +extern s16 (*D_8017E264)(); +extern M2C_UNK (*D_8017E26C)(); +extern s32 (*D_8017E270)(); +extern s32 D_801997A8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019864C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E5B8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181A9C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E5D0; +extern M2C_UNK D_8017E5D8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E5E0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E5FC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E608[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E61C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E66C[]; +extern s16 D_8017E69C[]; +extern s16 D_8017E6FC[]; +extern s16 D_8017E704[]; +extern s16 D_8017E724[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E75C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E7B4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E7FC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E804[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E80C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E814[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E7BC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E7DC; +extern void func_801321B0(int param_1); +extern int D_8017E7EC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80199818; +extern s32 D_8019981C[]; +extern int D_80199820; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E820; +extern u8 D_8017E81C; +extern s16 *D_8017E824; +extern u8 D_8017E828; +extern int D_80199818; +extern u16 D_80199828; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E824; /* holds a pointer value (*(u16**)&D_8017E824) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E838[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E88C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E890[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E890[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E8D4; +extern u8 D_8017E918; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E8D4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E918 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E95C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E998[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E998; + if (((s16)a1) < 0xC00) { + tbl = D_8017E95C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E9D4, D_8017E9D6, D_8017E9D8, D_8017E9DA, D_8017E9DC, D_8017E9DE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E9D6 < ang)) goto outer_else; + if (!(ang < D_8017E9DC)) goto inner_else; + if (ang < D_8017E9D8) { *(s16 *)L = D_8017E9D8; goto done; } + if (D_8017E9DA < ang) { *(s16 *)L = D_8017E9DA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E9D4) { *(s16 *)L = D_8017E9D4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E9DE < ang) { *(s16 *)L = D_8017E9DE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80199890; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80199890, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80199890; +extern s8 D_80199894; +extern s8 D_80199895; + +void func_8013C9C4(void * arg0) +{ + D_80199890 = arg0; + D_80199894 = 0; + D_80199895 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80199890; +extern s8 D_80199894; +extern s8 D_80199895; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80199890; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80199895; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80199894)) * 2) + D_80199890); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80199895 = (unsigned char) p[1]; + D_80199894 = D_80199894 + 1; + if (D_80199895 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80199894 = 0; + *base = 0; + } + } + else + { + D_80199895 = c - 1; + } + } + return; +} + + + +extern s32 D_801998B4; +extern s32 D_801998A8; +extern s32 D_801998AC; +extern s32 D_801998B8; + +void func_8013CABC(void) { + D_801998B4 = 1; + D_801998A8 = 1; + D_801998AC = 0; + D_801998B8 = 1; +} + + + +extern s32 D_801998A8; +extern s32 D_801998AC; +extern s32 D_801998B0; +extern s32 D_801998B4; +extern s32 D_801998B8; + +void func_8013CAE8(void) { + D_801998A8 = 1; + D_801998B4 = 0; + D_801998AC = 0; + D_801998B0 = -1; + D_801998B8 = 0; +} + + + +extern s32 D_801998B4; +extern s32 D_801998B8; +extern s32 D_801998E0; +extern s32 D_801998E4; + +void func_8013CB20(void) +{ + D_801998E0 = D_801998B8; + D_801998E4 = D_801998B4; + D_801998B8 = 1; + D_801998B4 = 0; +} + + + +extern s32 D_801998E0; +extern s32 D_801998E4; +extern s32 D_801998B8; +extern s32 D_801998B4; + +void func_8013CB5C(void) { + D_801998B8 = D_801998E0; + D_801998B4 = D_801998E4; +} + + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019AB00; + extern u8 D_8019AB01; + extern u8 D_8019AB02; + extern u8 D_8019AB03; + extern u8 D_8019AB04; + extern u8 D_8019AB05; + extern u8 D_8019AB06; + extern u8 D_8019AB07; + extern u8 D_8019AB08; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019AB00; t1 = D_8019AB01; t2 = D_8019AB02; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019AB03; t1 = D_8019AB04; t2 = D_8019AB05; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019AB06; t1 = D_8019AB07; t2 = D_8019AB08; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801998C0; +extern s32 D_801998A8; +extern s32 D_801998C4; +extern s32 D_801998B4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801998C0 != 0) { + if (D_801998C0 != 2) { + if (((D_801998C0 < 3) && (D_801998C0 == 1)) && + (D_801998C4 = D_801998C4 + 1, 0x23a < D_801998C4)) { + D_801998A8 = D_801998C0; + D_801998C0 = 2; + } + } else { + D_801998A8 = D_801998A8 + -1; + if (D_801998A8 == 0) { + D_801998A8 = D_801998C0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801998B4 == 0) { + D_801998C0 = D_801998C0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801998B4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801998B4; +} + + + +extern s32 D_801998C0; + +void func_8013D164(void) { + D_801998C0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019ABE2; +extern u8 D_8019AC56; +extern u8 D_8019AB0A; +extern u8 D_8019ABC4; +extern u8 D_8019AAE8; +extern u8 D_8019AB09; +extern s32 D_8019ABC8; + +void func_8013D330(void) { + if ((D_8019ABE2 & 0xff) != D_8019AC56) { + D_8019ABE2 = ((D_8019ABE2 & 0xff) < D_8019AC56) ? (D_8019ABE2 + 1) : (D_8019ABE2 - 1); + } + if ((D_8019AB0A & 0xff) != D_8019ABC4) { + D_8019AB0A = ((D_8019AB0A & 0xff) < D_8019ABC4) ? (D_8019AB0A + 1) : (D_8019AB0A - 1); + } + if ((D_8019AAE8 & 0xff) != D_8019AB09) { + D_8019AAE8 = ((D_8019AAE8 & 0xff) < D_8019AB09) ? (D_8019AAE8 + 1) : (D_8019AAE8 - 1); + } + D_8019ABC8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80199898; +extern void *D_8019989C; +extern void *D_801998A0; +extern s32 D_801998C8; +extern s32 D_801998CC; +extern s32 D_801998D0; +extern s32 D_8019AB3C[]; + +extern u8 D_8017EACC[]; +extern u8 D_8017EB74[]; +extern u8 D_8017EA24[]; +extern u8 D_8017EB20[]; +extern u8 D_8017EBA0[]; +extern u8 D_8017EA78[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801998C8 = param_2; + D_801998CC = (param_2 >> 2) & 3; + D_801998D0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80199898 = D_8017EACC; + D_8019989C = D_8017EB74; + D_801998A0 = D_8017EA24; + } else { + D_80199898 = D_8017EB20; + D_8019989C = D_8017EBA0; + D_801998A0 = D_8017EA78; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801998D0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801998C8 & 2) != 0) { + D_8019AB3C[0] = 0x140; + D_8019AB3C[3] = 0x80; + if (p[0x37] == 4) { + D_8019AB3C[0] = 0x140; + D_8019AB3C[3] = 0; + } + if (p[0x37] == 0) { + D_8019AB3C[0] = 0x140; + D_8019AB3C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801998A0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801998A0; +extern s16 *D_801998A4; +extern s32 D_801998B4; +extern s32 D_801998D4; +extern s32 D_801998D8; +extern s32 D_801998DC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801998A4 != 0) { + D_801998B4 = 0; + p = (int *)(param_1 * 12 + (int)D_801998A0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801998D4 != x) { + flag = 1; + if (D_801998D4 < x) { + if (x - D_801998D4 < 5) { + D_801998D4 = x; + } else { + D_801998D4 = D_801998D4 + 4; + } + } else { + if (D_801998D4 - x < 5) { + D_801998D4 = x; + } else { + D_801998D4 = D_801998D4 - 4; + } + } + } + if (D_801998D8 != y) { + flag = 1; + if (D_801998D8 < y) { + if (y - D_801998D8 < 5) { + D_801998D8 = y; + } else { + D_801998D8 = D_801998D8 + 4; + } + } else { + if (D_801998D8 - y < 5) { + D_801998D8 = y; + } else { + D_801998D8 = D_801998D8 - 4; + } + } + } + if (D_801998DC != z) { + flag = 1; + if (D_801998DC < z) { + if (z - D_801998DC < 5) { + D_801998DC = z; + } else { + D_801998DC = D_801998DC + 4; + } + } else { + if (D_801998DC - z < 5) { + D_801998DC = z; + } else { + D_801998DC = D_801998DC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801998B4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017EC30[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801998A4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801998D4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801998D8); + uVar5 = (*(int*)&D_801998DC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017EC30); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801998BC; + +s32 func_8013E054(void) { + return D_801998BC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F62C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F604; +extern s16 D_8017F606; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F62C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F604 = 2; + D_8017F606 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F606 = 0; + D_8017F604 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801998F0; + extern void * D_801998F4; + extern unsigned char D_8017F2A4; + extern unsigned char D_8017F2BC; + extern unsigned char D_8017F330; + extern unsigned char D_8017F338; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801998F0 = &D_8017F2A4; + D_801998F4 = &D_8017F330; + } else { + D_801998F0 = &D_8017F2BC; + D_801998F4 = &D_8017F338; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F62C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F62C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F62C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F608; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F608)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F608)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F604; +extern s16 D_8017F606; +extern unsigned char D_8017F608; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F606` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F604` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F606; + if (*r < 3) { + *r = *r + 1; + } + D_8017F604 = (u16)D_8017F604 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F608); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F608; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F608); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_000/nonmatchings/ov_SC05_000_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_001/ov_SC05_001_jr_8012ACE0.c b/src/ov_SC05_001/ov_SC05_001_jr_8012ACE0.c index f9d0021e6..a8c67a02e 100644 --- a/src/ov_SC05_001/ov_SC05_001_jr_8012ACE0.c +++ b/src/ov_SC05_001/ov_SC05_001_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018606C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018606C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801860B0; -extern u8 D_801860F4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801860B0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801860F4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80186138[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80186174[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80186174; - if (((s16)a1) < 0xC00) { - tbl = D_80186138; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801861B0, D_801861B2, D_801861B4, D_801861B6, D_801861B8, D_801861BA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801861B2 < ang)) goto outer_else; - if (!(ang < D_801861B8)) goto inner_else; - if (ang < D_801861B4) { *(s16 *)L = D_801861B4; goto done; } - if (D_801861B6 < ang) { *(s16 *)L = D_801861B6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801861B0) { *(s16 *)L = D_801861B0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801861BA < ang) { *(s16 *)L = D_801861BA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B4950; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B4950, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B4950; -extern s8 D_801B4954; -extern s8 D_801B4955; - -void func_8013C9C4(void * arg0) -{ - D_801B4950 = arg0; - D_801B4954 = 0; - D_801B4955 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B4950; -extern s8 D_801B4954; -extern s8 D_801B4955; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B4950; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B4955; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B4954)) * 2) + D_801B4950); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B4955 = (unsigned char) p[1]; - D_801B4954 = D_801B4954 + 1; - if (D_801B4955 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B4954 = 0; - *base = 0; - } - } - else - { - D_801B4955 = c - 1; - } - } - return; -} - - - -extern s32 D_801B4974; -extern s32 D_801B4968; -extern s32 D_801B496C; -extern s32 D_801B4978; - -void func_8013CABC(void) { - D_801B4974 = 1; - D_801B4968 = 1; - D_801B496C = 0; - D_801B4978 = 1; -} - - - -extern s32 D_801B4968; -extern s32 D_801B496C; -extern s32 D_801B4970; -extern s32 D_801B4974; -extern s32 D_801B4978; - -void func_8013CAE8(void) { - D_801B4968 = 1; - D_801B4974 = 0; - D_801B496C = 0; - D_801B4970 = -1; - D_801B4978 = 0; -} - - - -extern s32 D_801B4974; -extern s32 D_801B4978; -extern s32 D_801B49A0; -extern s32 D_801B49A4; - -void func_8013CB20(void) -{ - D_801B49A0 = D_801B4978; - D_801B49A4 = D_801B4974; - D_801B4978 = 1; - D_801B4974 = 0; -} - - - -extern s32 D_801B49A0; -extern s32 D_801B49A4; -extern s32 D_801B4978; -extern s32 D_801B4974; - -void func_8013CB5C(void) { - D_801B4978 = D_801B49A0; - D_801B4974 = D_801B49A4; -} - - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B5EB0; - extern u8 D_801B5EB1; - extern u8 D_801B5EB2; - extern u8 D_801B5EB3; - extern u8 D_801B5EB4; - extern u8 D_801B5EB5; - extern u8 D_801B5EB6; - extern u8 D_801B5EB7; - extern u8 D_801B5EB8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B5EB0; t1 = D_801B5EB1; t2 = D_801B5EB2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B5EB3; t1 = D_801B5EB4; t2 = D_801B5EB5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B5EB6; t1 = D_801B5EB7; t2 = D_801B5EB8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B4980; -extern s32 D_801B4968; -extern s32 D_801B4984; -extern s32 D_801B4974; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B4980 != 0) { - if (D_801B4980 != 2) { - if (((D_801B4980 < 3) && (D_801B4980 == 1)) && - (D_801B4984 = D_801B4984 + 1, 0x23a < D_801B4984)) { - D_801B4968 = D_801B4980; - D_801B4980 = 2; - } - } else { - D_801B4968 = D_801B4968 + -1; - if (D_801B4968 == 0) { - D_801B4968 = D_801B4980; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B4974 == 0) { - D_801B4980 = D_801B4980 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B4974; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B4974; -} - - - -extern s32 D_801B4980; - -void func_8013D164(void) { - D_801B4980 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B5F92; -extern u8 D_801B6006; -extern u8 D_801B5EBA; -extern u8 D_801B5F74; -extern u8 D_801B5E98; -extern u8 D_801B5EB9; -extern s32 D_801B5F78; - -void func_8013D330(void) { - if ((D_801B5F92 & 0xff) != D_801B6006) { - D_801B5F92 = ((D_801B5F92 & 0xff) < D_801B6006) ? (D_801B5F92 + 1) : (D_801B5F92 - 1); - } - if ((D_801B5EBA & 0xff) != D_801B5F74) { - D_801B5EBA = ((D_801B5EBA & 0xff) < D_801B5F74) ? (D_801B5EBA + 1) : (D_801B5EBA - 1); - } - if ((D_801B5E98 & 0xff) != D_801B5EB9) { - D_801B5E98 = ((D_801B5E98 & 0xff) < D_801B5EB9) ? (D_801B5E98 + 1) : (D_801B5E98 - 1); - } - D_801B5F78 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B4958; -extern void *D_801B495C; -extern void *D_801B4960; -extern s32 D_801B4988; -extern s32 D_801B498C; -extern s32 D_801B4990; -extern s32 D_801B5EEC[]; - -extern u8 D_801862A8[]; -extern u8 D_80186350[]; -extern u8 D_80186200[]; -extern u8 D_801862FC[]; -extern u8 D_8018637C[]; -extern u8 D_80186254[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B4988 = param_2; - D_801B498C = (param_2 >> 2) & 3; - D_801B4990 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B4958 = D_801862A8; - D_801B495C = D_80186350; - D_801B4960 = D_80186200; - } else { - D_801B4958 = D_801862FC; - D_801B495C = D_8018637C; - D_801B4960 = D_80186254; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B4990 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B4988 & 2) != 0) { - D_801B5EEC[0] = 0x140; - D_801B5EEC[3] = 0x80; - if (p[0x37] == 4) { - D_801B5EEC[0] = 0x140; - D_801B5EEC[3] = 0; - } - if (p[0x37] == 0) { - D_801B5EEC[0] = 0x140; - D_801B5EEC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B4960)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B4960; -extern s16 *D_801B4964; -extern s32 D_801B4974; -extern s32 D_801B4994; -extern s32 D_801B4998; -extern s32 D_801B499C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B4964 != 0) { - D_801B4974 = 0; - p = (int *)(param_1 * 12 + (int)D_801B4960); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B4994 != x) { - flag = 1; - if (D_801B4994 < x) { - if (x - D_801B4994 < 5) { - D_801B4994 = x; - } else { - D_801B4994 = D_801B4994 + 4; - } - } else { - if (D_801B4994 - x < 5) { - D_801B4994 = x; - } else { - D_801B4994 = D_801B4994 - 4; - } - } - } - if (D_801B4998 != y) { - flag = 1; - if (D_801B4998 < y) { - if (y - D_801B4998 < 5) { - D_801B4998 = y; - } else { - D_801B4998 = D_801B4998 + 4; - } - } else { - if (D_801B4998 - y < 5) { - D_801B4998 = y; - } else { - D_801B4998 = D_801B4998 - 4; - } - } - } - if (D_801B499C != z) { - flag = 1; - if (D_801B499C < z) { - if (z - D_801B499C < 5) { - D_801B499C = z; - } else { - D_801B499C = D_801B499C + 4; - } - } else { - if (D_801B499C - z < 5) { - D_801B499C = z; - } else { - D_801B499C = D_801B499C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B4974 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018640C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B4964); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B4994); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B4998); - uVar5 = (*(int*)&D_801B499C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018640C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B497C; - -s32 func_8013E054(void) { - return D_801B497C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186E08; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186DE0; -extern s16 D_80186DE2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186E08; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186DE0 = 2; - D_80186DE2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186DE2 = 0; - D_80186DE0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B49B0; - extern void * D_801B49B4; - extern unsigned char D_80186A80; - extern unsigned char D_80186A98; - extern unsigned char D_80186B0C; - extern unsigned char D_80186B14; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B49B0 = &D_80186A80; - D_801B49B4 = &D_80186B0C; - } else { - D_801B49B0 = &D_80186A98; - D_801B49B4 = &D_80186B14; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186E08/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186E08 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186E08)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186DE4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186DE4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186DE4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186DE0; -extern s16 D_80186DE2; -extern unsigned char D_80186DE4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186DE2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186DE0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186DE2; - if (*r < 3) { - *r = *r + 1; - } - D_80186DE0 = (u16)D_80186DE0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186DE4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186DE4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186DE4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_001/ov_SC05_001_jr_801380E0.c b/src/ov_SC05_001/ov_SC05_001_jr_801380E0.c new file mode 100644 index 000000000..82a0262dc --- /dev/null +++ b/src/ov_SC05_001/ov_SC05_001_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B35FC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80185D00[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B486C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B5F98; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B35FC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80185A3C)(); +extern s16 (*D_80185A40)(); +extern M2C_UNK (*D_80185A48)(); +extern s32 (*D_80185A4C)(); +extern s32 D_801B4868; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B3600; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80185D94; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80189278; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185DAC; +extern M2C_UNK D_80185DB4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185DBC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185DD8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185DE4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185DF8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185E48[]; +extern s16 D_80185E78[]; +extern s16 D_80185ED8[]; +extern s16 D_80185EE0[]; +extern s16 D_80185F00[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80185F38[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185F90[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185FD8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185FE0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185FE8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185FF0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80185F98; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80185FB8; +extern void func_801321B0(int param_1); +extern int D_80185FC8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B48D8; +extern s32 D_801B48DC[]; +extern int D_801B48E0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185FFC; +extern u8 D_80185FF8; +extern s16 *D_80186000; +extern u8 D_80186004; +extern int D_801B48D8; +extern u16 D_801B48E8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186000; /* holds a pointer value (*(u16**)&D_80186000) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186014[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186068; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018606C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018606C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801860B0; +extern u8 D_801860F4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801860B0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801860F4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80186138[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80186174[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80186174; + if (((s16)a1) < 0xC00) { + tbl = D_80186138; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801861B0, D_801861B2, D_801861B4, D_801861B6, D_801861B8, D_801861BA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801861B2 < ang)) goto outer_else; + if (!(ang < D_801861B8)) goto inner_else; + if (ang < D_801861B4) { *(s16 *)L = D_801861B4; goto done; } + if (D_801861B6 < ang) { *(s16 *)L = D_801861B6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801861B0) { *(s16 *)L = D_801861B0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801861BA < ang) { *(s16 *)L = D_801861BA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B4950; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B4950, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B4950; +extern s8 D_801B4954; +extern s8 D_801B4955; + +void func_8013C9C4(void * arg0) +{ + D_801B4950 = arg0; + D_801B4954 = 0; + D_801B4955 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B4950; +extern s8 D_801B4954; +extern s8 D_801B4955; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B4950; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B4955; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B4954)) * 2) + D_801B4950); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B4955 = (unsigned char) p[1]; + D_801B4954 = D_801B4954 + 1; + if (D_801B4955 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B4954 = 0; + *base = 0; + } + } + else + { + D_801B4955 = c - 1; + } + } + return; +} + + + +extern s32 D_801B4974; +extern s32 D_801B4968; +extern s32 D_801B496C; +extern s32 D_801B4978; + +void func_8013CABC(void) { + D_801B4974 = 1; + D_801B4968 = 1; + D_801B496C = 0; + D_801B4978 = 1; +} + + + +extern s32 D_801B4968; +extern s32 D_801B496C; +extern s32 D_801B4970; +extern s32 D_801B4974; +extern s32 D_801B4978; + +void func_8013CAE8(void) { + D_801B4968 = 1; + D_801B4974 = 0; + D_801B496C = 0; + D_801B4970 = -1; + D_801B4978 = 0; +} + + + +extern s32 D_801B4974; +extern s32 D_801B4978; +extern s32 D_801B49A0; +extern s32 D_801B49A4; + +void func_8013CB20(void) +{ + D_801B49A0 = D_801B4978; + D_801B49A4 = D_801B4974; + D_801B4978 = 1; + D_801B4974 = 0; +} + + + +extern s32 D_801B49A0; +extern s32 D_801B49A4; +extern s32 D_801B4978; +extern s32 D_801B4974; + +void func_8013CB5C(void) { + D_801B4978 = D_801B49A0; + D_801B4974 = D_801B49A4; +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B5EB0; + extern u8 D_801B5EB1; + extern u8 D_801B5EB2; + extern u8 D_801B5EB3; + extern u8 D_801B5EB4; + extern u8 D_801B5EB5; + extern u8 D_801B5EB6; + extern u8 D_801B5EB7; + extern u8 D_801B5EB8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B5EB0; t1 = D_801B5EB1; t2 = D_801B5EB2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B5EB3; t1 = D_801B5EB4; t2 = D_801B5EB5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B5EB6; t1 = D_801B5EB7; t2 = D_801B5EB8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B4980; +extern s32 D_801B4968; +extern s32 D_801B4984; +extern s32 D_801B4974; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B4980 != 0) { + if (D_801B4980 != 2) { + if (((D_801B4980 < 3) && (D_801B4980 == 1)) && + (D_801B4984 = D_801B4984 + 1, 0x23a < D_801B4984)) { + D_801B4968 = D_801B4980; + D_801B4980 = 2; + } + } else { + D_801B4968 = D_801B4968 + -1; + if (D_801B4968 == 0) { + D_801B4968 = D_801B4980; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B4974 == 0) { + D_801B4980 = D_801B4980 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B4974; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B4974; +} + + + +extern s32 D_801B4980; + +void func_8013D164(void) { + D_801B4980 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B5F92; +extern u8 D_801B6006; +extern u8 D_801B5EBA; +extern u8 D_801B5F74; +extern u8 D_801B5E98; +extern u8 D_801B5EB9; +extern s32 D_801B5F78; + +void func_8013D330(void) { + if ((D_801B5F92 & 0xff) != D_801B6006) { + D_801B5F92 = ((D_801B5F92 & 0xff) < D_801B6006) ? (D_801B5F92 + 1) : (D_801B5F92 - 1); + } + if ((D_801B5EBA & 0xff) != D_801B5F74) { + D_801B5EBA = ((D_801B5EBA & 0xff) < D_801B5F74) ? (D_801B5EBA + 1) : (D_801B5EBA - 1); + } + if ((D_801B5E98 & 0xff) != D_801B5EB9) { + D_801B5E98 = ((D_801B5E98 & 0xff) < D_801B5EB9) ? (D_801B5E98 + 1) : (D_801B5E98 - 1); + } + D_801B5F78 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B4958; +extern void *D_801B495C; +extern void *D_801B4960; +extern s32 D_801B4988; +extern s32 D_801B498C; +extern s32 D_801B4990; +extern s32 D_801B5EEC[]; + +extern u8 D_801862A8[]; +extern u8 D_80186350[]; +extern u8 D_80186200[]; +extern u8 D_801862FC[]; +extern u8 D_8018637C[]; +extern u8 D_80186254[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B4988 = param_2; + D_801B498C = (param_2 >> 2) & 3; + D_801B4990 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B4958 = D_801862A8; + D_801B495C = D_80186350; + D_801B4960 = D_80186200; + } else { + D_801B4958 = D_801862FC; + D_801B495C = D_8018637C; + D_801B4960 = D_80186254; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B4990 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B4988 & 2) != 0) { + D_801B5EEC[0] = 0x140; + D_801B5EEC[3] = 0x80; + if (p[0x37] == 4) { + D_801B5EEC[0] = 0x140; + D_801B5EEC[3] = 0; + } + if (p[0x37] == 0) { + D_801B5EEC[0] = 0x140; + D_801B5EEC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B4960)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B4960; +extern s16 *D_801B4964; +extern s32 D_801B4974; +extern s32 D_801B4994; +extern s32 D_801B4998; +extern s32 D_801B499C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B4964 != 0) { + D_801B4974 = 0; + p = (int *)(param_1 * 12 + (int)D_801B4960); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B4994 != x) { + flag = 1; + if (D_801B4994 < x) { + if (x - D_801B4994 < 5) { + D_801B4994 = x; + } else { + D_801B4994 = D_801B4994 + 4; + } + } else { + if (D_801B4994 - x < 5) { + D_801B4994 = x; + } else { + D_801B4994 = D_801B4994 - 4; + } + } + } + if (D_801B4998 != y) { + flag = 1; + if (D_801B4998 < y) { + if (y - D_801B4998 < 5) { + D_801B4998 = y; + } else { + D_801B4998 = D_801B4998 + 4; + } + } else { + if (D_801B4998 - y < 5) { + D_801B4998 = y; + } else { + D_801B4998 = D_801B4998 - 4; + } + } + } + if (D_801B499C != z) { + flag = 1; + if (D_801B499C < z) { + if (z - D_801B499C < 5) { + D_801B499C = z; + } else { + D_801B499C = D_801B499C + 4; + } + } else { + if (D_801B499C - z < 5) { + D_801B499C = z; + } else { + D_801B499C = D_801B499C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B4974 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018640C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B4964); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B4994); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B4998); + uVar5 = (*(int*)&D_801B499C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018640C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B497C; + +s32 func_8013E054(void) { + return D_801B497C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186E08; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186DE0; +extern s16 D_80186DE2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186E08; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186DE0 = 2; + D_80186DE2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186DE2 = 0; + D_80186DE0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B49B0; + extern void * D_801B49B4; + extern unsigned char D_80186A80; + extern unsigned char D_80186A98; + extern unsigned char D_80186B0C; + extern unsigned char D_80186B14; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B49B0 = &D_80186A80; + D_801B49B4 = &D_80186B0C; + } else { + D_801B49B0 = &D_80186A98; + D_801B49B4 = &D_80186B14; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186E08/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186E08 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186E08)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186DE4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186DE4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186DE4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186DE0; +extern s16 D_80186DE2; +extern unsigned char D_80186DE4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186DE2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186DE0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186DE2; + if (*r < 3) { + *r = *r + 1; + } + D_80186DE0 = (u16)D_80186DE0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186DE4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186DE4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186DE4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_001/nonmatchings/ov_SC05_001_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_002/ov_SC05_002_jr_8012ACE0.c b/src/ov_SC05_002/ov_SC05_002_jr_8012ACE0.c index 57a01b8e9..f441ff16b 100644 --- a/src/ov_SC05_002/ov_SC05_002_jr_8012ACE0.c +++ b/src/ov_SC05_002/ov_SC05_002_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018082C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018082C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180870; -extern u8 D_801808B4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180870; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801808B4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801808F8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80180934[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80180934; - if (((s16)a1) < 0xC00) { - tbl = D_801808F8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180970, D_80180972, D_80180974, D_80180976, D_80180978, D_8018097A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80180972 < ang)) goto outer_else; - if (!(ang < D_80180978)) goto inner_else; - if (ang < D_80180974) { *(s16 *)L = D_80180974; goto done; } - if (D_80180976 < ang) { *(s16 *)L = D_80180976; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180970) { *(s16 *)L = D_80180970; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018097A < ang) { *(s16 *)L = D_8018097A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019EBF0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019EBF0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019EBF0; -extern s8 D_8019EBF4; -extern s8 D_8019EBF5; - -void func_8013C9C4(void * arg0) -{ - D_8019EBF0 = arg0; - D_8019EBF4 = 0; - D_8019EBF5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019EBF0; -extern s8 D_8019EBF4; -extern s8 D_8019EBF5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019EBF0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019EBF5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019EBF4)) * 2) + D_8019EBF0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019EBF5 = (unsigned char) p[1]; - D_8019EBF4 = D_8019EBF4 + 1; - if (D_8019EBF5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019EBF4 = 0; - *base = 0; - } - } - else - { - D_8019EBF5 = c - 1; - } - } - return; -} - - - -extern s32 D_8019EC14; -extern s32 D_8019EC08; -extern s32 D_8019EC0C; -extern s32 D_8019EC18; - -void func_8013CABC(void) { - D_8019EC14 = 1; - D_8019EC08 = 1; - D_8019EC0C = 0; - D_8019EC18 = 1; -} - - - -extern s32 D_8019EC08; -extern s32 D_8019EC0C; -extern s32 D_8019EC10; -extern s32 D_8019EC14; -extern s32 D_8019EC18; - -void func_8013CAE8(void) { - D_8019EC08 = 1; - D_8019EC14 = 0; - D_8019EC0C = 0; - D_8019EC10 = -1; - D_8019EC18 = 0; -} - - - -extern s32 D_8019EC14; -extern s32 D_8019EC18; -extern s32 D_8019EC40; -extern s32 D_8019EC44; - -void func_8013CB20(void) -{ - D_8019EC40 = D_8019EC18; - D_8019EC44 = D_8019EC14; - D_8019EC18 = 1; - D_8019EC14 = 0; -} - - - -extern s32 D_8019EC40; -extern s32 D_8019EC44; -extern s32 D_8019EC18; -extern s32 D_8019EC14; - -void func_8013CB5C(void) { - D_8019EC18 = D_8019EC40; - D_8019EC14 = D_8019EC44; -} - - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019FE68; - extern u8 D_8019FE69; - extern u8 D_8019FE6A; - extern u8 D_8019FE6B; - extern u8 D_8019FE6C; - extern u8 D_8019FE6D; - extern u8 D_8019FE6E; - extern u8 D_8019FE6F; - extern u8 D_8019FE70; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019FE68; t1 = D_8019FE69; t2 = D_8019FE6A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019FE6B; t1 = D_8019FE6C; t2 = D_8019FE6D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019FE6E; t1 = D_8019FE6F; t2 = D_8019FE70; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019EC20; -extern s32 D_8019EC08; -extern s32 D_8019EC24; -extern s32 D_8019EC14; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019EC20 != 0) { - if (D_8019EC20 != 2) { - if (((D_8019EC20 < 3) && (D_8019EC20 == 1)) && - (D_8019EC24 = D_8019EC24 + 1, 0x23a < D_8019EC24)) { - D_8019EC08 = D_8019EC20; - D_8019EC20 = 2; - } - } else { - D_8019EC08 = D_8019EC08 + -1; - if (D_8019EC08 == 0) { - D_8019EC08 = D_8019EC20; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019EC14 == 0) { - D_8019EC20 = D_8019EC20 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019EC14; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019EC14; -} - - - -extern s32 D_8019EC20; - -void func_8013D164(void) { - D_8019EC20 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019FF4A; -extern u8 D_8019FFBE; -extern u8 D_8019FE72; -extern u8 D_8019FF2C; -extern u8 D_8019FE50; -extern u8 D_8019FE71; -extern s32 D_8019FF30; - -void func_8013D330(void) { - if ((D_8019FF4A & 0xff) != D_8019FFBE) { - D_8019FF4A = ((D_8019FF4A & 0xff) < D_8019FFBE) ? (D_8019FF4A + 1) : (D_8019FF4A - 1); - } - if ((D_8019FE72 & 0xff) != D_8019FF2C) { - D_8019FE72 = ((D_8019FE72 & 0xff) < D_8019FF2C) ? (D_8019FE72 + 1) : (D_8019FE72 - 1); - } - if ((D_8019FE50 & 0xff) != D_8019FE71) { - D_8019FE50 = ((D_8019FE50 & 0xff) < D_8019FE71) ? (D_8019FE50 + 1) : (D_8019FE50 - 1); - } - D_8019FF30 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019EBF8; -extern void *D_8019EBFC; -extern void *D_8019EC00; -extern s32 D_8019EC28; -extern s32 D_8019EC2C; -extern s32 D_8019EC30; -extern s32 D_8019FEA4[]; - -extern u8 D_80180A68[]; -extern u8 D_80180B10[]; -extern u8 D_801809C0[]; -extern u8 D_80180ABC[]; -extern u8 D_80180B3C[]; -extern u8 D_80180A14[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019EC28 = param_2; - D_8019EC2C = (param_2 >> 2) & 3; - D_8019EC30 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019EBF8 = D_80180A68; - D_8019EBFC = D_80180B10; - D_8019EC00 = D_801809C0; - } else { - D_8019EBF8 = D_80180ABC; - D_8019EBFC = D_80180B3C; - D_8019EC00 = D_80180A14; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019EC30 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019EC28 & 2) != 0) { - D_8019FEA4[0] = 0x140; - D_8019FEA4[3] = 0x80; - if (p[0x37] == 4) { - D_8019FEA4[0] = 0x140; - D_8019FEA4[3] = 0; - } - if (p[0x37] == 0) { - D_8019FEA4[0] = 0x140; - D_8019FEA4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019EC00)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019EC00; -extern s16 *D_8019EC04; -extern s32 D_8019EC14; -extern s32 D_8019EC34; -extern s32 D_8019EC38; -extern s32 D_8019EC3C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019EC04 != 0) { - D_8019EC14 = 0; - p = (int *)(param_1 * 12 + (int)D_8019EC00); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019EC34 != x) { - flag = 1; - if (D_8019EC34 < x) { - if (x - D_8019EC34 < 5) { - D_8019EC34 = x; - } else { - D_8019EC34 = D_8019EC34 + 4; - } - } else { - if (D_8019EC34 - x < 5) { - D_8019EC34 = x; - } else { - D_8019EC34 = D_8019EC34 - 4; - } - } - } - if (D_8019EC38 != y) { - flag = 1; - if (D_8019EC38 < y) { - if (y - D_8019EC38 < 5) { - D_8019EC38 = y; - } else { - D_8019EC38 = D_8019EC38 + 4; - } - } else { - if (D_8019EC38 - y < 5) { - D_8019EC38 = y; - } else { - D_8019EC38 = D_8019EC38 - 4; - } - } - } - if (D_8019EC3C != z) { - flag = 1; - if (D_8019EC3C < z) { - if (z - D_8019EC3C < 5) { - D_8019EC3C = z; - } else { - D_8019EC3C = D_8019EC3C + 4; - } - } else { - if (D_8019EC3C - z < 5) { - D_8019EC3C = z; - } else { - D_8019EC3C = D_8019EC3C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019EC14 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80180BCC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019EC04); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019EC34); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019EC38); - uVar5 = (*(int*)&D_8019EC3C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80180BCC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019EC1C; - -s32 func_8013E054(void) { - return D_8019EC1C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801815C8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801815A0; -extern s16 D_801815A2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801815C8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801815A0 = 2; - D_801815A2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801815A2 = 0; - D_801815A0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019EC50; - extern void * D_8019EC54; - extern unsigned char D_80181240; - extern unsigned char D_80181258; - extern unsigned char D_801812CC; - extern unsigned char D_801812D4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019EC50 = &D_80181240; - D_8019EC54 = &D_801812CC; - } else { - D_8019EC50 = &D_80181258; - D_8019EC54 = &D_801812D4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801815C8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801815C8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801815C8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801815A4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801815A4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801815A4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801815A0; -extern s16 D_801815A2; -extern unsigned char D_801815A4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801815A2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801815A0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801815A2; - if (*r < 3) { - *r = *r + 1; - } - D_801815A0 = (u16)D_801815A0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801815A4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801815A4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801815A4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_002/ov_SC05_002_jr_801380E0.c b/src/ov_SC05_002/ov_SC05_002_jr_801380E0.c new file mode 100644 index 000000000..fb9b8a7e1 --- /dev/null +++ b/src/ov_SC05_002/ov_SC05_002_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019D9A8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801804C0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019EB0C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019FF50; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019D9A8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801801FC)(); +extern s16 (*D_80180200)(); +extern M2C_UNK (*D_80180208)(); +extern s32 (*D_8018020C)(); +extern s32 D_8019EB08; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019D9AC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80180554; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80183A38; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018056C; +extern M2C_UNK D_80180574; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018057C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80180598[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801805A4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801805B8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180608[]; +extern s16 D_80180638[]; +extern s16 D_80180698[]; +extern s16 D_801806A0[]; +extern s16 D_801806C0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801806F8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180750[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80180798[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801807A0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801807A8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801807B0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180758; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80180778; +extern void func_801321B0(int param_1); +extern int D_80180788; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019EB78; +extern s32 D_8019EB7C[]; +extern int D_8019EB80; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801807BC; +extern u8 D_801807B8; +extern s16 *D_801807C0; +extern u8 D_801807C4; +extern int D_8019EB78; +extern u16 D_8019EB88; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801807C0; /* holds a pointer value (*(u16**)&D_801807C0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801807D4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80180828; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018082C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018082C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180870; +extern u8 D_801808B4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180870; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801808B4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801808F8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80180934[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80180934; + if (((s16)a1) < 0xC00) { + tbl = D_801808F8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180970, D_80180972, D_80180974, D_80180976, D_80180978, D_8018097A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180972 < ang)) goto outer_else; + if (!(ang < D_80180978)) goto inner_else; + if (ang < D_80180974) { *(s16 *)L = D_80180974; goto done; } + if (D_80180976 < ang) { *(s16 *)L = D_80180976; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180970) { *(s16 *)L = D_80180970; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018097A < ang) { *(s16 *)L = D_8018097A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019EBF0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019EBF0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019EBF0; +extern s8 D_8019EBF4; +extern s8 D_8019EBF5; + +void func_8013C9C4(void * arg0) +{ + D_8019EBF0 = arg0; + D_8019EBF4 = 0; + D_8019EBF5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019EBF0; +extern s8 D_8019EBF4; +extern s8 D_8019EBF5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019EBF0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019EBF5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019EBF4)) * 2) + D_8019EBF0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019EBF5 = (unsigned char) p[1]; + D_8019EBF4 = D_8019EBF4 + 1; + if (D_8019EBF5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019EBF4 = 0; + *base = 0; + } + } + else + { + D_8019EBF5 = c - 1; + } + } + return; +} + + + +extern s32 D_8019EC14; +extern s32 D_8019EC08; +extern s32 D_8019EC0C; +extern s32 D_8019EC18; + +void func_8013CABC(void) { + D_8019EC14 = 1; + D_8019EC08 = 1; + D_8019EC0C = 0; + D_8019EC18 = 1; +} + + + +extern s32 D_8019EC08; +extern s32 D_8019EC0C; +extern s32 D_8019EC10; +extern s32 D_8019EC14; +extern s32 D_8019EC18; + +void func_8013CAE8(void) { + D_8019EC08 = 1; + D_8019EC14 = 0; + D_8019EC0C = 0; + D_8019EC10 = -1; + D_8019EC18 = 0; +} + + + +extern s32 D_8019EC14; +extern s32 D_8019EC18; +extern s32 D_8019EC40; +extern s32 D_8019EC44; + +void func_8013CB20(void) +{ + D_8019EC40 = D_8019EC18; + D_8019EC44 = D_8019EC14; + D_8019EC18 = 1; + D_8019EC14 = 0; +} + + + +extern s32 D_8019EC40; +extern s32 D_8019EC44; +extern s32 D_8019EC18; +extern s32 D_8019EC14; + +void func_8013CB5C(void) { + D_8019EC18 = D_8019EC40; + D_8019EC14 = D_8019EC44; +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019FE68; + extern u8 D_8019FE69; + extern u8 D_8019FE6A; + extern u8 D_8019FE6B; + extern u8 D_8019FE6C; + extern u8 D_8019FE6D; + extern u8 D_8019FE6E; + extern u8 D_8019FE6F; + extern u8 D_8019FE70; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019FE68; t1 = D_8019FE69; t2 = D_8019FE6A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019FE6B; t1 = D_8019FE6C; t2 = D_8019FE6D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019FE6E; t1 = D_8019FE6F; t2 = D_8019FE70; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019EC20; +extern s32 D_8019EC08; +extern s32 D_8019EC24; +extern s32 D_8019EC14; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019EC20 != 0) { + if (D_8019EC20 != 2) { + if (((D_8019EC20 < 3) && (D_8019EC20 == 1)) && + (D_8019EC24 = D_8019EC24 + 1, 0x23a < D_8019EC24)) { + D_8019EC08 = D_8019EC20; + D_8019EC20 = 2; + } + } else { + D_8019EC08 = D_8019EC08 + -1; + if (D_8019EC08 == 0) { + D_8019EC08 = D_8019EC20; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019EC14 == 0) { + D_8019EC20 = D_8019EC20 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019EC14; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019EC14; +} + + + +extern s32 D_8019EC20; + +void func_8013D164(void) { + D_8019EC20 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019FF4A; +extern u8 D_8019FFBE; +extern u8 D_8019FE72; +extern u8 D_8019FF2C; +extern u8 D_8019FE50; +extern u8 D_8019FE71; +extern s32 D_8019FF30; + +void func_8013D330(void) { + if ((D_8019FF4A & 0xff) != D_8019FFBE) { + D_8019FF4A = ((D_8019FF4A & 0xff) < D_8019FFBE) ? (D_8019FF4A + 1) : (D_8019FF4A - 1); + } + if ((D_8019FE72 & 0xff) != D_8019FF2C) { + D_8019FE72 = ((D_8019FE72 & 0xff) < D_8019FF2C) ? (D_8019FE72 + 1) : (D_8019FE72 - 1); + } + if ((D_8019FE50 & 0xff) != D_8019FE71) { + D_8019FE50 = ((D_8019FE50 & 0xff) < D_8019FE71) ? (D_8019FE50 + 1) : (D_8019FE50 - 1); + } + D_8019FF30 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019EBF8; +extern void *D_8019EBFC; +extern void *D_8019EC00; +extern s32 D_8019EC28; +extern s32 D_8019EC2C; +extern s32 D_8019EC30; +extern s32 D_8019FEA4[]; + +extern u8 D_80180A68[]; +extern u8 D_80180B10[]; +extern u8 D_801809C0[]; +extern u8 D_80180ABC[]; +extern u8 D_80180B3C[]; +extern u8 D_80180A14[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019EC28 = param_2; + D_8019EC2C = (param_2 >> 2) & 3; + D_8019EC30 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019EBF8 = D_80180A68; + D_8019EBFC = D_80180B10; + D_8019EC00 = D_801809C0; + } else { + D_8019EBF8 = D_80180ABC; + D_8019EBFC = D_80180B3C; + D_8019EC00 = D_80180A14; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019EC30 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019EC28 & 2) != 0) { + D_8019FEA4[0] = 0x140; + D_8019FEA4[3] = 0x80; + if (p[0x37] == 4) { + D_8019FEA4[0] = 0x140; + D_8019FEA4[3] = 0; + } + if (p[0x37] == 0) { + D_8019FEA4[0] = 0x140; + D_8019FEA4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019EC00)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019EC00; +extern s16 *D_8019EC04; +extern s32 D_8019EC14; +extern s32 D_8019EC34; +extern s32 D_8019EC38; +extern s32 D_8019EC3C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019EC04 != 0) { + D_8019EC14 = 0; + p = (int *)(param_1 * 12 + (int)D_8019EC00); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019EC34 != x) { + flag = 1; + if (D_8019EC34 < x) { + if (x - D_8019EC34 < 5) { + D_8019EC34 = x; + } else { + D_8019EC34 = D_8019EC34 + 4; + } + } else { + if (D_8019EC34 - x < 5) { + D_8019EC34 = x; + } else { + D_8019EC34 = D_8019EC34 - 4; + } + } + } + if (D_8019EC38 != y) { + flag = 1; + if (D_8019EC38 < y) { + if (y - D_8019EC38 < 5) { + D_8019EC38 = y; + } else { + D_8019EC38 = D_8019EC38 + 4; + } + } else { + if (D_8019EC38 - y < 5) { + D_8019EC38 = y; + } else { + D_8019EC38 = D_8019EC38 - 4; + } + } + } + if (D_8019EC3C != z) { + flag = 1; + if (D_8019EC3C < z) { + if (z - D_8019EC3C < 5) { + D_8019EC3C = z; + } else { + D_8019EC3C = D_8019EC3C + 4; + } + } else { + if (D_8019EC3C - z < 5) { + D_8019EC3C = z; + } else { + D_8019EC3C = D_8019EC3C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019EC14 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80180BCC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019EC04); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019EC34); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019EC38); + uVar5 = (*(int*)&D_8019EC3C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80180BCC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019EC1C; + +s32 func_8013E054(void) { + return D_8019EC1C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801815C8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801815A0; +extern s16 D_801815A2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801815C8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801815A0 = 2; + D_801815A2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801815A2 = 0; + D_801815A0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019EC50; + extern void * D_8019EC54; + extern unsigned char D_80181240; + extern unsigned char D_80181258; + extern unsigned char D_801812CC; + extern unsigned char D_801812D4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019EC50 = &D_80181240; + D_8019EC54 = &D_801812CC; + } else { + D_8019EC50 = &D_80181258; + D_8019EC54 = &D_801812D4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801815C8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801815C8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801815C8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801815A4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801815A4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801815A4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801815A0; +extern s16 D_801815A2; +extern unsigned char D_801815A4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801815A2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801815A0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801815A2; + if (*r < 3) { + *r = *r + 1; + } + D_801815A0 = (u16)D_801815A0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801815A4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801815A4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801815A4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_002/nonmatchings/ov_SC05_002_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_003/ov_SC05_003_jr_8012ACE0.c b/src/ov_SC05_003/ov_SC05_003_jr_8012ACE0.c index 45df5e430..a44512627 100644 --- a/src/ov_SC05_003/ov_SC05_003_jr_8012ACE0.c +++ b/src/ov_SC05_003/ov_SC05_003_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182B64[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182B64[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182BA8; -extern u8 D_80182BEC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182BA8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182BEC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182C30[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182C6C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182C6C; - if (((s16)a1) < 0xC00) { - tbl = D_80182C30; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182CA8, D_80182CAA, D_80182CAC, D_80182CAE, D_80182CB0, D_80182CB2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182CAA < ang)) goto outer_else; - if (!(ang < D_80182CB0)) goto inner_else; - if (ang < D_80182CAC) { *(s16 *)L = D_80182CAC; goto done; } - if (D_80182CAE < ang) { *(s16 *)L = D_80182CAE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182CA8) { *(s16 *)L = D_80182CA8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80182CB2 < ang) { *(s16 *)L = D_80182CB2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801AB700; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801AB700, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801AB700; -extern s8 D_801AB704; -extern s8 D_801AB705; - -void func_8013C9C4(void * arg0) -{ - D_801AB700 = arg0; - D_801AB704 = 0; - D_801AB705 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801AB700; -extern s8 D_801AB704; -extern s8 D_801AB705; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801AB700; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801AB705; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801AB704)) * 2) + D_801AB700); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801AB705 = (unsigned char) p[1]; - D_801AB704 = D_801AB704 + 1; - if (D_801AB705 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801AB704 = 0; - *base = 0; - } - } - else - { - D_801AB705 = c - 1; - } - } - return; -} - - - -extern s32 D_801AB724; -extern s32 D_801AB718; -extern s32 D_801AB71C; -extern s32 D_801AB728; - -void func_8013CABC(void) { - D_801AB724 = 1; - D_801AB718 = 1; - D_801AB71C = 0; - D_801AB728 = 1; -} - - - -extern s32 D_801AB718; -extern s32 D_801AB71C; -extern s32 D_801AB720; -extern s32 D_801AB724; -extern s32 D_801AB728; - -void func_8013CAE8(void) { - D_801AB718 = 1; - D_801AB724 = 0; - D_801AB71C = 0; - D_801AB720 = -1; - D_801AB728 = 0; -} - - - -extern s32 D_801AB724; -extern s32 D_801AB728; -extern s32 D_801AB750; -extern s32 D_801AB754; - -void func_8013CB20(void) -{ - D_801AB750 = D_801AB728; - D_801AB754 = D_801AB724; - D_801AB728 = 1; - D_801AB724 = 0; -} - - - -extern s32 D_801AB750; -extern s32 D_801AB754; -extern s32 D_801AB728; -extern s32 D_801AB724; - -void func_8013CB5C(void) { - D_801AB728 = D_801AB750; - D_801AB724 = D_801AB754; -} - - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AC978; - extern u8 D_801AC979; - extern u8 D_801AC97A; - extern u8 D_801AC97B; - extern u8 D_801AC97C; - extern u8 D_801AC97D; - extern u8 D_801AC97E; - extern u8 D_801AC97F; - extern u8 D_801AC980; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AC978; t1 = D_801AC979; t2 = D_801AC97A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AC97B; t1 = D_801AC97C; t2 = D_801AC97D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AC97E; t1 = D_801AC97F; t2 = D_801AC980; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801AB730; -extern s32 D_801AB718; -extern s32 D_801AB734; -extern s32 D_801AB724; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801AB730 != 0) { - if (D_801AB730 != 2) { - if (((D_801AB730 < 3) && (D_801AB730 == 1)) && - (D_801AB734 = D_801AB734 + 1, 0x23a < D_801AB734)) { - D_801AB718 = D_801AB730; - D_801AB730 = 2; - } - } else { - D_801AB718 = D_801AB718 + -1; - if (D_801AB718 == 0) { - D_801AB718 = D_801AB730; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801AB724 == 0) { - D_801AB730 = D_801AB730 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801AB724; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801AB724; -} - - - -extern s32 D_801AB730; - -void func_8013D164(void) { - D_801AB730 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801ACA5A; -extern u8 D_801ACACE; -extern u8 D_801AC982; -extern u8 D_801ACA3C; -extern u8 D_801AC960; -extern u8 D_801AC981; -extern s32 D_801ACA40; - -void func_8013D330(void) { - if ((D_801ACA5A & 0xff) != D_801ACACE) { - D_801ACA5A = ((D_801ACA5A & 0xff) < D_801ACACE) ? (D_801ACA5A + 1) : (D_801ACA5A - 1); - } - if ((D_801AC982 & 0xff) != D_801ACA3C) { - D_801AC982 = ((D_801AC982 & 0xff) < D_801ACA3C) ? (D_801AC982 + 1) : (D_801AC982 - 1); - } - if ((D_801AC960 & 0xff) != D_801AC981) { - D_801AC960 = ((D_801AC960 & 0xff) < D_801AC981) ? (D_801AC960 + 1) : (D_801AC960 - 1); - } - D_801ACA40 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801AB708; -extern void *D_801AB70C; -extern void *D_801AB710; -extern s32 D_801AB738; -extern s32 D_801AB73C; -extern s32 D_801AB740; -extern s32 D_801AC9B4[]; - -extern u8 D_80182DA0[]; -extern u8 D_80182E48[]; -extern u8 D_80182CF8[]; -extern u8 D_80182DF4[]; -extern u8 D_80182E74[]; -extern u8 D_80182D4C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801AB738 = param_2; - D_801AB73C = (param_2 >> 2) & 3; - D_801AB740 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801AB708 = D_80182DA0; - D_801AB70C = D_80182E48; - D_801AB710 = D_80182CF8; - } else { - D_801AB708 = D_80182DF4; - D_801AB70C = D_80182E74; - D_801AB710 = D_80182D4C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801AB740 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801AB738 & 2) != 0) { - D_801AC9B4[0] = 0x140; - D_801AC9B4[3] = 0x80; - if (p[0x37] == 4) { - D_801AC9B4[0] = 0x140; - D_801AC9B4[3] = 0; - } - if (p[0x37] == 0) { - D_801AC9B4[0] = 0x140; - D_801AC9B4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801AB710)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801AB710; -extern s16 *D_801AB714; -extern s32 D_801AB724; -extern s32 D_801AB744; -extern s32 D_801AB748; -extern s32 D_801AB74C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801AB714 != 0) { - D_801AB724 = 0; - p = (int *)(param_1 * 12 + (int)D_801AB710); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801AB744 != x) { - flag = 1; - if (D_801AB744 < x) { - if (x - D_801AB744 < 5) { - D_801AB744 = x; - } else { - D_801AB744 = D_801AB744 + 4; - } - } else { - if (D_801AB744 - x < 5) { - D_801AB744 = x; - } else { - D_801AB744 = D_801AB744 - 4; - } - } - } - if (D_801AB748 != y) { - flag = 1; - if (D_801AB748 < y) { - if (y - D_801AB748 < 5) { - D_801AB748 = y; - } else { - D_801AB748 = D_801AB748 + 4; - } - } else { - if (D_801AB748 - y < 5) { - D_801AB748 = y; - } else { - D_801AB748 = D_801AB748 - 4; - } - } - } - if (D_801AB74C != z) { - flag = 1; - if (D_801AB74C < z) { - if (z - D_801AB74C < 5) { - D_801AB74C = z; - } else { - D_801AB74C = D_801AB74C + 4; - } - } else { - if (D_801AB74C - z < 5) { - D_801AB74C = z; - } else { - D_801AB74C = D_801AB74C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801AB724 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182F04[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801AB714); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AB744); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AB748); - uVar5 = (*(int*)&D_801AB74C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182F04); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801AB72C; - -s32 func_8013E054(void) { - return D_801AB72C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183900; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801838D8; -extern s16 D_801838DA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183900; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801838D8 = 2; - D_801838DA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801838DA = 0; - D_801838D8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801AB760; - extern void * D_801AB764; - extern unsigned char D_80183578; - extern unsigned char D_80183590; - extern unsigned char D_80183604; - extern unsigned char D_8018360C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801AB760 = &D_80183578; - D_801AB764 = &D_80183604; - } else { - D_801AB760 = &D_80183590; - D_801AB764 = &D_8018360C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183900/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183900 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183900)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801838DC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801838DC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801838DC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801838D8; -extern s16 D_801838DA; -extern unsigned char D_801838DC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801838DA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801838D8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801838DA; - if (*r < 3) { - *r = *r + 1; - } - D_801838D8 = (u16)D_801838D8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801838DC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801838DC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801838DC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_003/ov_SC05_003_jr_801380E0.c b/src/ov_SC05_003/ov_SC05_003_jr_801380E0.c new file mode 100644 index 000000000..1d76a0688 --- /dev/null +++ b/src/ov_SC05_003/ov_SC05_003_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AA4A4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801827F8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801AB61C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801ACA60; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AA4A4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182534)(); +extern s16 (*D_80182538)(); +extern M2C_UNK (*D_80182540)(); +extern s32 (*D_80182544)(); +extern s32 D_801AB618; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AA4A8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018288C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185D70; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801828A4; +extern M2C_UNK D_801828AC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801828B4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801828D0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801828DC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801828F0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182940[]; +extern s16 D_80182970[]; +extern s16 D_801829D0[]; +extern s16 D_801829D8[]; +extern s16 D_801829F8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182A30[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182A88[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182AD0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182AD8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182AE0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182AE8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182A90; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182AB0; +extern void func_801321B0(int param_1); +extern int D_80182AC0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801AB688; +extern s32 D_801AB68C[]; +extern int D_801AB690; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182AF4; +extern u8 D_80182AF0; +extern s16 *D_80182AF8; +extern u8 D_80182AFC; +extern int D_801AB688; +extern u16 D_801AB698; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182AF8; /* holds a pointer value (*(u16**)&D_80182AF8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182B0C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182B60; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182B64[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182B64[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182BA8; +extern u8 D_80182BEC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182BA8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182BEC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182C30[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182C6C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182C6C; + if (((s16)a1) < 0xC00) { + tbl = D_80182C30; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182CA8, D_80182CAA, D_80182CAC, D_80182CAE, D_80182CB0, D_80182CB2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182CAA < ang)) goto outer_else; + if (!(ang < D_80182CB0)) goto inner_else; + if (ang < D_80182CAC) { *(s16 *)L = D_80182CAC; goto done; } + if (D_80182CAE < ang) { *(s16 *)L = D_80182CAE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182CA8) { *(s16 *)L = D_80182CA8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182CB2 < ang) { *(s16 *)L = D_80182CB2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801AB700; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801AB700, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801AB700; +extern s8 D_801AB704; +extern s8 D_801AB705; + +void func_8013C9C4(void * arg0) +{ + D_801AB700 = arg0; + D_801AB704 = 0; + D_801AB705 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801AB700; +extern s8 D_801AB704; +extern s8 D_801AB705; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801AB700; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801AB705; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801AB704)) * 2) + D_801AB700); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801AB705 = (unsigned char) p[1]; + D_801AB704 = D_801AB704 + 1; + if (D_801AB705 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801AB704 = 0; + *base = 0; + } + } + else + { + D_801AB705 = c - 1; + } + } + return; +} + + + +extern s32 D_801AB724; +extern s32 D_801AB718; +extern s32 D_801AB71C; +extern s32 D_801AB728; + +void func_8013CABC(void) { + D_801AB724 = 1; + D_801AB718 = 1; + D_801AB71C = 0; + D_801AB728 = 1; +} + + + +extern s32 D_801AB718; +extern s32 D_801AB71C; +extern s32 D_801AB720; +extern s32 D_801AB724; +extern s32 D_801AB728; + +void func_8013CAE8(void) { + D_801AB718 = 1; + D_801AB724 = 0; + D_801AB71C = 0; + D_801AB720 = -1; + D_801AB728 = 0; +} + + + +extern s32 D_801AB724; +extern s32 D_801AB728; +extern s32 D_801AB750; +extern s32 D_801AB754; + +void func_8013CB20(void) +{ + D_801AB750 = D_801AB728; + D_801AB754 = D_801AB724; + D_801AB728 = 1; + D_801AB724 = 0; +} + + + +extern s32 D_801AB750; +extern s32 D_801AB754; +extern s32 D_801AB728; +extern s32 D_801AB724; + +void func_8013CB5C(void) { + D_801AB728 = D_801AB750; + D_801AB724 = D_801AB754; +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AC978; + extern u8 D_801AC979; + extern u8 D_801AC97A; + extern u8 D_801AC97B; + extern u8 D_801AC97C; + extern u8 D_801AC97D; + extern u8 D_801AC97E; + extern u8 D_801AC97F; + extern u8 D_801AC980; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AC978; t1 = D_801AC979; t2 = D_801AC97A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AC97B; t1 = D_801AC97C; t2 = D_801AC97D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AC97E; t1 = D_801AC97F; t2 = D_801AC980; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801AB730; +extern s32 D_801AB718; +extern s32 D_801AB734; +extern s32 D_801AB724; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801AB730 != 0) { + if (D_801AB730 != 2) { + if (((D_801AB730 < 3) && (D_801AB730 == 1)) && + (D_801AB734 = D_801AB734 + 1, 0x23a < D_801AB734)) { + D_801AB718 = D_801AB730; + D_801AB730 = 2; + } + } else { + D_801AB718 = D_801AB718 + -1; + if (D_801AB718 == 0) { + D_801AB718 = D_801AB730; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801AB724 == 0) { + D_801AB730 = D_801AB730 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801AB724; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801AB724; +} + + + +extern s32 D_801AB730; + +void func_8013D164(void) { + D_801AB730 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801ACA5A; +extern u8 D_801ACACE; +extern u8 D_801AC982; +extern u8 D_801ACA3C; +extern u8 D_801AC960; +extern u8 D_801AC981; +extern s32 D_801ACA40; + +void func_8013D330(void) { + if ((D_801ACA5A & 0xff) != D_801ACACE) { + D_801ACA5A = ((D_801ACA5A & 0xff) < D_801ACACE) ? (D_801ACA5A + 1) : (D_801ACA5A - 1); + } + if ((D_801AC982 & 0xff) != D_801ACA3C) { + D_801AC982 = ((D_801AC982 & 0xff) < D_801ACA3C) ? (D_801AC982 + 1) : (D_801AC982 - 1); + } + if ((D_801AC960 & 0xff) != D_801AC981) { + D_801AC960 = ((D_801AC960 & 0xff) < D_801AC981) ? (D_801AC960 + 1) : (D_801AC960 - 1); + } + D_801ACA40 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801AB708; +extern void *D_801AB70C; +extern void *D_801AB710; +extern s32 D_801AB738; +extern s32 D_801AB73C; +extern s32 D_801AB740; +extern s32 D_801AC9B4[]; + +extern u8 D_80182DA0[]; +extern u8 D_80182E48[]; +extern u8 D_80182CF8[]; +extern u8 D_80182DF4[]; +extern u8 D_80182E74[]; +extern u8 D_80182D4C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801AB738 = param_2; + D_801AB73C = (param_2 >> 2) & 3; + D_801AB740 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801AB708 = D_80182DA0; + D_801AB70C = D_80182E48; + D_801AB710 = D_80182CF8; + } else { + D_801AB708 = D_80182DF4; + D_801AB70C = D_80182E74; + D_801AB710 = D_80182D4C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801AB740 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801AB738 & 2) != 0) { + D_801AC9B4[0] = 0x140; + D_801AC9B4[3] = 0x80; + if (p[0x37] == 4) { + D_801AC9B4[0] = 0x140; + D_801AC9B4[3] = 0; + } + if (p[0x37] == 0) { + D_801AC9B4[0] = 0x140; + D_801AC9B4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801AB710)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801AB710; +extern s16 *D_801AB714; +extern s32 D_801AB724; +extern s32 D_801AB744; +extern s32 D_801AB748; +extern s32 D_801AB74C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801AB714 != 0) { + D_801AB724 = 0; + p = (int *)(param_1 * 12 + (int)D_801AB710); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801AB744 != x) { + flag = 1; + if (D_801AB744 < x) { + if (x - D_801AB744 < 5) { + D_801AB744 = x; + } else { + D_801AB744 = D_801AB744 + 4; + } + } else { + if (D_801AB744 - x < 5) { + D_801AB744 = x; + } else { + D_801AB744 = D_801AB744 - 4; + } + } + } + if (D_801AB748 != y) { + flag = 1; + if (D_801AB748 < y) { + if (y - D_801AB748 < 5) { + D_801AB748 = y; + } else { + D_801AB748 = D_801AB748 + 4; + } + } else { + if (D_801AB748 - y < 5) { + D_801AB748 = y; + } else { + D_801AB748 = D_801AB748 - 4; + } + } + } + if (D_801AB74C != z) { + flag = 1; + if (D_801AB74C < z) { + if (z - D_801AB74C < 5) { + D_801AB74C = z; + } else { + D_801AB74C = D_801AB74C + 4; + } + } else { + if (D_801AB74C - z < 5) { + D_801AB74C = z; + } else { + D_801AB74C = D_801AB74C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801AB724 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182F04[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801AB714); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AB744); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AB748); + uVar5 = (*(int*)&D_801AB74C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182F04); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801AB72C; + +s32 func_8013E054(void) { + return D_801AB72C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183900; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801838D8; +extern s16 D_801838DA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183900; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801838D8 = 2; + D_801838DA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801838DA = 0; + D_801838D8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801AB760; + extern void * D_801AB764; + extern unsigned char D_80183578; + extern unsigned char D_80183590; + extern unsigned char D_80183604; + extern unsigned char D_8018360C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801AB760 = &D_80183578; + D_801AB764 = &D_80183604; + } else { + D_801AB760 = &D_80183590; + D_801AB764 = &D_8018360C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183900/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183900 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183900)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801838DC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801838DC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801838DC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801838D8; +extern s16 D_801838DA; +extern unsigned char D_801838DC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801838DA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801838D8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801838DA; + if (*r < 3) { + *r = *r + 1; + } + D_801838D8 = (u16)D_801838D8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801838DC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801838DC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801838DC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_003/nonmatchings/ov_SC05_003_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_004/ov_SC05_004.c b/src/ov_SC05_004/ov_SC05_004.c index f44acd671..d00c102cc 100644 --- a/src/ov_SC05_004/ov_SC05_004.c +++ b/src/ov_SC05_004/ov_SC05_004.c @@ -521,4843 +521,3 @@ void func_8012ACA0(void *arg0) { M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); func_8012AAAC(); } - - - - -// @class: iv-combine -// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). -typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ -typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ - -s32 func_8012ACE0(void *o) { - int i; - for (i = 0; ; i++) { - switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { - case -2: - case -1: - case 0: - return i; - case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ - default: - break; - } - } -} - -DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ - -DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ - - - -void func_8012AD64(s32 *a0, s16 a1) { - *(s16*)((s32)a0 + 0x34) = a1; -} - - -DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ - -DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ - -DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ - -DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ - -DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ - -DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ - -DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ - -DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ - -DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ - -DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ - -DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ - -DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ - -DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ - -DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ - -DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ - -DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ - -DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012B4B8); - -DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ - -DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ - -DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ - -DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012B77C); - -DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ - -DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ - -DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ - -DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ - -DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ - -DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ - -DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ - -DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ - -DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ - -DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ - -DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ - -DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ - -DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ - -DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ - - -void func_8012BF4C(s32 *a0, s32 a1) { - *(s32*)((s32)a0 + 0x1C) = a1; -} - - -DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ - -DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ - -DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ - -DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ - -DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012C098); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012C0EC); - -DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ - -DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ - -DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ - -DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ - -DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ - -DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ - -DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ - -DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ - -DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ - -DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ - -DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012C658); - -DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012C750); - -DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to -// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS -// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via -// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store -// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. -// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). - -extern s32 D_80184E7C; -extern s16 D_801270C4; -extern u16 D_801274E4[]; -extern s32 D_8011DB08; -extern void func_80016714(void *a0, s32 a1); - -s32 func_8012C890(s32 a0, s32 a1, s32 a2) { - u8 *src = (u8 *)a0; - u8 *dst = (u8 *)a1; - u16 *d; - s16 count; - u16 v2, v4; - s32 v10; - void *obj; - - *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); - v2 = *(u16 *)(src + 0x0); - *(u16 *)(dst + 0x6) = v2; - *(u16 *)(dst + 0x88) = v2; - v2 = *(u16 *)(src + 0x2); - *(u16 *)(dst + 0xA) = v2; - *(u16 *)(dst + 0x8A) = v2; - v4 = *(u16 *)(src + 0x4); - *(u16 *)(dst + 0xC) = 0; - *(u16 *)(dst + 0x8) = 0; - *(u16 *)(dst + 0x4) = 0; - *(u16 *)(dst + 0xE) = v4; - *(u16 *)(dst + 0x8C) = v4; - *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); - *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; - *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); - v10 = *(s32 *)(src + 0x10); - *(s32 *)(dst + 0x78) = (s32)&D_80184E7C; - *(s32 *)(dst + 0xDC) = v10; - - { - register u16 *pc __asm__("$3"); - pc = &(*(u16 *)&D_801270C4); - *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; - count = *(volatile u16 *)pc + 1; - *pc = count; - if (count == 0) { - *pc = 1; - } - } - - if (a2 != 0) { - *(s32 *)(dst + 0x64) = a2; - *(s32 *)(dst + 0x68) = 0; - } else { - *(s32 *)(dst + 0x64) = 0; - *(s32 *)(dst + 0x68) = (s32)src; - } - - *(u16 *)(src + 0xA) |= 0x8000; - *(u16 *)(dst + 0x2) = 0; - d = D_801274E4; - *d &= 0xFFFE; - (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); - - if (*d & 1) { - s32 a1v; - obj = *(void **)(dst + 0x20); - if (obj != 0) { - s32 t = *(u16 *)obj; - if (t != 1) { - if (t != 2) { - goto done; - } - a1v = 0x38; - } else { - a1v = 0x84; - } - func_80016714(obj, a1v); - done:; - } - func_80016714(dst, 0x10C); - *(u16 *)(src + 0xA) &= 0x7FFF; - return 0; - } - - if (*(s32 *)(dst + 0x64) == 0) { - void *o = *(void **)(dst + 0x20); - if (o == 0) { - return (s32)dst; - } - if (*(u16 *)o == 1) { - s16 c = *(s16 *)(src + 0xC); - if (c != 0x7FFF) { - *(s16 *)((u8 *)o + 0x12) = c; - } - } - } - if (*(s32 *)(dst + 0x20) != 0) { - *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); - } - return (s32)dst; -} - - -DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ - -DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ - -DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ - -DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ - -DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ - -DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ - -DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ - -DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012CC88); - -DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ - -DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ - -DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ - -DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ - -DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ - -DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ - -DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ - -DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ - -DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ - -DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ - -DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH - - -struct S8012D664_8012D664 { short a, b, c; }; - -int func_8012D664(int arg0, int arg1, int arg2) { - extern int func_8012F568(); - extern int D_801819A8; - - struct S8012D664_8012D664 s; - int ret; - int t; - - s.a = (*(unsigned short*)&D_80126B5E); - s.b = (*(unsigned short*)&D_80126B62) - 0x40; - s.c = (*(unsigned short*)&D_80126B66); - ret = ((int(*)())func_800132BC)(arg0, &s); - t = arg1 + 0x20; - if (ret < t * t) { - func_8012F568(1, 1, 0, arg2, arg0, &D_801819A8); - return 1; - } - return 0; -} - - - -DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ - - - -extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -extern void func_8014C978(void); -extern M2C_UNK D_801819B0; -extern M2C_UNK D_801819B8; - -s32 func_8012DB84(void) -{ - func_8014C978(); - func_8012F568(1, 0xC001, 0, 0x3E8, &D_801819B0, &D_801819B8); -} - - -DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH - - -typedef struct Entry_8012DDA4 { - u16 active; - unsigned char pad[0x10C - 2]; -} Entry_8012DDA4; - - -s32 func_8012DDA4() -{ - extern Entry_8012DDA4 * D_8019DCB4; - extern Entry_8012DDA4 * D_8019DCB0; - - Entry_8012DDA4 *p; - Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); - - while (D_8019DCB4 != end) { - p = D_8019DCB4; - if (p->active != 0 && p != D_8019DCB0) { - D_8019DCB4 = p + 1; - return p; - } - D_8019DCB4++; - } - D_8019DCB4 = 0; - return 0; -} - - - -// @class: plumbing -// @stuck: none — MATCH (35/35 ins, relocation-masked) - - -s32 func_8012DE2C(s32 a0) { - extern u8 * D_8019DCB4; - extern u8 * D_8019DCB0; - - u8 *base; - u8 *end; - u8 *p; - - base = D_801202A0; - end = base + 0x6480; - D_8019DCB4 = base; - D_8019DCB0 = ((u8 *)a0); - - while (D_8019DCB4 != end) { - p = D_8019DCB4; - if (*(u16 *)p != 0 && p != ((u8 *)a0)) { - D_8019DCB4 = p + 0x10C; - return p; - } - D_8019DCB4 += 0x10C; - } - D_8019DCB4 = 0; - return 0; -} - - - -DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ - -DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ - -DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ - -DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ - -DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012E014); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012E138); - - -s32 func_8012E27C(void) { - return 1; -} - - -DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ - -DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ - -DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012E364); - -DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ - -DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ - -DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ - -DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ - -DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH -extern u8 D_800AF648; -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) -{ - struct { short xy[2]; int sp14; int flag; } f; - register void *p __asm__("$4"); - p = &D_800AF648; - func_8004914C(p); - func_800491AC(&D_800AF648); - RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); - if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { - func_8002D4C8(param_2, param_3); - } -} - - -DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012E778); - -DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ - -DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ - -DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ - -DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ - - - -// @class: other -// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) - -extern void func_8016AA50(int, int); -extern void func_8016B428(int); -extern void func_80019064(void *); -extern int D_801819C0; - -void func_8012E9C0(int param_1) -{ - int iVar1; - - if (*(short *)(param_1 + 0x60) != 0) { - if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { - *(short *)(param_1 + 0x82) = 0; - *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); - *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); - *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); - } - if (*(int *)(param_1 + 0x78) != 0) { - iVar1 = *(short *)(param_1 + 0x60) * - *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; - if (iVar1 < 1) { - iVar1 = 1; - } - } else { - iVar1 = *(short *)(param_1 + 0x60); - } - func_8016AA50(param_1, iVar1); - if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { - func_8016B428(param_1); - func_80019064(&D_801819C0); - } - } - return; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012EA90); - -DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ - -DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ - -DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ - -DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012EFB8); - - -// @class: other -// @stuck: none — MATCH (33 ins, match_one verified) - -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); - -void func_8012F038(int param_1, short *param_2, short *param_3) { - int in[3]; - int out[3]; - - in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); - in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); - in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); - ApplyTransposeMatrixLV((void *)param_1, in, out); - param_3[0] = out[0]; - param_3[1] = out[1]; - param_3[2] = out[2]; -} - - -DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern void RotTransSV(s32 a0, s32 a1, void *a2); - -void func_8012F14C(s32 a0, s32 a1, s32 a2) -{ - s32 buf[2]; - func_8004914C((void *)a0); - func_800491AC((void *)a0); - RotTransSV(a1, a2, buf); -} - - -DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ - -DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012F274); - -DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ - -DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012F40C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8012F49C); - -DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ - -DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ - -DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ - -DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ - -DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) -extern void func_80131170(); -extern void func_80131CA8(); -extern unsigned char D_801819DC[]; - -void func_8012F828(int param_1) -{ - *(unsigned char *)(param_1 + 0xC1) = 4; - if (*(unsigned int *)(param_1 + 0xB4) & 8) { - func_80131170(param_1, D_801819DC, 0xB); - } - func_80131CA8(param_1, 9); -} - - -DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ - - -extern void func_80131170(s32 a0, s32 a1, s32 a2); -extern void func_80131CA8(int a0, int a1); -extern u8 D_801819E8[]; - -void func_8012F8C8(u8* arg0) { - *(u8*)(arg0 + 0xC1) = 7; - if (*(u32*)(arg0 + 0xB4) & 0x80) { - ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801819E8, 0xB); - } - ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); -} - - -DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ - -DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ - -DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ - -DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ - -DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. -// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for -// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be -// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an -// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). -// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: -// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. -// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which -// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because -// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. -// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out -// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, -// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what -// blocks reorg from sharing a downstream constant into a branch delay slot.) - - -s32 func_8012FCC4(s32 param_1) { - extern int D_801819F4; - - int v1 = *(int *)(((int)param_1) + 0xC4); - *(char *)(((int)param_1) + 0xC1) = 8; - if (v1 & 2) { - *(char *)(((int)param_1) + 0xC1) = 1; - func_80131CA8(((int)param_1), 3); - return; - } - if (v1 & 1) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 1); - return; - } - if (*(int *)(((int)param_1) + 0xB4) & 0x100) { - ((void (*)(int))func_80131B14)(((int)param_1)); - if (*(short *)(((int)param_1) + 0x76) <= 0) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); - return; - } - if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { - *(char *)(((int)param_1) + 0xC2) = 0; - } else { - *(short *)(((int)param_1) + 0x98) = 0; - *(char *)(((int)param_1) + 0xC2) = 1; - } - ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801819F4); - *(int *)(((int)param_1) + 0x1C) = 0; - func_80131CA8(((int)param_1), 0x1C); - return; - } - func_80131CA8(((int)param_1), 0x1C); -} - - - -DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ - -DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ - -DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ - -DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ - -DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ - -DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ - -DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ - -DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ - -DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ - -DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ - -DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ - -DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ - -DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ - -DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ - -DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ - -DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ - -DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80130650); - -DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ - -DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ - -DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ - -DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ - -DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ - -DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80130A18); - -DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ - -DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80130C08); - - -extern void (*D_801819FC[])(void); - -void func_80130D0C(void *a0) { - D_801819FC[*(u8 *)((s32)a0 + 0xC1)](); -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). -extern s32 rand(void); -extern u8 D_80078E78[]; -extern u16 D_80078EB2; -extern u16 D_80078EB4; -extern s16 D_80181A4C[]; -extern s16 D_80181A7C[]; -extern s16 D_80181ADC[]; -extern s16 D_80181AE4[]; -extern s16 D_80181B04[]; - -void func_80130D48(s32 arg0) -{ - register s16 *tbl __asm__("$16"); - register s32 pa __asm__("$18") = arg0; - register u8 *p __asm__("$19") = D_80078E78; - s32 s1v; - s32 call_a0; - s32 call_a1; - s32 cnt; - s32 r; - void *ret; - - s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); - if (s1v == 0) { - return; - } - - if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - } - - switch (s1v & 0xFFFF0000) { - case 0x10000: { - u32 x = D_80078EB4; - u32 y = D_80078EB2; - u32 b; - u32 a; - - s1v = 0; - if (x == y) { - s1v = 0xC; - } else if ((y >> 1) >= x) { - s1v = 3; - } - - b = *(u16 *)(p + 0x40); - a = *(u16 *)(p + 0x3E); - if (b == a) { - s1v += 0x18; - } else if ((a >> 1) >= b) { - s1v += 6; - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181A7C; tbl = (s16 *)(bp + v1); } - - r = rand() % 100; - cnt = 0; - loop27: - if (r >= *tbl) { - cnt += 1; - tbl += 1; - if (cnt < 3) { - goto loop27; - } - } - - s1v = 0; - switch (cnt) { - case 0: - tbl = D_80181ADC; - s1v = 0x31; - break; - case 1: { - s32 mx = *(u16 *)(p + 0x3A); - s32 cur = *(u16 *)(p + 0x3C); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181AE4; tbl = (s16 *)(bp + v1); } - s1v = 0x32; - break; - } - case 2: { - s32 mx = *(u16 *)(p + 0x3E); - s32 cur = *(u16 *)(p + 0x40); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181B04; tbl = (s16 *)(bp + v1); } - s1v = 0x33; - break; - } - } - - r = rand() % 100; - call_a1 = 0; - loop50: - if (r >= *tbl) { - call_a1 += 1; - tbl += 1; - if (call_a1 < 4) { - goto loop50; - } - } - call_a0 = s1v; - goto do_call; - } - case 0x20000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x30000: - call_a0 = 0x31; - call_a1 = 0; - goto do_call; - case 0x40000: - call_a0 = 0x32; - call_a1 = 0; - goto do_call; - case 0x50000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x60000: { - s32 rr = rand() & 0xFF; - tbl = D_80181A4C; - if (rr >= *tbl) { - do { - tbl += 3; - } while (rr >= *tbl); - } - call_a0 = tbl[1]; - if (*(u16 *)(p + 0x40) < 4U) { - call_a0 = 0x33; - } - call_a1 = tbl[2]; - goto do_call; - } - case 0x70000: - call_a0 = 0x27B; - call_a1 = 0; - goto do_call; - default: - return; - } - -do_call: - ret = func_8012C658(call_a0, call_a1, pa); - if (ret != 0) { - *(u16 *)((s8 *)ret + 0xA) -= 0x20; - } -} - - -// @class: loop-guard -// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps -// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` -// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); -// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's -// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC -// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). - - -void func_80131170(s32 p, s32 b, s32 c) { - extern u8 D_801819D0[]; - - func_80131B14(); - *(u8 *)(((u8 *)p) + 0xC2) = 0; - *(u8 *)(((u8 *)p) + 0xC3) = 0; - *(s16 *)(((u8 *)p) + 0x98) = 0; - if (((u8 *)b) == 0) { - ((u8 *)b) = D_801819D0; - } - func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); - *(s32 *)(((u8 *)p) + 0x1C) = 0; - if (c != 0) { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } else { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } -tail: - if (*(s16 *)(((u8 *)p) + 0x76) > 0) { - return; - } - if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); - } else { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); - } -} - - - -// @class: struct -// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) - -typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ - - -s32 func_801312D0(s32 param_1, void *param_2) -{ - extern int func_80131CF4(int, int); - extern M8_801312D0 D_80181B24; - - int iVar5; - - iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); - if (iVar5 != 0) { - ((short *)param_2)[2] = 0; - ((short *)param_2)[0] = 0; - ((short *)param_2)[1] = (short)iVar5; - } else { - *(M8_801312D0 *)((short *)param_2) = D_80181B24; - } -} - - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80131340); - -DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80131A34); - -DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` -// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be -// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a -// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). -// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; -// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the -// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); -// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. - -void func_80131B14() { - extern void func_8002A520(void *); - extern void func_8002A790(void *); - extern u8 D_80181B2C; - - register u8 *a0v __asm__("$4"); - u8 *p = a0v; - - - s32 e = *(u8 *)(p + 0x5E); - - if (*(s16 *)(p + 0x60) != 0) { - if (e == 0x1D) { - *(s16 *)(p + 0x82) = 0; - *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); - *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); - *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); - } - { - s32 dec; - s32 q = *(s32 *)(p + 0x78); - if (q != 0) { - dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; - if (dec <= 0) dec = 1; - } - *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; - } - ((void (*)(void *))func_8016AA50)(p); - if (*(u16 *)(p + 0x82) & 1) { - ((void (*)(void *))func_8016B428)(p); - ((void(*)(void *))func_80019064)(&D_80181B2C); - } - } - - *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; - - if (e != 0x1D) { - if (*(u8 *)(p + 0xC8)) func_8002A520(p); - if (*(u8 *)(p + 0xC9)) func_8002A790(p); - } - - if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; - - { - s32 r = *(s32 *)(p + 0x20); - *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; - { - s32 r2 = *(s32 *)(p + 0x20); - *(s16 *)(r2 + 0x14) = 0; - *(s16 *)(r2 + 0x10) = 0; - } - } - - ((void (*)(void *))func_8012B2CC)(p); - ((void (*)(void *))func_8012B23C)(p); -} - - - -DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80131CA8); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80131CF4); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80131D68); - - -extern void (*D_80181B3C[])(struct S80131E00 *a0); - -void func_80131E00(struct S80131E00 *a0, s32 a1) { - a0->field_B0 = a1; - D_80181B3C[a1](a0); -} - - -DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ - -DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ - -DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ - - -extern void (*D_80181B94[])(void); - -void func_80131EEC(void *a0) { - D_80181B94[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80181BDC[])(void); - -void func_80131F28(void *a0) { - D_80181BDC[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80181BE4[])(void); - -void func_80131F64(void *a0) { - D_80181BE4[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80181BEC[])(void); - -void func_80131FA0(void *a0) { - D_80181BEC[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80181BF4[])(void); - -void func_80131FDC(void *a0) { - D_80181BF4[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80132018); - -DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80181B9C; - -void func_801320D8(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80181B9C; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -s32 func_80132144(s32 param_1) -{ - extern int D_80181BAC; - - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(((int)param_1) + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(((int)param_1)); - } else { - ((void(*)(int, int))func_8001C214)(v0, 0); - *(int *)(((int)param_1) + 0x58) = (int)&D_80181BAC; - *(short *)(((int)param_1) + 0x5c) = 0x80; - *(unsigned short *)(((int)param_1) + 2) += 1; - } -} - - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80181BBC; - -void func_801321B0(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80181BBC; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80181BCC; - -void func_8013221C(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80181BCC; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - -DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ - -DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801325B8); - -DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ - -DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ - -DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ - -DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ - -DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ - -DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80132F40); - -DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801330E0); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80133298); - -DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ - -DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH - -extern s32 D_8019DD00; -extern s32 D_8019DD04[]; -extern int D_8019DD08; -extern void func_80136BC4(s32 a0); - -void func_801336E8(void *a0, int a1, int a2) { - if (a0 != 0) { - (*(void * *)&D_8019DD00) = a0; - ((void (*)(void))func_80136BC4)(); - } - (*(int *)&D_8019DD04) = a1; - D_8019DD08 = a2; -} - - - - -extern s32 D_8019DD04[]; -extern s32 D_8019DD00; -extern void func_80136BC4(s32); - -void func_8013373C(s16 arg0) { - s32 temp = D_8019DD04[arg0]; - if (temp != 0) { - D_8019DD00 = temp; - func_80136BC4(temp); - } -} - - -// @class: regalloc-order -#include "common.h" - -typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; - - -s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { - extern s32 func_80047D3C(s32); - extern s32 func_80133AB0(s16, s16, s16, s32); - extern Box_80133784 * D_80181BFC; - extern Box_80133784 * D_80181C00; - extern s16 D_8019DD0C; - extern u16 D_8019DD10; - - register s32 s1 __asm__("$17"); - s32 s2; - register s16 s3 __asm__("$19"); - register s32 s4 __asm__("$20"); - register s16 a0v __asm__("$4"); - register s16 arg0s __asm__("$21"); - s32 dx, dy, dz; - s32 r, ret; - - a0v = ((s16)arg0); - s1 = 0; - s3 = 0; - s4 = 0; - s2 = 0; - arg0s = a0v; - D_80181BFC->f6 = -0x7FFF; - D_80181C00->f6 = 0x7FFF; - D_80181BFC->f0 = ((Box_80133784 *)arg1)->f0; - D_80181BFC->f4 = ((Box_80133784 *)arg1)->f4; - D_80181C00->f0 = ((Box_80133784 *)arg2)->f0; - D_80181C00->f4 = ((Box_80133784 *)arg2)->f4; - D_8019DD10 = 0; - D_8019DD0C = 0; - - if ((s16)a0v == 0) { - s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; - s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; - s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; - if (sx == 0 && sy == 0) { - s32 zt = (sz == 0); - __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); - } - D_80181BFC->f2 = ((Box_80133784 *)arg1)->f2 - 4; - r = func_80047D3C(sx * sx + sz * sz); - if (r < 3) { - r = 4; - } else if (r < 5) { - r += 1; - } - D_80181C00->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; - } else { - D_80181BFC->f2 = ((Box_80133784 *)arg1)->f2; - if ((s16)a0v == 2) { - D_80181C00->f0 = D_80181BFC->f0; - D_80181C00->f2 = D_80181BFC->f2 + 6; - s2 = 1; - D_80181C00->f4 = D_80181BFC->f4; - } else { - D_80181C00->f2 = ((Box_80133784 *)arg2)->f2; - } - } - - while (1) { - s32 ret0; - register s32 retc __asm__("$3"); - __asm__ __volatile__(""); - ret0 = func_80133AB0(arg0s, (s16)D_80181BFC->f0, (s16)D_80181BFC->f4, (*(s32*)&D_8019DD00)); - __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); - ret = retc; - if (ret == 0) goto after; - s4 |= ret; - if (s2 != 0) goto after; - { - s16 oldc = s3; - s3 = s3 + 1; - if (oldc >= 5) break; - } - } - - D_80181C00->f0 = D_80181BFC->f0; - D_80181C00->f2 = D_80181BFC->f2; - s1 = 0x2000; - D_80181C00->f4 = D_80181BFC->f4; - goto store_out; - -after: - if ((s16)s4 != 0 || D_8019DD0C != 0) { - s16 t; - __asm__ __volatile__("" :: "r"(s4)); - t = D_80181BFC->f6; - if (t >= -0xBCB) { - if (t < -0x578) { - s1 |= 0x4000; - } else { - s1 |= 0x8000; - } - } - if ((s16)D_80181C00->f6 < -0xBCB) { - s1 |= 0x2000; - } - store_out: - ((Box_80133784 *)arg2)->f0 = D_80181C00->f0; - ((Box_80133784 *)arg2)->f2 = D_80181C00->f2; - ((Box_80133784 *)arg2)->f4 = D_80181C00->f4; - ((Box_80133784 *)arg2)->f6 = D_8019DD10; - return s1 & 0xFFFF; - } - ((Box_80133784 *)arg2)->f6 = D_8019DD10; - return 0; -} - - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80133AB0); - - -s32 func_80133CD4(arg0, cmd, base, arr) - s16 arg0; - s16 *cmd; - s16 *base; - s32 *arr; -{ - typedef struct { s16 e[4]; } ElemK; - - extern u16 *D_80181C00; - extern u16 *D_80181BFC; - extern s16 *D_80181C08; - extern s16 *D_80181C04; - extern s32 *D_80181C10; - extern s32 *D_80181C14; - extern u16 D_8019DD10; - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern u16 D_801152AE; - extern u8 D_801152B0; - extern s32 func_80134310(); - extern s32 func_8013435C(); - - s16 *s3 = ((ElemK *)base)[cmd[1]].e; - s32 s6 = arr[cmd[2]]; - s32 s0var, s1var; - s32 s2a; - s16 y; - - if (func_80134310(s3, D_80181C00, s6) >= 0) - return 0; - - s1var = func_80134310(s3, D_80181BFC, s6); - if (s1var < 0) - return 0; - - s0var = func_80134310(s3, D_80181C08, 0); - { - u16 *pac = D_80181BFC; - s16 *pb8 = D_80181C08; - s16 *pb4 = D_80181C04; - s32 neg = -s1var; - pb4[0] = pac[0] + neg * pb8[0] / s0var; - pb4[1] = pac[1] + neg * pb8[1] / s0var; - pb4[2] = pac[2] + neg * pb8[2] / s0var; - if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) - return 0; - } - if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80181C04, arr[cmd[6]], s3)) - return 0; - if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80181C04, arr[cmd[8]], s3)) - return 0; - if (arg0 < 0) { - if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80181C04, arr[cmd[10]], s3)) - return 0; - } - if (arg0 & 0x10) { - if (*(u16 *)cmd & 0x100) - return 0; - } - if (*(u16 *)cmd & 0x200) { - D_8019DD10 = *(u16 *)cmd; - return 0; - } - - { - s32 ret = func_80134310(s3, D_80181C00, s6); - s32 *pc0; - s32 *pc4; - u16 *pb0; - s32 t, o2; - s32 q3v; - - { - s32 *pw = D_80181C10; - ((struct { s32 w; } *)pw)->w = s3[0]; - pw[1] = s3[1]; - pw[2] = s3[2]; - } - s1var = -ret; - - __asm__ __volatile__( - "lwc2 $9, 0(%0)\n" - "lwc2 $10, 4(%0)\n" - "lwc2 $11, 8(%0)\n" - "nop\n" - "nop\n" - "sqr 0\n" - : : "r"(D_80181C10) : "$9", "$10", "$11", "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"(D_80181C14) : "memory"); - - pc0 = D_80181C10; - pc4 = D_80181C14; - s0var = pc4[0] + pc4[1] + pc4[2]; - pb0 = D_80181C00; - pb0[0] += s1var * pc0[0] / s0var; - pb0[1] += s1var * pc0[1] / s0var; - q3v = s1var * pc0[2] / s0var; - - { - s32 h; - h = ((s16 *)pb0)[0]; - s1var = h << 16; - __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); - s0var = h << 16; - } - pb0[2] += q3v; - s2a = (s16)pb0[2] << 16; - - t = pc0[0] << 4; - pc0[0] = t; - if (t < 0) s1var |= 0xFFFF; - t = pc0[1] << 4; - pc0[1] = t; - if (t < 0) s0var |= 0xFFFF; - o2 = pc0[2]; - t = o2 << 4; - pc0[2] = t; - if (t < 0) s2a |= 0xFFFF; - s2a += o2 << 5; - s1var += pc0[0] << 1; - s0var += pc0[1] << 1; - - do { - s32 *pl = D_80181C10; - u16 *pb; - s1var += pl[0]; - s0var += pl[1]; - s2a += pl[2]; - pb = D_80181C00; - pb[0] = s1var >> 16; - pb[1] = s0var >> 16; - pb[2] = s2a >> 16; - ret = func_80134310(s3, pb, s6); - } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); - } - - y = s3[1]; - if (y >= -0xBCB) { - D_80181BFC[3] = y; - { - typedef struct { s8 c[8]; } Blk8; - *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; - } - if (*(u8 *)cmd != 0) - goto ret1; - return -1; - } - { - typedef struct { u16 h; } H16; - u16 *s3u = (u16 *)s3; - u16 *bp = D_80181C00; - u16 w; - ((H16 *)D_801152A8)->h = s3u[0]; - w = s3u[1]; - bp[3] = w; - ((H16 *)&D_801152AA)->h = w; - ((H16 *)&D_801152AC)->h = s3u[2]; - ((H16 *)&D_801152AE)->h = s3u[3]; - } -ret1: - return 1; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80134310); - -DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (83 ins, relocation-masked) - - - -s32 func_801343C4(s32 angle, s32 p1, s32 p2) -{ - extern int func_80133AB0(int, s16, s16, int); - extern s16 * D_80181BFC; - extern s16 * D_80181C00; - extern u16 D_8019DD10; - extern u16 D_8019DD0C; - - s16 *pac; - s16 *pb0; - s16 *pacs, *pb0s; - u16 *pb0u; - int a1v, a2v, d94, b0; - int sangle = ((s16)angle); - - pac = D_80181BFC; - d94 = D_8019DD00; - pb0 = D_80181C00; - pac[0] = ((u16 *)p1)[0]; - pac[1] = ((u16 *)p1)[1]; - pac[2] = ((u16 *)p1)[2]; - pb0[0] = ((u16 *)p2)[0]; - pb0[1] = ((u16 *)p2)[1]; - pb0[2] = ((u16 *)p2)[2]; - - a1v = pac[0]; a2v = pac[2]; - __asm__ __volatile__("" ::: "memory"); - D_8019DD10 = 0; - D_8019DD0C = 0; - if (func_80133AB0(sangle, a1v, a2v, d94)) { - setdst: - pb0u = (u16 *)D_80181C00; - ((u16 *)p2)[0] = pb0u[0]; - ((u16 *)p2)[1] = pb0u[1]; - ((u16 *)p2)[2] = pb0u[2]; - ((u16 *)p2)[3] = D_8019DD10; - return 1; - } - - pacs = D_80181BFC; - pb0s = D_80181C00; - b0 = pb0s[0]; - if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && - (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { - return 0; - } - if (func_80133AB0(sangle, b0, pb0s[2], D_8019DD00)) { - goto setdst; - } - return 0; -} - - - -// @class: schedule -typedef struct { - u16 f0; /* 0x0 */ - u16 f2; /* 0x2 */ - u16 f4; /* 0x4 */ - s16 f6; /* 0x6 */ -} Foo_80134510_80134510; - - -s32 func_80134510(s32 param) { - extern s32 func_801345F8(s32); - extern Foo_80134510_80134510 * D_80181BFC; - extern Foo_80134510_80134510 * D_80181C00; - extern Foo_80134510_80134510 * D_80181C04; - extern u16 D_8019DD10; - - - s32 ret = 0; - Foo_80134510_80134510 *b0 = D_80181C00; - Foo_80134510_80134510 *ac = D_80181BFC; - u16 t0 = ((Foo_80134510_80134510 *)param)->f0; - u16 t2, t4; - - ((Foo_80134510_80134510 *)param)->f6 = 0; - ac->f0 = t0; - b0->f0 = t0; - t2 = ((Foo_80134510_80134510 *)param)->f2; - ac->f2 = t2 - 4; - b0->f2 = t2 + 0x2FC; - t4 = ((Foo_80134510_80134510 *)param)->f4; - ac->f4 = t4; - b0->f4 = t4; - - if (func_801345F8((*(s32*)&D_8019DD00)) != 0) { - s16 x; - ((Foo_80134510_80134510 *)param)->f2 = D_80181C04->f2 - 2; - x = D_80181BFC->f6; - if (x >= -3019) { - if (x < -1400) { - ret = 0x4000; - } else { - ret = 0x8000; - } - } else { - ret = 0x2000; - } - D_80181BFC->f6 = D_8019DD10; - } - return ret; -} - - - -// @class: regalloc-order -// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. - - -s32 func_801345F8(s32 arg) -{ - extern int func_801347A0(short, u16 *, int, int); - extern u16 * D_80181BFC; - extern u16 D_8019DD10; - - register u16 *param_1 __asm__("$5") = ((u16 *)arg); - register u16 *cc __asm__("$4") = D_80181BFC; - int c8000 = 0x8000; - register int zr __asm__("$0"); - u32 c1, c2, uVar6, uVar2, cnt, v14; - u16 *ptmp, *puVar4, *puVar7, uVar1; - int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; - - c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; - uVar6 = c1 + zr; - if ((c1 & 0xffff) < (u32)param_1[2]) { - c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; - uVar2 = c2 + zr; - if ((c2 & 0xffff) < (u32)param_1[3]) - goto do_mult; - return 0; - found: - D_8019DD10 = *puVar7; - return 1; - do_mult: - tbl = *(int *)(param_1 + 4); - uVar10 = *(int *)(param_1 + 6); - uVar3 = *(int *)(param_1 + 8); - iVar9 = *(int *)(param_1 + 0xc); - iVar8 = *(int *)(param_1 + 0xe); - ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); - cnt = (u32)ptmp[1]; - v14 = *(int *)(param_1 + 10); - puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; - while (((cnt-- + zr) & 0xffff) != 0) { - uVar1 = *puVar4; - hi = uVar1 & 0x8000; - harg = hi + zr; - if (hi == 0) - puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); - else - puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); - if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) - goto found; - puVar4 = puVar4 - 1; - } - } - return 0; -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. -#include "common.h" - -typedef struct { - /* 0x00 */ u16 f0; - /* 0x02 */ s16 f2; - /* 0x04 */ s16 f4; - /* 0x06 */ s16 f6; - /* 0x08 */ s16 f8; - /* 0x0A */ s16 fa; - /* 0x0C */ s16 fc; - /* 0x0E */ s16 fe; - /* 0x10 */ s16 f10; - /* 0x12 */ s16 f12; - /* 0x14 */ s16 f14; -} S0_801347A0; - -typedef struct { - /* 0x0 */ s16 f0; - /* 0x2 */ s16 f2; - /* 0x4 */ s16 f4; - /* 0x6 */ s16 f6; -} Elem_801347A0; - -typedef struct { - /* 0x0 */ u16 f0; - /* 0x2 */ u16 f2; - /* 0x4 */ u16 f4; - /* 0x6 */ u16 f6; -} SVec_801347A0; - - - -s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); - extern s16 * D_80181C00; - extern SVec_801347A0 * D_80181BFC; - extern SVec_801347A0 * D_80181C04; - - Elem_801347A0 *pElem; - s32 val; - register s32 iv __asm__("$4"); - s32 q; - s32 dvsr; - - pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; - val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; - if (func_80134A28((s32)pElem, (s32)D_80181C00, val) >= 0) { - return 0; - } - iv = func_80134A28((s32)pElem, (s32)D_80181BFC, val); - if (iv < 0) { - return 0; - } - iv = -iv; - dvsr = pElem->f2 * 48; - q = (iv * 48) / dvsr; - D_80181C04->f0 = D_80181BFC->f0; - D_80181C04->f2 = D_80181BFC->f2 + q; - D_80181C04->f4 = D_80181BFC->f4; - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { - return 0; - } - if ((s16)arg0) { - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { - return 0; - } - } - if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { - return 0; - } - D_80181C04->f0 = D_80181BFC->f0; - D_80181C04->f4 = D_80181BFC->f4; - (*(Elem_801347A0*)D_801152A8) = *pElem; - D_80181BFC->f6 = pElem->f2; - return 1; -} - - - -DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80134A74); - -// @class: regalloc-order -// @try: variant B — direct pins m=$s5($21), c=$s6($22) - - -s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); - extern void * D_80181BFC; - extern void * D_80181C00; - extern void * D_80181C04; - extern void * D_80181C08; - extern u16 D_8019DD10; - - s32 temp_a3; - s32 temp_s1; - s32 temp_v0; - s32 temp_v0_2; - s32 var_v0; - u16 temp_a1; - s32 temp_s4; - s32 c = arg0; - __asm__ __volatile__("" : "=r"(c) : "0"(c)); - __asm__ __volatile__("" : : "r"(arg0)); - - temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); - temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); - var_v0 = 0; - if (func_80134FB8(temp_s4, (s32) D_80181C00, temp_s1) >= 0) { - return var_v0; - } - temp_v0 = func_80134FB8(temp_s4, (s32) D_80181BFC, temp_s1); - if (temp_v0 < 0) { - goto block_13; - } - temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80181C08, 0); - temp_a3 = -temp_v0; - { - u16 *pB4 = (u16 *)D_80181C04; - u16 *pAC = (u16 *)D_80181BFC; - s16 *pB8 = (s16 *)D_80181C08; - pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; - pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; - pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { - return var_v0; - } - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80181C04, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { - return var_v0; - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80181C04, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { - return var_v0; - } - if ((arg0 << 16) < 0) { - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80181C04, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { - return var_v0; - } - } - if (c & 1) { - if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { - goto block_14; - } - return 0; - } - temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); - if (!(temp_a1 & 0x200)) { - goto block_14; - } - D_8019DD10 = temp_a1; -block_13: - return 0; -block_14: - __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); - VectorNormalSS(D_80181C08, D_80181C08); - { - u16 *pB8 = (u16 *)D_80181C08; - u16 *pB4b = (u16 *)D_80181C04; - pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); - var_v0 = 1; - pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); - pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); - } - return var_v0; -} - - - -DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ - -// @class: plumbing -// @stuck: MATCH (89 ins). To BANK: retype D_80181C00 + D_80181BFC (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). - - - - -s32 func_80135004(s32 arg0, s32 p1, s32 p2) -{ - extern int func_80134A74(int, s16, s16, int); - extern s16 * D_80181C00; - extern s16 * D_80181BFC; - extern u8 D_80181C08; - extern s16 *D_80181C04; - extern u16 D_8019DD10; - - register s16 *pb0 __asm__("$9"); /* D_80181C00 -> $t1 */ - register s16 *pac __asm__("$6"); /* D_80181BFC -> $a2 */ - register s16 *pb8 __asm__("$8"); /* D_80181C08 -> $t0 */ - u16 *pb4; - u16 a, b; - int id; - int a1v, a2v, d94; - - pb0 = D_80181C00; - __asm__ __volatile__("" : : "r"(pb0)); - - a = ((u16 *)p2)[0]; pac = D_80181BFC; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80181C08); pac[0] = b; pb8[0] = a - b; - a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; - a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; - - id = ((int)arg0) & 0xFFFF; - a1v = pac[0]; a2v = pac[2]; d94 = D_8019DD00; - __asm__ __volatile__("" ::: "memory"); - D_8019DD10 = 0; - - if (func_80134A74(id, a1v, a2v, d94)) { - found: - pb4 = (*(u16 * *)&D_80181C04); - ((u16 *)p2)[0] = pb4[0]; - ((u16 *)p2)[1] = pb4[1]; - ((u16 *)p2)[2] = pb4[2]; - ((u16 *)p2)[3] = D_8019DD10; - return 1; - } - { - register u16 *qb __asm__("$4"); /* D_80181BFC -> $a0 (reloaded) */ - register int qa0 __asm__("$5"); /* D_80181C00[0], kept in $a1 for the 2nd-call arg */ - register u16 *qa __asm__("$6"); /* D_80181C00 -> $a2 (reloaded) */ - qb = (u16 *)D_80181BFC; - qa = (u16 *)D_80181C00; - qa0 = qa[0]; - if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && - ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) - return 0; - if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_8019DD00)) - goto found; - return 0; - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (62 ins, relocation-masked) - - -extern u8 D_80181C00; -extern u8 D_80181BFC; -extern s16 *D_80181C04; -extern u8 D_80181C08; -extern int D_8019DD00; -extern u16 D_8019DD10; - -extern int func_80134A74(int, s16, s16, int); - -int func_80135168(u16 arg0, u16 *p1, u16 *p2) -{ - register s16 *pb0 __asm__("$8"); - register s16 *pac __asm__("$6"); - register s16 *pb8 __asm__("$7"); - u16 *pb4; - u16 a, b; - int a1v, a2v, d94; - - pb0 = (*(s16 * *)&D_80181C00); - __asm__ __volatile__("" : : "r"(pb0)); - - a = p2[0]; pac = (*(s16 * *)&D_80181BFC); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80181C08); pac[0] = b; pb8[0] = a - b; - a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; - a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; - - a1v = pac[0]; a2v = pac[2]; d94 = D_8019DD00; - __asm__ __volatile__("" ::: "memory"); - D_8019DD10 = 0; - if (func_80134A74(arg0, a1v, a2v, d94)) { - pb4 = (*(u16 * *)&D_80181C04); - p2[0] = pb4[0]; - p2[1] = pb4[1]; - p2[2] = pb4[2]; - p2[3] = D_8019DD10; - return 1; - } - return 0; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80135260); - - -/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). - * - * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 - * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does - * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in - * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). - * - * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): - * the two output buffers D_80181BFC / D_80181C00 are written through a pointer in each of the two - * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a - * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also - * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each - * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks - * the lowest-free scratch over its OWN window: - * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) - * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) - * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail - * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. - * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades - * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the - * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. - * - * Zero file-scope footprint (block-scoped typedefs + externs; D_80181BFC/B0 read via the ambient - * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for - * family_sweep --edit-remap with no cc1 crash. - * - * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. - */ -s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) -{ - typedef struct { s32 vx, vy, vz, pad; } Vec32; - typedef struct { s16 vx, vy, vz, pad; } Vec16; - typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; - extern void func_80048EAC(void *m0, void *m1); - extern void func_8004914C(void *m); - extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); - extern void ApplyRotMatrixLV(void *in, void *out); - extern void ApplyRotMatrix(void *in, void *out); - extern s32 D_8019DD14, D_8019DD18, D_8019DD1C, D_8019DD20; - extern s16 D_8019DD24; - extern s32 D_8019DD34; - extern s16 D_8019DD38, D_8019DD3A, D_8019DD3C, D_8019DD3E, D_8019DD40, D_8019DD42; - - Vec32 in0, in1, rotout; - Mat32 mat2; - Vec16 vecin; - s32 result; - s32 mode; - s32 q1, q2; - s32 p; - s32 t18, t1A, t1C; - s32 *m; - - in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); - in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); - if ((param_2 & 0x10000000) == 0) { - if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { - return 0; - } - } - mode = param_2 & 0x60000000; - if (mode != 0) { - result = 1; - if (param_2 >= 0) { - mode &= 0x40000000; - } - in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); - in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); - switch (mode) { - case 0x60000000: - m = &D_8019DD14; - *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); - q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); - q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); - D_8019DD18 = 0; - D_8019DD20 = 0; - D_8019DD1C = q1; - D_8019DD24 = q2; - func_80048EAC((void *)((s32)param_1 + 0x34), m); - ApplyTransposeMatrixLV(m, &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - /* fallthrough */ - case 0x20000000: - p = (param_2 & 0xFFFFFFF) | 0x80000000; - t18 = *(s16 *)((s32)param_1 + 0x18); - t1A = *(s16 *)((s32)param_1 + 0x1A); - t1C = *(u16 *)((s32)param_1 + 0x1C); - mat2.w4 = 0; - mat2.wC = 0; - mat2.w0 = t18; - mat2.w8 = t1A; - mat2.h10 = t1C; - func_8004914C(&mat2); - vecin.vx = *(u16 *)(p + 4); - vecin.vy = *(u16 *)(p + 8); - vecin.vz = *(u16 *)(p + 0xC); - ApplyRotMatrix(&vecin, &rotout); - D_8019DD38 = rotout.vx; - D_8019DD3C = rotout.vy; - D_8019DD40 = rotout.vz; - vecin.vx = *(u16 *)(p + 6); - vecin.vy = *(u16 *)(p + 0xA); - vecin.vz = *(u16 *)(p + 0xE); - ApplyRotMatrix(&vecin, &rotout); - D_8019DD34 = 0; - D_8019DD3A = rotout.vx; - D_8019DD3E = rotout.vy; - D_8019DD42 = rotout.vz; - result += 2; - break; - case 0x40000000: - ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - break; - } - { - s16 *p = *(s16 **)&D_80181BFC; - p[0] = in0.vx; - p[1] = in0.vy; - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_80181C00; - p[0] = in1.vx; - p[1] = in1.vy; - p[2] = in1.vz; - } - return result; - } - { - s16 *p = *(s16 **)&D_80181BFC; - p[0] = in0.vx; - p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_80181C00; - p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); - p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); - } - return 1; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80135888); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80135A4C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80135D20); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80135EB0); - - -s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - register s32 a1v __asm__("$11"); - register s32 a2v __asm__("$12"); - register s32 n __asm__("$5"); - register s16 *b4 __asm__("$7"); - s32 d; - s32 dx; - s32 denom; - s32 result; - s32 frame_pad[2]; - (void)&frame_pad; - __asm__("" : "=r"(a1v) : "0"(arg1)); - a2v = arg2; - - if (!(arg1 & 1)) { - dx = (s16) arg2 - (*(s16 **)&D_80181BFC)[2]; - d = dx; - denom = -(*(s16 **)&D_80181C08)[2]; - } else { - denom = (*(s16 **)&D_80181C08)[2]; - d = (*(s16 **)&D_80181BFC)[2] - (s16) arg2; - dx = -d; - } - n = -d; - { - register s16 *b8 __asm__("$6") = *(s16 **)&D_80181C08; - u16 *ac = *(u16 **)&D_80181BFC; - b4 = D_80181C04; - b4[0] = ac[0] + n * b8[0] / denom; - b4[1] = ac[1] + n * b8[1] / denom; - b4[2] = ac[2] + dx; - } - - if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; - if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; - if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; - if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; - if (a1v & 0x8000) { - u16 *b0 = *(u16 **)&D_80181C00; - b4[0] = b0[0]; - b4[1] = b0[1]; - } - D_801152AA = 0; - (*(s16 *)D_801152A8) = 0; - if (a1v & 1) { - D_80181C04[2] = a2v + 2; - __asm__ __volatile__(""); - D_801152AC = 0xFFF; - } else { - D_801152AC = -0xFFF; - D_80181C04[2] = a2v - 2; - } - __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); - (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; - D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; - result = 1; - D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; - return result; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801365B8); - - -// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) -// D_80181BFC/B0/B8 are file-scope `extern u8`, D_80181C04 is `extern s32 []`; each HOLDS a -// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. -// D_80181C04 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the -// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar -// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the -// siblings read it once via *(u16**)&sym == direct lw either way). - -s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - - register u16 *ac __asm__("$4"); - register s16 *b8 __asm__("$6"); - register s16 *b4 __asm__("$9"); - register s32 r __asm__("$3"); - register s32 pos __asm__("$12"); - register s32 a1v __asm__("$5"); - s16 temp_v0; - s16 temp_v1; - s32 var_a3; - s16 var_v0_3; - s32 temp_a1; - s32 var_t0; - s32 var_v1; - s16 *b4b; - u16 *p; - - __asm__ ("" : "=r"(a1v) : "0"(arg1)); - pos = arg2; - if (!(a1v & 1)) { - var_t0 = (s16) arg2 - (*(s16 **)&D_80181BFC)[1]; - var_v1 = var_t0; - var_a3 = -(*(s16 **)&D_80181C08)[1]; - } else { - var_a3 = (*(s16 **)&D_80181C08)[1]; - var_v1 = (*(s16 **)&D_80181BFC)[1] - (s16) arg2; - var_t0 = -var_v1; - } - b8 = (*(s16 **)&D_80181C08); - ac = (*(u16 **)&D_80181BFC); - b4 = D_80181C04; - temp_a1 = -var_v1; - r = (temp_a1 * b8[0]) / var_a3; - b4[0] = ac[0] + r; - b4[1] = ac[1] + var_t0; - r = (temp_a1 * b8[2]) / var_a3; - temp_v0 = ac[2] + r; - b4[2] = temp_v0; - temp_v1 = b4[0]; - if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { - return 0; - } - if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { - return 0; - } - if (arg1 & 0x8000) { - p = (*(u16 **)&D_80181C00); - b4[0] = (s16) p[0]; - b4[2] = (s16) p[2]; - } - D_801152AC = 0; - (*(s16 *)D_801152A8) = 0; - if (arg1 & 1) { - b4b = D_80181C04; - D_801152AA = 0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos + 2; - } else { - b4b = D_80181C04; - D_801152AA = -0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos - 2; - } - b4b[1] = var_v0_3; - __asm__ __volatile__("" :: "r"(pos)); - (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); - D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); - D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); - return 1; -} - - -// @class: schedule -// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a -// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE -// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses -// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] -// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the -// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; -// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits -// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the -// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). - - -extern s16 *D_80181C04; /* holds a pointer value (*(u16**)&D_80181C04) */ - -s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { - extern void ApplyMatrixSV(void *m, void *v0, void *v1); - extern void ApplyRotMatrix(void *v0, void *v1); - extern u16 D_80126722; - extern s16 D_80126724; - extern s16 D_801152AA; - extern s16 D_801152AC; - - s32 out[4]; - u16 *pb4; - - if (a0) { - ApplyMatrixSV((void *)a3, *(void **)&D_80181C04, *(void **)&D_80181C04); - ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); - ApplyRotMatrix((void *)D_801152A8, (void *)out); - *(s16 *)D_801152A8 = out[0]; - D_801152AA = out[1]; - D_801152AC = out[2]; - } - - pb4 = *(u16 **)&D_80181C04; - *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); - *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); - *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); - - *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); - D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); - D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); -} - - - -DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ - -DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ - -DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ - -DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ - -DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ - - -extern unsigned short D_800B99F0; -extern void (*D_80181C18[])(void); - -void func_80136C54(void) -{ - D_80181C18[D_800B99F0](); -} - - -// @class: struct -// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_8019CCEC into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). - -typedef struct { char s[10]; } S10_80136C90; - -s32 func_80136C90() -{ - extern void func_8001534C(int, void *, int, int, int, int); - extern S10_80136C90 D_8019CCEC; - - S10_80136C90 buf = D_8019CCEC; - func_8001534C(0, &buf, 0x78, 0x10, 0, 0); -} - - - -DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ - -DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80136DFC); - -DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ - -DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80136F3C); - -DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80137178); - -DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ - -DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80137614); - -DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ - -DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801376E8); - -DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ - -DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801378F0); - -DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ - -DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801379FC); - - -// @class: remat -// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer -extern s32 D_80127548[]; -extern int D_80181C6C; -extern int D_801269F0; -extern void func_80138BE0(int p); - -void func_80137B80(void) { - int *p = &D_801269F0; - (*(int *)&D_80127548) = 0x24; - if (*p != 0) { - ((void (*)(int *))func_80138BE0)(p); - } - D_80181C6C += 1; -} - - -DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. - -extern unsigned char D_80126A0E; -extern short D_80126A0A; -extern s16 D_801269F4; -extern int D_800A5E60; -extern int D_80181C6C; -extern int D_801269F0; - -extern void func_801392FC(); -extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); -extern void func_80139680(s32 a0, u8 *a1); - -int func_80137D08(int arg0, int arg1, short arg2) -{ - unsigned char buf[3]; - - D_800A5E60 = arg0; - D_80126A0A = arg2; - ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); - if ((*(short *)&D_801269F4) == 7) { - buf[0] = 0x39; - buf[1] = 0xFF; - buf[2] = 0x71; - ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); - } else if ((*(short *)&D_801269F4) == 3) { - if (D_80181C6C & 4) { - ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); - } - } - return D_800A5E60; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80137DD4); - -DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80181C70[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80181C70[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80181CB4; -extern u8 D_80181CF8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80181CB4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80181CF8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181D3C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80181D78[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80181D78; - if (((s16)a1) < 0xC00) { - tbl = D_80181D3C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80181DB4, D_80181DB6, D_80181DB8, D_80181DBA, D_80181DBC, D_80181DBE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80181DB6 < ang)) goto outer_else; - if (!(ang < D_80181DBC)) goto inner_else; - if (ang < D_80181DB8) { *(s16 *)L = D_80181DB8; goto done; } - if (D_80181DBA < ang) { *(s16 *)L = D_80181DBA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80181DB4) { *(s16 *)L = D_80181DB4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80181DBE < ang) { *(s16 *)L = D_80181DBE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019DD78; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019DD78, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019DD78; -extern s8 D_8019DD7C; -extern s8 D_8019DD7D; - -void func_8013C9C4(void * arg0) -{ - D_8019DD78 = arg0; - D_8019DD7C = 0; - D_8019DD7D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019DD78; -extern s8 D_8019DD7C; -extern s8 D_8019DD7D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019DD78; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019DD7D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019DD7C)) * 2) + D_8019DD78); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019DD7D = (unsigned char) p[1]; - D_8019DD7C = D_8019DD7C + 1; - if (D_8019DD7D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019DD7C = 0; - *base = 0; - } - } - else - { - D_8019DD7D = c - 1; - } - } - return; -} - - - -extern s32 D_8019DD9C; -extern s32 D_8019DD90; -extern s32 D_8019DD94; -extern s32 D_8019DDA0; - -void func_8013CABC(void) { - D_8019DD9C = 1; - D_8019DD90 = 1; - D_8019DD94 = 0; - D_8019DDA0 = 1; -} - - - -extern s32 D_8019DD90; -extern s32 D_8019DD94; -extern s32 D_8019DD98; -extern s32 D_8019DD9C; -extern s32 D_8019DDA0; - -void func_8013CAE8(void) { - D_8019DD90 = 1; - D_8019DD9C = 0; - D_8019DD94 = 0; - D_8019DD98 = -1; - D_8019DDA0 = 0; -} - - - -extern s32 D_8019DD9C; -extern s32 D_8019DDA0; -extern s32 D_8019DDC8; -extern s32 D_8019DDCC; - -void func_8013CB20(void) -{ - D_8019DDC8 = D_8019DDA0; - D_8019DDCC = D_8019DD9C; - D_8019DDA0 = 1; - D_8019DD9C = 0; -} - - - -extern s32 D_8019DDC8; -extern s32 D_8019DDCC; -extern s32 D_8019DDA0; -extern s32 D_8019DD9C; - -void func_8013CB5C(void) { - D_8019DDA0 = D_8019DDC8; - D_8019DD9C = D_8019DDCC; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019F1D0; - extern u8 D_8019F1D1; - extern u8 D_8019F1D2; - extern u8 D_8019F1D3; - extern u8 D_8019F1D4; - extern u8 D_8019F1D5; - extern u8 D_8019F1D6; - extern u8 D_8019F1D7; - extern u8 D_8019F1D8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019F1D0; t1 = D_8019F1D1; t2 = D_8019F1D2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019F1D3; t1 = D_8019F1D4; t2 = D_8019F1D5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019F1D6; t1 = D_8019F1D7; t2 = D_8019F1D8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019DDA8; -extern s32 D_8019DD90; -extern s32 D_8019DDAC; -extern s32 D_8019DD9C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019DDA8 != 0) { - if (D_8019DDA8 != 2) { - if (((D_8019DDA8 < 3) && (D_8019DDA8 == 1)) && - (D_8019DDAC = D_8019DDAC + 1, 0x23a < D_8019DDAC)) { - D_8019DD90 = D_8019DDA8; - D_8019DDA8 = 2; - } - } else { - D_8019DD90 = D_8019DD90 + -1; - if (D_8019DD90 == 0) { - D_8019DD90 = D_8019DDA8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019DD9C == 0) { - D_8019DDA8 = D_8019DDA8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019DD9C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019DD9C; -} - - - -extern s32 D_8019DDA8; - -void func_8013D164(void) { - D_8019DDA8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019F2B2; -extern u8 D_8019F326; -extern u8 D_8019F1DA; -extern u8 D_8019F294; -extern u8 D_8019F1B8; -extern u8 D_8019F1D9; -extern s32 D_8019F298; - -void func_8013D330(void) { - if ((D_8019F2B2 & 0xff) != D_8019F326) { - D_8019F2B2 = ((D_8019F2B2 & 0xff) < D_8019F326) ? (D_8019F2B2 + 1) : (D_8019F2B2 - 1); - } - if ((D_8019F1DA & 0xff) != D_8019F294) { - D_8019F1DA = ((D_8019F1DA & 0xff) < D_8019F294) ? (D_8019F1DA + 1) : (D_8019F1DA - 1); - } - if ((D_8019F1B8 & 0xff) != D_8019F1D9) { - D_8019F1B8 = ((D_8019F1B8 & 0xff) < D_8019F1D9) ? (D_8019F1B8 + 1) : (D_8019F1B8 - 1); - } - D_8019F298 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019DD80; -extern void *D_8019DD84; -extern void *D_8019DD88; -extern s32 D_8019DDB0; -extern s32 D_8019DDB4; -extern s32 D_8019DDB8; -extern s32 D_8019F20C[]; - -extern u8 D_80181EAC[]; -extern u8 D_80181F54[]; -extern u8 D_80181E04[]; -extern u8 D_80181F00[]; -extern u8 D_80181F80[]; -extern u8 D_80181E58[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019DDB0 = param_2; - D_8019DDB4 = (param_2 >> 2) & 3; - D_8019DDB8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019DD80 = D_80181EAC; - D_8019DD84 = D_80181F54; - D_8019DD88 = D_80181E04; - } else { - D_8019DD80 = D_80181F00; - D_8019DD84 = D_80181F80; - D_8019DD88 = D_80181E58; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019DDB8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019DDB0 & 2) != 0) { - D_8019F20C[0] = 0x140; - D_8019F20C[3] = 0x80; - if (p[0x37] == 4) { - D_8019F20C[0] = 0x140; - D_8019F20C[3] = 0; - } - if (p[0x37] == 0) { - D_8019F20C[0] = 0x140; - D_8019F20C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019DD88)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019DD88; -extern s16 *D_8019DD8C; -extern s32 D_8019DD9C; -extern s32 D_8019DDBC; -extern s32 D_8019DDC0; -extern s32 D_8019DDC4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019DD8C != 0) { - D_8019DD9C = 0; - p = (int *)(param_1 * 12 + (int)D_8019DD88); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019DDBC != x) { - flag = 1; - if (D_8019DDBC < x) { - if (x - D_8019DDBC < 5) { - D_8019DDBC = x; - } else { - D_8019DDBC = D_8019DDBC + 4; - } - } else { - if (D_8019DDBC - x < 5) { - D_8019DDBC = x; - } else { - D_8019DDBC = D_8019DDBC - 4; - } - } - } - if (D_8019DDC0 != y) { - flag = 1; - if (D_8019DDC0 < y) { - if (y - D_8019DDC0 < 5) { - D_8019DDC0 = y; - } else { - D_8019DDC0 = D_8019DDC0 + 4; - } - } else { - if (D_8019DDC0 - y < 5) { - D_8019DDC0 = y; - } else { - D_8019DDC0 = D_8019DDC0 - 4; - } - } - } - if (D_8019DDC4 != z) { - flag = 1; - if (D_8019DDC4 < z) { - if (z - D_8019DDC4 < 5) { - D_8019DDC4 = z; - } else { - D_8019DDC4 = D_8019DDC4 + 4; - } - } else { - if (D_8019DDC4 - z < 5) { - D_8019DDC4 = z; - } else { - D_8019DDC4 = D_8019DDC4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019DD9C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182010[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019DD8C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019DDBC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019DDC0); - uVar5 = (*(int*)&D_8019DDC4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182010); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019DDA4; - -s32 func_8013E054(void) { - return D_8019DDA4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80182A0C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801829E4; -extern s16 D_801829E6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80182A0C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801829E4 = 2; - D_801829E6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801829E6 = 0; - D_801829E4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019DDD8; - extern void * D_8019DDDC; - extern unsigned char D_80182684; - extern unsigned char D_8018269C; - extern unsigned char D_80182710; - extern unsigned char D_80182718; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019DDD8 = &D_80182684; - D_8019DDDC = &D_80182710; - } else { - D_8019DDD8 = &D_8018269C; - D_8019DDDC = &D_80182718; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80182A0C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80182A0C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80182A0C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801829E8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801829E8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801829E8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801829E4; -extern s16 D_801829E6; -extern unsigned char D_801829E8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801829E6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801829E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801829E6; - if (*r < 3) { - *r = *r + 1; - } - D_801829E4 = (u16)D_801829E4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801829E8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801829E8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801829E8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013FAF8); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8013FFD8); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8014032C); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80140608); - - -// @class: iv-combine -// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source -// pointer compile to fixed offsets when written base[0..n]; the target advances -// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead -// final increment, yielding the "increment N-2 then offset 0/2" tail). - -extern u8 *D_801826C4; -extern u8 *D_801826C8; -extern u8 *D_801826CC; -extern u8 *D_801826D0; -extern u8 *D_801826D4; -extern u16 *D_801826D8[]; -extern u16 *D_801826E0[]; -extern u16 *D_80182700[]; - -extern s32 func_80028D58(void); -extern s32 func_80028DE0(void); -extern s32 func_80028FBC(void); -extern s32 func_80029000(void); -extern s32 func_80028D9C(void); - -void func_801407F4(void) -{ - u8 *puVar1; - s32 iVar2; - u16 *puVar3; - - puVar1 = D_801826C4; - iVar2 = func_80028D58(); - puVar3 = D_801826D8[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - puVar1 = D_801826C8; - iVar2 = func_80028DE0(); - puVar3 = D_801826D8[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - iVar2 = func_80028FBC(); - *(s16 *)(D_801826CC + 0x18) = *D_801826E0[iVar2]; - iVar2 = func_80029000(); - *(s16 *)(D_801826D0 + 0x18) = *D_801826E0[iVar2]; - - puVar1 = D_801826D4; - iVar2 = func_80028D9C(); - puVar3 = D_80182700[iVar2]; - *(s16 *)(puVar1 + 0x12) = *puVar3++; - *(s16 *)(puVar1 + 0x14) = *puVar3++; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - *(s16 *)(puVar1 + 0x1c) = *puVar3++; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80140958); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80140D68); - - -// @class: struct -// @stuck: none — MATCH - -extern unsigned char D_80078E7F; -extern unsigned char D_80078E7E; -extern unsigned char D_80078E7D; -extern M2C_UNK D_80182600; - -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); - -void func_80140E6C(void) { - void *puVar1; - unsigned int uVar2; - unsigned int uVar3; - unsigned int uVar4; - - puVar1 = (*(void * *)&D_80182600); - uVar2 = func_800D2CA8(D_80078E7F, 0x18); - uVar3 = func_800D2CA8(D_80078E7E, 0xc); - uVar4 = func_800D2CA8(D_80078E7D, 0); - func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); -} - - - - -// @class: plumbing -// @stuck: none — MATCH (128/128 ins, match_one confirmed) - -extern short D_80115128; -extern u8 D_80182610; -extern char *D_80182630; -extern char *D_80182634; -extern char *D_80182638; -extern char *D_8018263C; -extern char *D_80182640; - -extern int func_80029FE4(void); -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); -extern char *func_8002AAB4(void); -extern char *strcpy(char *, const char *); -extern int func_8002A26C(void); -extern int func_8002A2B0(void); -extern int func_8002A4B8(void); -extern s32 func_8002A4FC(s32 a0); -extern int func_8002A998(void); -extern int func_8002A9DC(void); -extern int func_8002A728(void); -extern int func_8002A76C(void); -extern int func_80029FD4(void); - -void func_80140F00(void) { - char *p; - int r; - - if (D_80115128 == 0) { - p = (*(char * *)&D_80182610); - r = func_800D2CA8(func_80029FE4() + 1, 0x18); - func_800D2D10(r, 2, p + 4, 1); - strcpy(p + 0xA, func_8002AAB4()); - - p = D_80182630; - r = func_800D2CA8(func_8002A26C() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A2B0(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182634; - r = func_800D2CA8(func_8002A4B8() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182638; - r = func_800D2CA8(func_8002A998() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A9DC(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_8018263C; - r = func_800D2CA8(func_8002A728() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A76C(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80182640; - r = func_800D2CA8(func_80029FD4(), 4); - func_800D2D10(r, 7, p + 0x18, -1); - } -} - - - -// @class: other -// @stuck: none — MATCH - -extern short D_80115128; -extern unsigned short D_80115172; -extern unsigned short D_801824CA; -extern unsigned short D_801824CE; -extern unsigned short D_801824D2; -extern unsigned short D_801824D6; - -extern s32 func_8002A1B4(void); -extern short func_8002A28C(void); -extern short func_8002A27C(void); -extern s32 func_8002A400(void); -extern short func_8002A4D8(void); -extern short func_8002A4C8(void); -extern s32 func_8002A8E0(void); -extern short func_8002A9B8(void); -extern short func_8002A9A8(void); -extern s32 func_8002A670(void); -extern short func_8002A748(void); -extern short func_8002A738(void); -extern int func_801412A8(int, int, int, int, int, int); - -int func_80141100(int param_1) -{ - short sVar1; - int iVar7; - - if (D_80115128 == 0) { - iVar7 = D_80115172 + 0x31; - sVar1 = D_801824CA; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); - sVar1 = D_801824CE; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); - sVar1 = D_801824D2; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); - sVar1 = D_801824D6; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); - } - return param_1; -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801412A8); - -DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ - -DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ - -DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ - - -extern unsigned short D_80115112; -extern void (*D_80182A60[])(void); - -void func_80141788(void) -{ - D_80182A60[D_80115112](); -} - - -DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ - -DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80141874); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801418F8); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80141A60); - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80141B90); - -DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) - -extern u16 D_80115110; -extern u8 D_801829C0; -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80141C0C(s32 param_1) -{ - func_8002D4C8(*(u16 *)(&D_801829C0 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); -} - - -DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ - -DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ - -DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ - -DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_801424E4); - - -extern void (*D_80182AA0[])(void); - -void func_801425CC(void *a0) { - D_80182AA0[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: schedule -// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail - -extern void func_8012C1B8(void); -extern s32 func_8012C1DC(s32 a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012CAE4(void *a0); -extern s32 func_8012AD50(void *a0); -extern s32 D_80182A84; - -void func_80142608(s32 param_1) -{ - register s32 iVar1 __asm__("$16"); - - if (*(short *)(param_1 + 0x70) != 0) { - iVar1 = ((s32 (*)(void))func_8012C1B8)(); - } else { - iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); - } - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CA1C(iVar1, (s32)&D_80182A84); - *(short *)(iVar1 + 0x1a) = 0x200; - *(short *)(iVar1 + 0x18) = 0x200; - *(short *)(param_1 + 0xfc) = 0x40; - if (*(short *)(param_1 + 0x70) != 0) { - goto ad50; - } - if (*(s32 *)(param_1 + 100) != 0) { - *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); - goto ad50; - } - } - ((void (*)(s32))func_8012CAE4)(param_1); - return; -ad50: - *(short *)(param_1 + 0x98) = 0; - *(s32 *)(param_1 + 0x90) = 0; - ((void (*)(s32))func_8012AD50)(param_1); -} - - -DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ - -DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ - -DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ - -DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ - -DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80182AB4[])(); - -void func_801427EC(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80182AB4[*(u16 *)(param_1 + 2)](); - } -} - - -DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ - -DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80182AD0[])(); - -void func_8014292C(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80182AD0[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80182CA0[])(); - -void func_80142978(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80182CA0[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80182D58[])(); - -void func_801429C4(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80182D58[*(u16 *)(param_1 + 2)](); - } -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80142A10); - - -// @class: struct -// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) - -extern u16 D_800B99D8; -extern struct packed_word D_8019D428; -extern u8 D_8019DDE0; -extern u8 D_8019DDE1; -extern u8 D_8019DDE2; - -void func_80142A80(void) -{ - u16 flags; - union word_bytes local; - s32 mul; - - flags = D_800B99D8; - local.pw = D_8019D428; - - if (flags & 0x10) { - mul = (s8)((flags & 0xf) >> 1) + 9; - } else { - mul = 0x10 - (s8)((flags & 0xf) >> 1); - } - - D_8019DDE0 = mul * (local.b[0] >> 4); - D_8019DDE1 = mul * (local.b[1] >> 4); - D_8019DDE2 = mul * (local.b[2] >> 4); -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80142B2C); - -DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ - -DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ - -DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ - -DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ - -DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ - -DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern int D_80182AA8; - -void func_80142DC4(int param_1) -{ - int v0; - - *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_80182AA8); - *(short *)(v0 + 0x1a) = 0x1800; - *(short *)(v0 + 0x18) = 0x1800; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80182AC4[]; - -void func_80142E38(int param_1) -{ - short sVar1; - int iVar2; - - *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_80182AC4); - sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; - *(short *)(iVar2 + 0x1a) = sVar1; - *(short *)(iVar2 + 0x18) = sVar1; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80142EC0); - -DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ - -DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result -// survives across func_8001CA1C while $v0 serves the pre-call store/test; -// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80182CB0[]; -extern unsigned char D_80182D10[]; - -void func_8014305C(int param_1) -{ - register int s0_param __asm__("$16") = param_1; - register int s1_copy __asm__("$17"); - int iVar2; - short sVar1; - - iVar2 = ((int (*)(void))func_8012C1B8)(); - *(int *)(s0_param + 0x20) = iVar2; - s1_copy = iVar2; - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(s0_param); - } else { - ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80182CB0); - sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; - *(short *)(s1_copy + 0x1a) = sVar1; - *(short *)(s1_copy + 0x18) = sVar1; - *(short *)(s0_param + 0xfc) = 0; - func_8012A828(s0_param, D_80182D10); - ((void (*)(int))func_80142B2C)(s0_param); - } -} - - -DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ - -DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) - - -extern void *memcpy(void *, const void *, u32); - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern int func_8001CA88(int, void *); -extern s32 func_8012E504(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80142B2C(void *arg0); - -extern u8 D_8019D424; -extern u8 D_8019DDE0; -extern u8 D_8019DDE4; - -void func_801431E8(s32 param_1) { - u8 buf[8]; - s32 iVar5; - u16 uVar2; - s16 sVar4; - - register s32 d __asm__("$16"); - memcpy(buf, &D_8019D424, 4); - iVar5 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = iVar5; - d = iVar5; - if (iVar5 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, void *))func_8001CA88)(d, &D_8019DDE0); - uVar2 = *(u16 *)(param_1 + 0x70); - *(s16 *)(d + 0x76) = -0x10; - sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; - *(s16 *)(d + 0x1a) = sVar4; - *(s16 *)(d + 0x18) = sVar4; - *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; - if (func_8012E504(param_1, 0x33) == 0) { - *(s16 *)(param_1 + 0xfc) = 1; - func_800233CC(&D_8019DDE0, 0x10); - memcpy(&D_8019DDE4, buf, 4); - } else { - *(s16 *)(param_1 + 0xfc) = 0; - } - ((void (*)(s32))func_80142B2C)(param_1); - } -} - - -DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ - -DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ - -DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) - -extern u8 D_800D387C[]; -extern u32 D_80182E68[]; - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80143458(s32 param_1) -{ - s32 p; - u16 v; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - p = *(s32 *)(param_1 + 0x20); - if (*(s32 *)(p + 4) == 0) { - *(s32 *)(p + 4) = 0x50000000; - } - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - v = *(u16 *)(param_1 + 0x34) & 0x7fff; - if (v != 0) { - p = *(s32 *)(param_1 + 0x20); - *(u16 *)(p + 0x1a) = v; - *(u16 *)(p + 0x18) = v; - } - - func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, - D_80182E68[*(u16 *)(param_1 + 0x34) & 3]); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - -DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_8014358C); - -DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ - -DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ - -DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ - -DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ - -DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ - -DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ - - -extern void (*D_80182F90[])(void); - -void func_80143B30(void *a0) { - D_80182F90[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ - -DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ - - -extern void (*D_80182F9C[])(void); - -void func_80143C38(void *a0) { - D_80182F9C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ - - -extern void (*D_80182FA4[])(void); - -void func_80143C98(void *a0) { - D_80182FA4[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80143D28); - - -extern void (*D_80182FEC[])(void); - -void func_80143E68(void *a0) { - D_80182FEC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ - -DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ - -DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ - -DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ - - -extern void (*D_80183000[])(void); - -void func_80144054(void *a0) { - D_80183000[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80144090); - -extern void func_8012C218(void *a0); - -// @class: struct -// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) - -extern void (*D_80183008[])(); - -void func_801442F8(int param_1) -{ - int iVar1; - - D_80183008[*(u16 *)(param_1 + 2)](); - iVar1 = *(int *)(param_1 + 0x1c) + 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (0x1d < iVar1) { - func_8012C218(param_1); - } -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); -extern u8 D_80182F84; - -void func_80144364(int param_1) { - int iVar3; - u16 uVar2; - s16 sVar1; - - iVar3 = ((s32 (*)(void))func_8012C194)(); - if (iVar3 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); - *(int *)(param_1 + 0xCC) = iVar3; - *(u16 *)(param_1 + 0xFC) = uVar2; - func_8001CB6C((u8 *)iVar3, (s32)&D_80182F84, 0x250, 0x1A0); - *(s32 *)(iVar3 + 4) = 0x60000000; - *(u8 *)(iVar3 + 0x27) = 0x14; - *(u16 *)(iVar3 + 0x10) = 0x400; - *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); - *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); - *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); - sVar1 = *(s16 *)(param_1 + 0x70); - if (sVar1 != 0) { - *(s16 *)(iVar3 + 0x1A) = sVar1; - *(s16 *)(iVar3 + 0x18) = sVar1; - } else { - *(u16 *)(iVar3 + 0x1A) = 0x2000; - *(u16 *)(iVar3 + 0x18) = 0x2000; - } - *(u16 *)(param_1 + 2) = 1; - } -} - - - - -extern void func_80016714(void *a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_8012AD80(s32 a0); -extern void func_8012C218(void *a0); -extern s32 D_80182F98; - -void func_80144458(void *arg0) { - s32 temp_s0; - void *temp_s2; - void *temp_v0; - - temp_s2 = M2C_FIELD(arg0, void **, 0xCC); - if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { - temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); - if (temp_v0 != NULL) { - temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; - M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80182F98 * 0x10); - M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80182F98 * 0x10); - func_8012AD80(arg0); - } - } - M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); - M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); - M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); - if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { - func_80016714(temp_s2, 0x38); - func_8012C218(arg0); - } -} - - -DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ - -DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ - -DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern u8 D_80182FAC; -extern u8 D_80182FB8; - -void func_8014477C(void *param_1) { - s32 v0; - s32 v1; - register s32 uVar2 __asm__("$2"); - register s32 addr __asm__("$3"); - s32 gv; - s32 fv; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)((s32)param_1 + 0x20) = v0; - if (v0 == 0) { - func_8012CAE4(param_1); - return; - } - ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80182FAC); - if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { - *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); - uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); - if (uVar2 != 0) { - addr = uVar2 & 0xFFFFFFF; - gv = *(u16 *)((addr | 0x80000000) + 8); - fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; - *(u16 *)((s32)param_1 + 0xA) = gv + fv; - } else { - *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; - } - } - ((void (*)(void *, void *))func_8012A828)(param_1, &D_80182FB8); - v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; - *(s16 *)((s32)param_1 + 0x2) = 1; - *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; - *(s32 *)((s32)param_1 + 0x1C) = 0x78; -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); - -extern u8 D_80182F84; -extern u8 D_80182FF4; - -void func_80144880(s32 param_1) -{ - register s32 obj __asm__("$16"); /* $s0 */ - register s32 self __asm__("$17") = param_1; /* $s1 */ - register s32 b __asm__("$2"); /* $v0 */ - s32 e; - - obj = ((s32 (*)(void))func_8012C194)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(self); - } else { - *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); - *(s32 *)(self + 0xCC) = obj; - if (*(s16 *)(self + 0x70) == 1) { - func_8001CB6C((u8 *)obj, (s32)&D_80182F84, 0x250, 0x1A0); - b = 0x14; - } else { - func_8001CB6C((u8 *)obj, (s32)&D_80182FF4, 0x300, 0x1D0); - b = 0x6A; - } - *(u8 *)(obj + 0x27) = (u8)b; - *(s32 *)(obj + 4) = 0x60000000; - *(u16 *)(obj + 0x10) = 0x400; - *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); - *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); - e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); - *(u16 *)(obj + 0x1A) = 0x4000; - *(u16 *)(obj + 0x18) = 0x4000; - *(u16 *)(obj + 0xC) = (u16)e; - *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; - } -} - - -DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ - - -extern void (*D_80183010[])(void); - -void func_801449C8(void *a0) { - D_80183010[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ - - -extern void (*D_80183018[])(void); - -void func_80144A2C(void *a0) { - D_80183018[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ - -DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ - -DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ - -DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004", func_80144B14); diff --git a/src/ov_SC05_004/ov_SC05_004_jr_8012ACE0.c b/src/ov_SC05_004/ov_SC05_004_jr_8012ACE0.c new file mode 100644 index 000000000..34916a65a --- /dev/null +++ b/src/ov_SC05_004/ov_SC05_004_jr_8012ACE0.c @@ -0,0 +1,2827 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019CA98; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80181904[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019DC94; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019F2B8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019CA98; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181640)(); +extern s16 (*D_80181644)(); +extern M2C_UNK (*D_8018164C)(); +extern s32 (*D_80181650)(); +extern s32 D_8019DC90; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019CA9C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80181998; +extern void func_8012ACA0(void *arg0); +/* ==== end §8b carried decl layer ==== */ + + + + +// @class: iv-combine +// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ + +s32 func_8012ACE0(void *o) { + int i; + for (i = 0; ; i++) { + switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { + case -2: + case -1: + case 0: + return i; + case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ + default: + break; + } + } +} + +DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ + +DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ + + + +void func_8012AD64(s32 *a0, s16 a1) { + *(s16*)((s32)a0 + 0x34) = a1; +} + + +DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ + +DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ + +DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ + +DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ + +DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ + +DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ + +DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ + +DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ + +DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ + +DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ + +DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ + +DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ + +DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ + +DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ + +DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ + +DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ + +DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012B4B8); + +DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ + +DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ + +DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ + +DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012B77C); + +DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ + +DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ + +DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ + +DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ + +DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ + +DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ + +DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ + +DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ + +DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ + +DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ + +DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ + +DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ + +DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ + +DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ + + +void func_8012BF4C(s32 *a0, s32 a1) { + *(s32*)((s32)a0 + 0x1C) = a1; +} + + +DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ + +DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ + +DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ + +DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ + +DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012C098); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012C0EC); + +DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ + +DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ + +DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ + +DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ + +DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ + +DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ + +DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ + +DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ + +DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ + +DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ + +DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012C658); + +DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012C750); + +DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to +// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS +// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via +// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store +// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. +// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). + +extern s32 D_80184E7C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern void func_80016714(void *a0, s32 a1); + +s32 func_8012C890(s32 a0, s32 a1, s32 a2) { + u8 *src = (u8 *)a0; + u8 *dst = (u8 *)a1; + u16 *d; + s16 count; + u16 v2, v4; + s32 v10; + void *obj; + + *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); + v2 = *(u16 *)(src + 0x0); + *(u16 *)(dst + 0x6) = v2; + *(u16 *)(dst + 0x88) = v2; + v2 = *(u16 *)(src + 0x2); + *(u16 *)(dst + 0xA) = v2; + *(u16 *)(dst + 0x8A) = v2; + v4 = *(u16 *)(src + 0x4); + *(u16 *)(dst + 0xC) = 0; + *(u16 *)(dst + 0x8) = 0; + *(u16 *)(dst + 0x4) = 0; + *(u16 *)(dst + 0xE) = v4; + *(u16 *)(dst + 0x8C) = v4; + *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); + *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; + *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); + v10 = *(s32 *)(src + 0x10); + *(s32 *)(dst + 0x78) = (s32)&D_80184E7C; + *(s32 *)(dst + 0xDC) = v10; + + { + register u16 *pc __asm__("$3"); + pc = &(*(u16 *)&D_801270C4); + *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; + count = *(volatile u16 *)pc + 1; + *pc = count; + if (count == 0) { + *pc = 1; + } + } + + if (a2 != 0) { + *(s32 *)(dst + 0x64) = a2; + *(s32 *)(dst + 0x68) = 0; + } else { + *(s32 *)(dst + 0x64) = 0; + *(s32 *)(dst + 0x68) = (s32)src; + } + + *(u16 *)(src + 0xA) |= 0x8000; + *(u16 *)(dst + 0x2) = 0; + d = D_801274E4; + *d &= 0xFFFE; + (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); + + if (*d & 1) { + s32 a1v; + obj = *(void **)(dst + 0x20); + if (obj != 0) { + s32 t = *(u16 *)obj; + if (t != 1) { + if (t != 2) { + goto done; + } + a1v = 0x38; + } else { + a1v = 0x84; + } + func_80016714(obj, a1v); + done:; + } + func_80016714(dst, 0x10C); + *(u16 *)(src + 0xA) &= 0x7FFF; + return 0; + } + + if (*(s32 *)(dst + 0x64) == 0) { + void *o = *(void **)(dst + 0x20); + if (o == 0) { + return (s32)dst; + } + if (*(u16 *)o == 1) { + s16 c = *(s16 *)(src + 0xC); + if (c != 0x7FFF) { + *(s16 *)((u8 *)o + 0x12) = c; + } + } + } + if (*(s32 *)(dst + 0x20) != 0) { + *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); + } + return (s32)dst; +} + + +DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ + +DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ + +DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ + +DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ + +DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ + +DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ + +DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ + +DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012CC88); + +DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ + +DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ + +DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ + +DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ + +DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ + +DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ + +DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ + +DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ + +DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ + +DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ + +DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH + + +struct S8012D664_8012D664 { short a, b, c; }; + +int func_8012D664(int arg0, int arg1, int arg2) { + extern int func_8012F568(); + extern int D_801819A8; + + struct S8012D664_8012D664 s; + int ret; + int t; + + s.a = (*(unsigned short*)&D_80126B5E); + s.b = (*(unsigned short*)&D_80126B62) - 0x40; + s.c = (*(unsigned short*)&D_80126B66); + ret = ((int(*)())func_800132BC)(arg0, &s); + t = arg1 + 0x20; + if (ret < t * t) { + func_8012F568(1, 1, 0, arg2, arg0, &D_801819A8); + return 1; + } + return 0; +} + + + +DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ + + + +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801819B0; +extern M2C_UNK D_801819B8; + +s32 func_8012DB84(void) +{ + func_8014C978(); + func_8012F568(1, 0xC001, 0, 0x3E8, &D_801819B0, &D_801819B8); +} + + +DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH + + +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; + + +s32 func_8012DDA4() +{ + extern Entry_8012DDA4 * D_8019DCB4; + extern Entry_8012DDA4 * D_8019DCB0; + + Entry_8012DDA4 *p; + Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); + + while (D_8019DCB4 != end) { + p = D_8019DCB4; + if (p->active != 0 && p != D_8019DCB0) { + D_8019DCB4 = p + 1; + return p; + } + D_8019DCB4++; + } + D_8019DCB4 = 0; + return 0; +} + + + +// @class: plumbing +// @stuck: none — MATCH (35/35 ins, relocation-masked) + + +s32 func_8012DE2C(s32 a0) { + extern u8 * D_8019DCB4; + extern u8 * D_8019DCB0; + + u8 *base; + u8 *end; + u8 *p; + + base = D_801202A0; + end = base + 0x6480; + D_8019DCB4 = base; + D_8019DCB0 = ((u8 *)a0); + + while (D_8019DCB4 != end) { + p = D_8019DCB4; + if (*(u16 *)p != 0 && p != ((u8 *)a0)) { + D_8019DCB4 = p + 0x10C; + return p; + } + D_8019DCB4 += 0x10C; + } + D_8019DCB4 = 0; + return 0; +} + + + +DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ + +DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ + +DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ + +DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ + +DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012E014); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012E138); + + +s32 func_8012E27C(void) { + return 1; +} + + +DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ + +DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ + +DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012E364); + +DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ + +DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ + +DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ + +DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ + +DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH +extern u8 D_800AF648; +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) +{ + struct { short xy[2]; int sp14; int flag; } f; + register void *p __asm__("$4"); + p = &D_800AF648; + func_8004914C(p); + func_800491AC(&D_800AF648); + RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); + if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { + func_8002D4C8(param_2, param_3); + } +} + + +DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012E778); + +DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ + +DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ + +DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ + +DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ + + + +// @class: other +// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) + +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801819C0; + +void func_8012E9C0(int param_1) +{ + int iVar1; + + if (*(short *)(param_1 + 0x60) != 0) { + if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { + *(short *)(param_1 + 0x82) = 0; + *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); + *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); + *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); + } + if (*(int *)(param_1 + 0x78) != 0) { + iVar1 = *(short *)(param_1 + 0x60) * + *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; + if (iVar1 < 1) { + iVar1 = 1; + } + } else { + iVar1 = *(short *)(param_1 + 0x60); + } + func_8016AA50(param_1, iVar1); + if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { + func_8016B428(param_1); + func_80019064(&D_801819C0); + } + } + return; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012EA90); + +DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ + +DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ + +DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ + +DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012EFB8); + + +// @class: other +// @stuck: none — MATCH (33 ins, match_one verified) + +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); + +void func_8012F038(int param_1, short *param_2, short *param_3) { + int in[3]; + int out[3]; + + in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); + in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); + in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); + ApplyTransposeMatrixLV((void *)param_1, in, out); + param_3[0] = out[0]; + param_3[1] = out[1]; + param_3[2] = out[2]; +} + + +DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(s32 a0, s32 a1, void *a2); + +void func_8012F14C(s32 a0, s32 a1, s32 a2) +{ + s32 buf[2]; + func_8004914C((void *)a0); + func_800491AC((void *)a0); + RotTransSV(a1, a2, buf); +} + + +DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ + +DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012F274); + +DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ + +DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012F40C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_8012F49C); + +DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ + +DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ + +DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ + +DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ + +DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801819DC[]; + +void func_8012F828(int param_1) +{ + *(unsigned char *)(param_1 + 0xC1) = 4; + if (*(unsigned int *)(param_1 + 0xB4) & 8) { + func_80131170(param_1, D_801819DC, 0xB); + } + func_80131CA8(param_1, 9); +} + + +DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ + + +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern void func_80131CA8(int a0, int a1); +extern u8 D_801819E8[]; + +void func_8012F8C8(u8* arg0) { + *(u8*)(arg0 + 0xC1) = 7; + if (*(u32*)(arg0 + 0xB4) & 0x80) { + ((void (*)(void*, void*, s32))func_80131170)(arg0, D_801819E8, 0xB); + } + ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); +} + + +DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ + +DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ + +DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ + +DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ + +DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. +// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for +// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be +// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an +// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). +// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: +// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. +// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which +// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because +// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. +// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out +// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, +// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what +// blocks reorg from sharing a downstream constant into a branch delay slot.) + + +s32 func_8012FCC4(s32 param_1) { + extern int D_801819F4; + + int v1 = *(int *)(((int)param_1) + 0xC4); + *(char *)(((int)param_1) + 0xC1) = 8; + if (v1 & 2) { + *(char *)(((int)param_1) + 0xC1) = 1; + func_80131CA8(((int)param_1), 3); + return; + } + if (v1 & 1) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 1); + return; + } + if (*(int *)(((int)param_1) + 0xB4) & 0x100) { + ((void (*)(int))func_80131B14)(((int)param_1)); + if (*(short *)(((int)param_1) + 0x76) <= 0) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); + return; + } + if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { + *(char *)(((int)param_1) + 0xC2) = 0; + } else { + *(short *)(((int)param_1) + 0x98) = 0; + *(char *)(((int)param_1) + 0xC2) = 1; + } + ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_801819F4); + *(int *)(((int)param_1) + 0x1C) = 0; + func_80131CA8(((int)param_1), 0x1C); + return; + } + func_80131CA8(((int)param_1), 0x1C); +} + + + +DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ + +DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ + +DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ + +DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ + +DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ + +DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ + +DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ + +DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ + +DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ + +DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ + +DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ + +DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ + +DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ + +DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ + +DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ + +DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ + +DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80130650); + +DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ + +DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ + +DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ + +DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ + +DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ + +DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80130A18); + +DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ + +DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80130C08); + + +extern void (*D_801819FC[])(void); + +void func_80130D0C(void *a0) { + D_801819FC[*(u8 *)((s32)a0 + 0xC1)](); +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181A4C[]; +extern s16 D_80181A7C[]; +extern s16 D_80181ADC[]; +extern s16 D_80181AE4[]; +extern s16 D_80181B04[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181A7C; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80181ADC; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181AE4; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80181B04; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80181A4C; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + + +// @class: loop-guard +// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps +// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` +// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); +// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's +// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC +// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). + + +void func_80131170(s32 p, s32 b, s32 c) { + extern u8 D_801819D0[]; + + func_80131B14(); + *(u8 *)(((u8 *)p) + 0xC2) = 0; + *(u8 *)(((u8 *)p) + 0xC3) = 0; + *(s16 *)(((u8 *)p) + 0x98) = 0; + if (((u8 *)b) == 0) { + ((u8 *)b) = D_801819D0; + } + func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); + *(s32 *)(((u8 *)p) + 0x1C) = 0; + if (c != 0) { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } else { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } +tail: + if (*(s16 *)(((u8 *)p) + 0x76) > 0) { + return; + } + if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); + } else { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); + } +} + + + +// @class: struct +// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) + +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ + + +s32 func_801312D0(s32 param_1, void *param_2) +{ + extern int func_80131CF4(int, int); + extern M8_801312D0 D_80181B24; + + int iVar5; + + iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); + if (iVar5 != 0) { + ((short *)param_2)[2] = 0; + ((short *)param_2)[0] = 0; + ((short *)param_2)[1] = (short)iVar5; + } else { + *(M8_801312D0 *)((short *)param_2) = D_80181B24; + } +} + + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80131340); + +DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80131A34); + +DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` +// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be +// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a +// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). +// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; +// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the +// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); +// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. + +void func_80131B14() { + extern void func_8002A520(void *); + extern void func_8002A790(void *); + extern u8 D_80181B2C; + + register u8 *a0v __asm__("$4"); + u8 *p = a0v; + + + s32 e = *(u8 *)(p + 0x5E); + + if (*(s16 *)(p + 0x60) != 0) { + if (e == 0x1D) { + *(s16 *)(p + 0x82) = 0; + *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); + *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); + *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); + } + { + s32 dec; + s32 q = *(s32 *)(p + 0x78); + if (q != 0) { + dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; + if (dec <= 0) dec = 1; + } + *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; + } + ((void (*)(void *))func_8016AA50)(p); + if (*(u16 *)(p + 0x82) & 1) { + ((void (*)(void *))func_8016B428)(p); + ((void(*)(void *))func_80019064)(&D_80181B2C); + } + } + + *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; + + if (e != 0x1D) { + if (*(u8 *)(p + 0xC8)) func_8002A520(p); + if (*(u8 *)(p + 0xC9)) func_8002A790(p); + } + + if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; + + { + s32 r = *(s32 *)(p + 0x20); + *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; + { + s32 r2 = *(s32 *)(p + 0x20); + *(s16 *)(r2 + 0x14) = 0; + *(s16 *)(r2 + 0x10) = 0; + } + } + + ((void (*)(void *))func_8012B2CC)(p); + ((void (*)(void *))func_8012B23C)(p); +} + + + +DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80131CA8); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80131CF4); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80131D68); + + +extern void (*D_80181B3C[])(struct S80131E00 *a0); + +void func_80131E00(struct S80131E00 *a0, s32 a1) { + a0->field_B0 = a1; + D_80181B3C[a1](a0); +} + + +DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ + +DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ + +DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ + + +extern void (*D_80181B94[])(void); + +void func_80131EEC(void *a0) { + D_80181B94[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80181BDC[])(void); + +void func_80131F28(void *a0) { + D_80181BDC[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80181BE4[])(void); + +void func_80131F64(void *a0) { + D_80181BE4[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80181BEC[])(void); + +void func_80131FA0(void *a0) { + D_80181BEC[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80181BF4[])(void); + +void func_80131FDC(void *a0) { + D_80181BF4[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80132018); + +DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80181B9C; + +void func_801320D8(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80181B9C; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +s32 func_80132144(s32 param_1) +{ + extern int D_80181BAC; + + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(((int)param_1) + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(((int)param_1)); + } else { + ((void(*)(int, int))func_8001C214)(v0, 0); + *(int *)(((int)param_1) + 0x58) = (int)&D_80181BAC; + *(short *)(((int)param_1) + 0x5c) = 0x80; + *(unsigned short *)(((int)param_1) + 2) += 1; + } +} + + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80181BBC; + +void func_801321B0(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80181BBC; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80181BCC; + +void func_8013221C(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80181BCC; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + +DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ + +DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_801325B8); + +DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ + +DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ + +DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ + +DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ + +DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ + +DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80132F40); + +DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_801330E0); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80133298); + +DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ + +DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH + +extern s32 D_8019DD00; +extern s32 D_8019DD04[]; +extern int D_8019DD08; +extern void func_80136BC4(s32 a0); + +void func_801336E8(void *a0, int a1, int a2) { + if (a0 != 0) { + (*(void * *)&D_8019DD00) = a0; + ((void (*)(void))func_80136BC4)(); + } + (*(int *)&D_8019DD04) = a1; + D_8019DD08 = a2; +} + + + + +extern s32 D_8019DD04[]; +extern s32 D_8019DD00; +extern void func_80136BC4(s32); + +void func_8013373C(s16 arg0) { + s32 temp = D_8019DD04[arg0]; + if (temp != 0) { + D_8019DD00 = temp; + func_80136BC4(temp); + } +} + + +// @class: regalloc-order +#include "common.h" + +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; + + +s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { + extern s32 func_80047D3C(s32); + extern s32 func_80133AB0(s16, s16, s16, s32); + extern Box_80133784 * D_80181BFC; + extern Box_80133784 * D_80181C00; + extern s16 D_8019DD0C; + extern u16 D_8019DD10; + + register s32 s1 __asm__("$17"); + s32 s2; + register s16 s3 __asm__("$19"); + register s32 s4 __asm__("$20"); + register s16 a0v __asm__("$4"); + register s16 arg0s __asm__("$21"); + s32 dx, dy, dz; + s32 r, ret; + + a0v = ((s16)arg0); + s1 = 0; + s3 = 0; + s4 = 0; + s2 = 0; + arg0s = a0v; + D_80181BFC->f6 = -0x7FFF; + D_80181C00->f6 = 0x7FFF; + D_80181BFC->f0 = ((Box_80133784 *)arg1)->f0; + D_80181BFC->f4 = ((Box_80133784 *)arg1)->f4; + D_80181C00->f0 = ((Box_80133784 *)arg2)->f0; + D_80181C00->f4 = ((Box_80133784 *)arg2)->f4; + D_8019DD10 = 0; + D_8019DD0C = 0; + + if ((s16)a0v == 0) { + s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; + s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; + s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; + if (sx == 0 && sy == 0) { + s32 zt = (sz == 0); + __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); + } + D_80181BFC->f2 = ((Box_80133784 *)arg1)->f2 - 4; + r = func_80047D3C(sx * sx + sz * sz); + if (r < 3) { + r = 4; + } else if (r < 5) { + r += 1; + } + D_80181C00->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; + } else { + D_80181BFC->f2 = ((Box_80133784 *)arg1)->f2; + if ((s16)a0v == 2) { + D_80181C00->f0 = D_80181BFC->f0; + D_80181C00->f2 = D_80181BFC->f2 + 6; + s2 = 1; + D_80181C00->f4 = D_80181BFC->f4; + } else { + D_80181C00->f2 = ((Box_80133784 *)arg2)->f2; + } + } + + while (1) { + s32 ret0; + register s32 retc __asm__("$3"); + __asm__ __volatile__(""); + ret0 = func_80133AB0(arg0s, (s16)D_80181BFC->f0, (s16)D_80181BFC->f4, (*(s32*)&D_8019DD00)); + __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); + ret = retc; + if (ret == 0) goto after; + s4 |= ret; + if (s2 != 0) goto after; + { + s16 oldc = s3; + s3 = s3 + 1; + if (oldc >= 5) break; + } + } + + D_80181C00->f0 = D_80181BFC->f0; + D_80181C00->f2 = D_80181BFC->f2; + s1 = 0x2000; + D_80181C00->f4 = D_80181BFC->f4; + goto store_out; + +after: + if ((s16)s4 != 0 || D_8019DD0C != 0) { + s16 t; + __asm__ __volatile__("" :: "r"(s4)); + t = D_80181BFC->f6; + if (t >= -0xBCB) { + if (t < -0x578) { + s1 |= 0x4000; + } else { + s1 |= 0x8000; + } + } + if ((s16)D_80181C00->f6 < -0xBCB) { + s1 |= 0x2000; + } + store_out: + ((Box_80133784 *)arg2)->f0 = D_80181C00->f0; + ((Box_80133784 *)arg2)->f2 = D_80181C00->f2; + ((Box_80133784 *)arg2)->f4 = D_80181C00->f4; + ((Box_80133784 *)arg2)->f6 = D_8019DD10; + return s1 & 0xFFFF; + } + ((Box_80133784 *)arg2)->f6 = D_8019DD10; + return 0; +} + + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80133AB0); + + +s32 func_80133CD4(arg0, cmd, base, arr) + s16 arg0; + s16 *cmd; + s16 *base; + s32 *arr; +{ + typedef struct { s16 e[4]; } ElemK; + + extern u16 *D_80181C00; + extern u16 *D_80181BFC; + extern s16 *D_80181C08; + extern s16 *D_80181C04; + extern s32 *D_80181C10; + extern s32 *D_80181C14; + extern u16 D_8019DD10; + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern u16 D_801152AE; + extern u8 D_801152B0; + extern s32 func_80134310(); + extern s32 func_8013435C(); + + s16 *s3 = ((ElemK *)base)[cmd[1]].e; + s32 s6 = arr[cmd[2]]; + s32 s0var, s1var; + s32 s2a; + s16 y; + + if (func_80134310(s3, D_80181C00, s6) >= 0) + return 0; + + s1var = func_80134310(s3, D_80181BFC, s6); + if (s1var < 0) + return 0; + + s0var = func_80134310(s3, D_80181C08, 0); + { + u16 *pac = D_80181BFC; + s16 *pb8 = D_80181C08; + s16 *pb4 = D_80181C04; + s32 neg = -s1var; + pb4[0] = pac[0] + neg * pb8[0] / s0var; + pb4[1] = pac[1] + neg * pb8[1] / s0var; + pb4[2] = pac[2] + neg * pb8[2] / s0var; + if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) + return 0; + } + if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80181C04, arr[cmd[6]], s3)) + return 0; + if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80181C04, arr[cmd[8]], s3)) + return 0; + if (arg0 < 0) { + if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80181C04, arr[cmd[10]], s3)) + return 0; + } + if (arg0 & 0x10) { + if (*(u16 *)cmd & 0x100) + return 0; + } + if (*(u16 *)cmd & 0x200) { + D_8019DD10 = *(u16 *)cmd; + return 0; + } + + { + s32 ret = func_80134310(s3, D_80181C00, s6); + s32 *pc0; + s32 *pc4; + u16 *pb0; + s32 t, o2; + s32 q3v; + + { + s32 *pw = D_80181C10; + ((struct { s32 w; } *)pw)->w = s3[0]; + pw[1] = s3[1]; + pw[2] = s3[2]; + } + s1var = -ret; + + __asm__ __volatile__( + "lwc2 $9, 0(%0)\n" + "lwc2 $10, 4(%0)\n" + "lwc2 $11, 8(%0)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : "r"(D_80181C10) : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"(D_80181C14) : "memory"); + + pc0 = D_80181C10; + pc4 = D_80181C14; + s0var = pc4[0] + pc4[1] + pc4[2]; + pb0 = D_80181C00; + pb0[0] += s1var * pc0[0] / s0var; + pb0[1] += s1var * pc0[1] / s0var; + q3v = s1var * pc0[2] / s0var; + + { + s32 h; + h = ((s16 *)pb0)[0]; + s1var = h << 16; + __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); + s0var = h << 16; + } + pb0[2] += q3v; + s2a = (s16)pb0[2] << 16; + + t = pc0[0] << 4; + pc0[0] = t; + if (t < 0) s1var |= 0xFFFF; + t = pc0[1] << 4; + pc0[1] = t; + if (t < 0) s0var |= 0xFFFF; + o2 = pc0[2]; + t = o2 << 4; + pc0[2] = t; + if (t < 0) s2a |= 0xFFFF; + s2a += o2 << 5; + s1var += pc0[0] << 1; + s0var += pc0[1] << 1; + + do { + s32 *pl = D_80181C10; + u16 *pb; + s1var += pl[0]; + s0var += pl[1]; + s2a += pl[2]; + pb = D_80181C00; + pb[0] = s1var >> 16; + pb[1] = s0var >> 16; + pb[2] = s2a >> 16; + ret = func_80134310(s3, pb, s6); + } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); + } + + y = s3[1]; + if (y >= -0xBCB) { + D_80181BFC[3] = y; + { + typedef struct { s8 c[8]; } Blk8; + *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; + } + if (*(u8 *)cmd != 0) + goto ret1; + return -1; + } + { + typedef struct { u16 h; } H16; + u16 *s3u = (u16 *)s3; + u16 *bp = D_80181C00; + u16 w; + ((H16 *)D_801152A8)->h = s3u[0]; + w = s3u[1]; + bp[3] = w; + ((H16 *)&D_801152AA)->h = w; + ((H16 *)&D_801152AC)->h = s3u[2]; + ((H16 *)&D_801152AE)->h = s3u[3]; + } +ret1: + return 1; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80134310); + +DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (83 ins, relocation-masked) + + + +s32 func_801343C4(s32 angle, s32 p1, s32 p2) +{ + extern int func_80133AB0(int, s16, s16, int); + extern s16 * D_80181BFC; + extern s16 * D_80181C00; + extern u16 D_8019DD10; + extern u16 D_8019DD0C; + + s16 *pac; + s16 *pb0; + s16 *pacs, *pb0s; + u16 *pb0u; + int a1v, a2v, d94, b0; + int sangle = ((s16)angle); + + pac = D_80181BFC; + d94 = D_8019DD00; + pb0 = D_80181C00; + pac[0] = ((u16 *)p1)[0]; + pac[1] = ((u16 *)p1)[1]; + pac[2] = ((u16 *)p1)[2]; + pb0[0] = ((u16 *)p2)[0]; + pb0[1] = ((u16 *)p2)[1]; + pb0[2] = ((u16 *)p2)[2]; + + a1v = pac[0]; a2v = pac[2]; + __asm__ __volatile__("" ::: "memory"); + D_8019DD10 = 0; + D_8019DD0C = 0; + if (func_80133AB0(sangle, a1v, a2v, d94)) { + setdst: + pb0u = (u16 *)D_80181C00; + ((u16 *)p2)[0] = pb0u[0]; + ((u16 *)p2)[1] = pb0u[1]; + ((u16 *)p2)[2] = pb0u[2]; + ((u16 *)p2)[3] = D_8019DD10; + return 1; + } + + pacs = D_80181BFC; + pb0s = D_80181C00; + b0 = pb0s[0]; + if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && + (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { + return 0; + } + if (func_80133AB0(sangle, b0, pb0s[2], D_8019DD00)) { + goto setdst; + } + return 0; +} + + + +// @class: schedule +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; + + +s32 func_80134510(s32 param) { + extern s32 func_801345F8(s32); + extern Foo_80134510_80134510 * D_80181BFC; + extern Foo_80134510_80134510 * D_80181C00; + extern Foo_80134510_80134510 * D_80181C04; + extern u16 D_8019DD10; + + + s32 ret = 0; + Foo_80134510_80134510 *b0 = D_80181C00; + Foo_80134510_80134510 *ac = D_80181BFC; + u16 t0 = ((Foo_80134510_80134510 *)param)->f0; + u16 t2, t4; + + ((Foo_80134510_80134510 *)param)->f6 = 0; + ac->f0 = t0; + b0->f0 = t0; + t2 = ((Foo_80134510_80134510 *)param)->f2; + ac->f2 = t2 - 4; + b0->f2 = t2 + 0x2FC; + t4 = ((Foo_80134510_80134510 *)param)->f4; + ac->f4 = t4; + b0->f4 = t4; + + if (func_801345F8((*(s32*)&D_8019DD00)) != 0) { + s16 x; + ((Foo_80134510_80134510 *)param)->f2 = D_80181C04->f2 - 2; + x = D_80181BFC->f6; + if (x >= -3019) { + if (x < -1400) { + ret = 0x4000; + } else { + ret = 0x8000; + } + } else { + ret = 0x2000; + } + D_80181BFC->f6 = D_8019DD10; + } + return ret; +} + + + +// @class: regalloc-order +// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. + + +s32 func_801345F8(s32 arg) +{ + extern int func_801347A0(short, u16 *, int, int); + extern u16 * D_80181BFC; + extern u16 D_8019DD10; + + register u16 *param_1 __asm__("$5") = ((u16 *)arg); + register u16 *cc __asm__("$4") = D_80181BFC; + int c8000 = 0x8000; + register int zr __asm__("$0"); + u32 c1, c2, uVar6, uVar2, cnt, v14; + u16 *ptmp, *puVar4, *puVar7, uVar1; + int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; + + c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; + uVar6 = c1 + zr; + if ((c1 & 0xffff) < (u32)param_1[2]) { + c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; + uVar2 = c2 + zr; + if ((c2 & 0xffff) < (u32)param_1[3]) + goto do_mult; + return 0; + found: + D_8019DD10 = *puVar7; + return 1; + do_mult: + tbl = *(int *)(param_1 + 4); + uVar10 = *(int *)(param_1 + 6); + uVar3 = *(int *)(param_1 + 8); + iVar9 = *(int *)(param_1 + 0xc); + iVar8 = *(int *)(param_1 + 0xe); + ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); + cnt = (u32)ptmp[1]; + v14 = *(int *)(param_1 + 10); + puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; + while (((cnt-- + zr) & 0xffff) != 0) { + uVar1 = *puVar4; + hi = uVar1 & 0x8000; + harg = hi + zr; + if (hi == 0) + puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); + else + puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); + if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) + goto found; + puVar4 = puVar4 - 1; + } + } + return 0; +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. +#include "common.h" + +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; + +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; + +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; + + + +s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); + extern s16 * D_80181C00; + extern SVec_801347A0 * D_80181BFC; + extern SVec_801347A0 * D_80181C04; + + Elem_801347A0 *pElem; + s32 val; + register s32 iv __asm__("$4"); + s32 q; + s32 dvsr; + + pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; + val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; + if (func_80134A28((s32)pElem, (s32)D_80181C00, val) >= 0) { + return 0; + } + iv = func_80134A28((s32)pElem, (s32)D_80181BFC, val); + if (iv < 0) { + return 0; + } + iv = -iv; + dvsr = pElem->f2 * 48; + q = (iv * 48) / dvsr; + D_80181C04->f0 = D_80181BFC->f0; + D_80181C04->f2 = D_80181BFC->f2 + q; + D_80181C04->f4 = D_80181BFC->f4; + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { + return 0; + } + if ((s16)arg0) { + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80181C04, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { + return 0; + } + } + if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { + return 0; + } + D_80181C04->f0 = D_80181BFC->f0; + D_80181C04->f4 = D_80181BFC->f4; + (*(Elem_801347A0*)D_801152A8) = *pElem; + D_80181BFC->f6 = pElem->f2; + return 1; +} + + + +DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80134A74); + +// @class: regalloc-order +// @try: variant B — direct pins m=$s5($21), c=$s6($22) + + +s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); + extern void * D_80181BFC; + extern void * D_80181C00; + extern void * D_80181C04; + extern void * D_80181C08; + extern u16 D_8019DD10; + + s32 temp_a3; + s32 temp_s1; + s32 temp_v0; + s32 temp_v0_2; + s32 var_v0; + u16 temp_a1; + s32 temp_s4; + s32 c = arg0; + __asm__ __volatile__("" : "=r"(c) : "0"(c)); + __asm__ __volatile__("" : : "r"(arg0)); + + temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); + temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); + var_v0 = 0; + if (func_80134FB8(temp_s4, (s32) D_80181C00, temp_s1) >= 0) { + return var_v0; + } + temp_v0 = func_80134FB8(temp_s4, (s32) D_80181BFC, temp_s1); + if (temp_v0 < 0) { + goto block_13; + } + temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80181C08, 0); + temp_a3 = -temp_v0; + { + u16 *pB4 = (u16 *)D_80181C04; + u16 *pAC = (u16 *)D_80181BFC; + s16 *pB8 = (s16 *)D_80181C08; + pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; + pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; + pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { + return var_v0; + } + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80181C04, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { + return var_v0; + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80181C04, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { + return var_v0; + } + if ((arg0 << 16) < 0) { + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80181C04, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { + return var_v0; + } + } + if (c & 1) { + if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { + goto block_14; + } + return 0; + } + temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); + if (!(temp_a1 & 0x200)) { + goto block_14; + } + D_8019DD10 = temp_a1; +block_13: + return 0; +block_14: + __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); + VectorNormalSS(D_80181C08, D_80181C08); + { + u16 *pB8 = (u16 *)D_80181C08; + u16 *pB4b = (u16 *)D_80181C04; + pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); + var_v0 = 1; + pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); + pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); + } + return var_v0; +} + + + +DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype D_80181C00 + D_80181BFC (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + extern int func_80134A74(int, s16, s16, int); + extern s16 * D_80181C00; + extern s16 * D_80181BFC; + extern u8 D_80181C08; + extern s16 *D_80181C04; + extern u16 D_8019DD10; + + register s16 *pb0 __asm__("$9"); /* D_80181C00 -> $t1 */ + register s16 *pac __asm__("$6"); /* D_80181BFC -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_80181C08 -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = D_80181C00; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = D_80181BFC; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80181C08); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_8019DD00; + __asm__ __volatile__("" ::: "memory"); + D_8019DD10 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_80181C04); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_8019DD10; + return 1; + } + { + register u16 *qb __asm__("$4"); /* D_80181BFC -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* D_80181C00[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* D_80181C00 -> $a2 (reloaded) */ + qb = (u16 *)D_80181BFC; + qa = (u16 *)D_80181C00; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_8019DD00)) + goto found; + return 0; + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (62 ins, relocation-masked) + + +extern u8 D_80181C00; +extern u8 D_80181BFC; +extern s16 *D_80181C04; +extern u8 D_80181C08; +extern int D_8019DD00; +extern u16 D_8019DD10; + +extern int func_80134A74(int, s16, s16, int); + +int func_80135168(u16 arg0, u16 *p1, u16 *p2) +{ + register s16 *pb0 __asm__("$8"); + register s16 *pac __asm__("$6"); + register s16 *pb8 __asm__("$7"); + u16 *pb4; + u16 a, b; + int a1v, a2v, d94; + + pb0 = (*(s16 * *)&D_80181C00); + __asm__ __volatile__("" : : "r"(pb0)); + + a = p2[0]; pac = (*(s16 * *)&D_80181BFC); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80181C08); pac[0] = b; pb8[0] = a - b; + a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; + a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; + + a1v = pac[0]; a2v = pac[2]; d94 = D_8019DD00; + __asm__ __volatile__("" ::: "memory"); + D_8019DD10 = 0; + if (func_80134A74(arg0, a1v, a2v, d94)) { + pb4 = (*(u16 * *)&D_80181C04); + p2[0] = pb4[0]; + p2[1] = pb4[1]; + p2[2] = pb4[2]; + p2[3] = D_8019DD10; + return 1; + } + return 0; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80135260); + + +/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). + * + * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 + * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does + * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in + * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). + * + * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): + * the two output buffers D_80181BFC / D_80181C00 are written through a pointer in each of the two + * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a + * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also + * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each + * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks + * the lowest-free scratch over its OWN window: + * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) + * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) + * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail + * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. + * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades + * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the + * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. + * + * Zero file-scope footprint (block-scoped typedefs + externs; D_80181BFC/B0 read via the ambient + * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for + * family_sweep --edit-remap with no cc1 crash. + * + * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. + */ +s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) +{ + typedef struct { s32 vx, vy, vz, pad; } Vec32; + typedef struct { s16 vx, vy, vz, pad; } Vec16; + typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; + extern void func_80048EAC(void *m0, void *m1); + extern void func_8004914C(void *m); + extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); + extern void ApplyRotMatrixLV(void *in, void *out); + extern void ApplyRotMatrix(void *in, void *out); + extern s32 D_8019DD14, D_8019DD18, D_8019DD1C, D_8019DD20; + extern s16 D_8019DD24; + extern s32 D_8019DD34; + extern s16 D_8019DD38, D_8019DD3A, D_8019DD3C, D_8019DD3E, D_8019DD40, D_8019DD42; + + Vec32 in0, in1, rotout; + Mat32 mat2; + Vec16 vecin; + s32 result; + s32 mode; + s32 q1, q2; + s32 p; + s32 t18, t1A, t1C; + s32 *m; + + in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); + in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); + if ((param_2 & 0x10000000) == 0) { + if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { + return 0; + } + } + mode = param_2 & 0x60000000; + if (mode != 0) { + result = 1; + if (param_2 >= 0) { + mode &= 0x40000000; + } + in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); + in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); + switch (mode) { + case 0x60000000: + m = &D_8019DD14; + *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); + q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); + q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); + D_8019DD18 = 0; + D_8019DD20 = 0; + D_8019DD1C = q1; + D_8019DD24 = q2; + func_80048EAC((void *)((s32)param_1 + 0x34), m); + ApplyTransposeMatrixLV(m, &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + /* fallthrough */ + case 0x20000000: + p = (param_2 & 0xFFFFFFF) | 0x80000000; + t18 = *(s16 *)((s32)param_1 + 0x18); + t1A = *(s16 *)((s32)param_1 + 0x1A); + t1C = *(u16 *)((s32)param_1 + 0x1C); + mat2.w4 = 0; + mat2.wC = 0; + mat2.w0 = t18; + mat2.w8 = t1A; + mat2.h10 = t1C; + func_8004914C(&mat2); + vecin.vx = *(u16 *)(p + 4); + vecin.vy = *(u16 *)(p + 8); + vecin.vz = *(u16 *)(p + 0xC); + ApplyRotMatrix(&vecin, &rotout); + D_8019DD38 = rotout.vx; + D_8019DD3C = rotout.vy; + D_8019DD40 = rotout.vz; + vecin.vx = *(u16 *)(p + 6); + vecin.vy = *(u16 *)(p + 0xA); + vecin.vz = *(u16 *)(p + 0xE); + ApplyRotMatrix(&vecin, &rotout); + D_8019DD34 = 0; + D_8019DD3A = rotout.vx; + D_8019DD3E = rotout.vy; + D_8019DD42 = rotout.vz; + result += 2; + break; + case 0x40000000: + ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + break; + } + { + s16 *p = *(s16 **)&D_80181BFC; + p[0] = in0.vx; + p[1] = in0.vy; + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_80181C00; + p[0] = in1.vx; + p[1] = in1.vy; + p[2] = in1.vz; + } + return result; + } + { + s16 *p = *(s16 **)&D_80181BFC; + p[0] = in0.vx; + p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_80181C00; + p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); + p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); + } + return 1; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80135888); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80135A4C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80135D20); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80135EB0); + + +s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + register s32 a1v __asm__("$11"); + register s32 a2v __asm__("$12"); + register s32 n __asm__("$5"); + register s16 *b4 __asm__("$7"); + s32 d; + s32 dx; + s32 denom; + s32 result; + s32 frame_pad[2]; + (void)&frame_pad; + __asm__("" : "=r"(a1v) : "0"(arg1)); + a2v = arg2; + + if (!(arg1 & 1)) { + dx = (s16) arg2 - (*(s16 **)&D_80181BFC)[2]; + d = dx; + denom = -(*(s16 **)&D_80181C08)[2]; + } else { + denom = (*(s16 **)&D_80181C08)[2]; + d = (*(s16 **)&D_80181BFC)[2] - (s16) arg2; + dx = -d; + } + n = -d; + { + register s16 *b8 __asm__("$6") = *(s16 **)&D_80181C08; + u16 *ac = *(u16 **)&D_80181BFC; + b4 = D_80181C04; + b4[0] = ac[0] + n * b8[0] / denom; + b4[1] = ac[1] + n * b8[1] / denom; + b4[2] = ac[2] + dx; + } + + if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; + if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; + if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; + if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; + if (a1v & 0x8000) { + u16 *b0 = *(u16 **)&D_80181C00; + b4[0] = b0[0]; + b4[1] = b0[1]; + } + D_801152AA = 0; + (*(s16 *)D_801152A8) = 0; + if (a1v & 1) { + D_80181C04[2] = a2v + 2; + __asm__ __volatile__(""); + D_801152AC = 0xFFF; + } else { + D_801152AC = -0xFFF; + D_80181C04[2] = a2v - 2; + } + __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); + (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; + D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; + result = 1; + D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; + return result; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_801365B8); + + +// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) +// D_80181BFC/B0/B8 are file-scope `extern u8`, D_80181C04 is `extern s32 []`; each HOLDS a +// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. +// D_80181C04 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the +// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar +// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the +// siblings read it once via *(u16**)&sym == direct lw either way). + +s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + + register u16 *ac __asm__("$4"); + register s16 *b8 __asm__("$6"); + register s16 *b4 __asm__("$9"); + register s32 r __asm__("$3"); + register s32 pos __asm__("$12"); + register s32 a1v __asm__("$5"); + s16 temp_v0; + s16 temp_v1; + s32 var_a3; + s16 var_v0_3; + s32 temp_a1; + s32 var_t0; + s32 var_v1; + s16 *b4b; + u16 *p; + + __asm__ ("" : "=r"(a1v) : "0"(arg1)); + pos = arg2; + if (!(a1v & 1)) { + var_t0 = (s16) arg2 - (*(s16 **)&D_80181BFC)[1]; + var_v1 = var_t0; + var_a3 = -(*(s16 **)&D_80181C08)[1]; + } else { + var_a3 = (*(s16 **)&D_80181C08)[1]; + var_v1 = (*(s16 **)&D_80181BFC)[1] - (s16) arg2; + var_t0 = -var_v1; + } + b8 = (*(s16 **)&D_80181C08); + ac = (*(u16 **)&D_80181BFC); + b4 = D_80181C04; + temp_a1 = -var_v1; + r = (temp_a1 * b8[0]) / var_a3; + b4[0] = ac[0] + r; + b4[1] = ac[1] + var_t0; + r = (temp_a1 * b8[2]) / var_a3; + temp_v0 = ac[2] + r; + b4[2] = temp_v0; + temp_v1 = b4[0]; + if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { + return 0; + } + if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { + return 0; + } + if (arg1 & 0x8000) { + p = (*(u16 **)&D_80181C00); + b4[0] = (s16) p[0]; + b4[2] = (s16) p[2]; + } + D_801152AC = 0; + (*(s16 *)D_801152A8) = 0; + if (arg1 & 1) { + b4b = D_80181C04; + D_801152AA = 0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos + 2; + } else { + b4b = D_80181C04; + D_801152AA = -0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos - 2; + } + b4b[1] = var_v0_3; + __asm__ __volatile__("" :: "r"(pos)); + (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); + D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); + D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); + return 1; +} + + +// @class: schedule +// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a +// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE +// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses +// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] +// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the +// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; +// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits +// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the +// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). + + +extern s16 *D_80181C04; /* holds a pointer value (*(u16**)&D_80181C04) */ + +s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { + extern void ApplyMatrixSV(void *m, void *v0, void *v1); + extern void ApplyRotMatrix(void *v0, void *v1); + extern u16 D_80126722; + extern s16 D_80126724; + extern s16 D_801152AA; + extern s16 D_801152AC; + + s32 out[4]; + u16 *pb4; + + if (a0) { + ApplyMatrixSV((void *)a3, *(void **)&D_80181C04, *(void **)&D_80181C04); + ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); + ApplyRotMatrix((void *)D_801152A8, (void *)out); + *(s16 *)D_801152A8 = out[0]; + D_801152AA = out[1]; + D_801152AC = out[2]; + } + + pb4 = *(u16 **)&D_80181C04; + *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); + *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); + *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); + + *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); + D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); + D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); +} + + + +DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ + +DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ + +DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ + +DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ + +DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ + + +extern unsigned short D_800B99F0; +extern void (*D_80181C18[])(void); + +void func_80136C54(void) +{ + D_80181C18[D_800B99F0](); +} + + +// @class: struct +// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_8019CCEC into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). + +typedef struct { char s[10]; } S10_80136C90; + +s32 func_80136C90() +{ + extern void func_8001534C(int, void *, int, int, int, int); + extern S10_80136C90 D_8019CCEC; + + S10_80136C90 buf = D_8019CCEC; + func_8001534C(0, &buf, 0x78, 0x10, 0, 0); +} + + + +DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ + +DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80136DFC); + +DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ + +DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80136F3C); + +DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80137178); + +DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ + +DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80137614); + +DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ + +DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_801376E8); + +DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ + +DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_801378F0); + +DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ + +DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_801379FC); + + +// @class: remat +// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer +extern s32 D_80127548[]; +extern int D_80181C6C; +extern int D_801269F0; +extern void func_80138BE0(int p); + +void func_80137B80(void) { + int *p = &D_801269F0; + (*(int *)&D_80127548) = 0x24; + if (*p != 0) { + ((void (*)(int *))func_80138BE0)(p); + } + D_80181C6C += 1; +} + + +DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. + +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int D_80181C6C; +extern int D_801269F0; + +extern void func_801392FC(); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); + +int func_80137D08(int arg0, int arg1, short arg2) +{ + unsigned char buf[3]; + + D_800A5E60 = arg0; + D_80126A0A = arg2; + ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); + if ((*(short *)&D_801269F4) == 7) { + buf[0] = 0x39; + buf[1] = 0xFF; + buf[2] = 0x71; + ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); + } else if ((*(short *)&D_801269F4) == 3) { + if (D_80181C6C & 4) { + ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); + } + } + return D_800A5E60; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_8012ACE0", func_80137DD4); + +DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ diff --git a/src/ov_SC05_004/ov_SC05_004_jr_801380E0.c b/src/ov_SC05_004/ov_SC05_004_jr_801380E0.c new file mode 100644 index 000000000..bd28b692c --- /dev/null +++ b/src/ov_SC05_004/ov_SC05_004_jr_801380E0.c @@ -0,0 +1,3320 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019CA98; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80181904[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019DC94; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019F2B8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019CA98; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181640)(); +extern s16 (*D_80181644)(); +extern M2C_UNK (*D_8018164C)(); +extern s32 (*D_80181650)(); +extern s32 D_8019DC90; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019CA9C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80181998; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80184E7C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801819B0; +extern M2C_UNK D_801819B8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801819C0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801819DC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801819E8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801819FC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80181A4C[]; +extern s16 D_80181A7C[]; +extern s16 D_80181ADC[]; +extern s16 D_80181AE4[]; +extern s16 D_80181B04[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80181B3C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80181B94[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80181BDC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80181BE4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80181BEC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80181BF4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80181B9C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80181BBC; +extern void func_801321B0(int param_1); +extern int D_80181BCC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019DD00; +extern s32 D_8019DD04[]; +extern int D_8019DD08; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80181C00; +extern u8 D_80181BFC; +extern s16 *D_80181C04; +extern u8 D_80181C08; +extern int D_8019DD00; +extern u16 D_8019DD10; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80181C04; /* holds a pointer value (*(u16**)&D_80181C04) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80181C18[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80181C6C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80181C70[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80181C70[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80181CB4; +extern u8 D_80181CF8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80181CB4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80181CF8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181D3C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80181D78[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80181D78; + if (((s16)a1) < 0xC00) { + tbl = D_80181D3C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80181DB4, D_80181DB6, D_80181DB8, D_80181DBA, D_80181DBC, D_80181DBE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80181DB6 < ang)) goto outer_else; + if (!(ang < D_80181DBC)) goto inner_else; + if (ang < D_80181DB8) { *(s16 *)L = D_80181DB8; goto done; } + if (D_80181DBA < ang) { *(s16 *)L = D_80181DBA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80181DB4) { *(s16 *)L = D_80181DB4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181DBE < ang) { *(s16 *)L = D_80181DBE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019DD78; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019DD78, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019DD78; +extern s8 D_8019DD7C; +extern s8 D_8019DD7D; + +void func_8013C9C4(void * arg0) +{ + D_8019DD78 = arg0; + D_8019DD7C = 0; + D_8019DD7D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019DD78; +extern s8 D_8019DD7C; +extern s8 D_8019DD7D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019DD78; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019DD7D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019DD7C)) * 2) + D_8019DD78); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019DD7D = (unsigned char) p[1]; + D_8019DD7C = D_8019DD7C + 1; + if (D_8019DD7D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019DD7C = 0; + *base = 0; + } + } + else + { + D_8019DD7D = c - 1; + } + } + return; +} + + + +extern s32 D_8019DD9C; +extern s32 D_8019DD90; +extern s32 D_8019DD94; +extern s32 D_8019DDA0; + +void func_8013CABC(void) { + D_8019DD9C = 1; + D_8019DD90 = 1; + D_8019DD94 = 0; + D_8019DDA0 = 1; +} + + + +extern s32 D_8019DD90; +extern s32 D_8019DD94; +extern s32 D_8019DD98; +extern s32 D_8019DD9C; +extern s32 D_8019DDA0; + +void func_8013CAE8(void) { + D_8019DD90 = 1; + D_8019DD9C = 0; + D_8019DD94 = 0; + D_8019DD98 = -1; + D_8019DDA0 = 0; +} + + + +extern s32 D_8019DD9C; +extern s32 D_8019DDA0; +extern s32 D_8019DDC8; +extern s32 D_8019DDCC; + +void func_8013CB20(void) +{ + D_8019DDC8 = D_8019DDA0; + D_8019DDCC = D_8019DD9C; + D_8019DDA0 = 1; + D_8019DD9C = 0; +} + + + +extern s32 D_8019DDC8; +extern s32 D_8019DDCC; +extern s32 D_8019DDA0; +extern s32 D_8019DD9C; + +void func_8013CB5C(void) { + D_8019DDA0 = D_8019DDC8; + D_8019DD9C = D_8019DDCC; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019F1D0; + extern u8 D_8019F1D1; + extern u8 D_8019F1D2; + extern u8 D_8019F1D3; + extern u8 D_8019F1D4; + extern u8 D_8019F1D5; + extern u8 D_8019F1D6; + extern u8 D_8019F1D7; + extern u8 D_8019F1D8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019F1D0; t1 = D_8019F1D1; t2 = D_8019F1D2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019F1D3; t1 = D_8019F1D4; t2 = D_8019F1D5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019F1D6; t1 = D_8019F1D7; t2 = D_8019F1D8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019DDA8; +extern s32 D_8019DD90; +extern s32 D_8019DDAC; +extern s32 D_8019DD9C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019DDA8 != 0) { + if (D_8019DDA8 != 2) { + if (((D_8019DDA8 < 3) && (D_8019DDA8 == 1)) && + (D_8019DDAC = D_8019DDAC + 1, 0x23a < D_8019DDAC)) { + D_8019DD90 = D_8019DDA8; + D_8019DDA8 = 2; + } + } else { + D_8019DD90 = D_8019DD90 + -1; + if (D_8019DD90 == 0) { + D_8019DD90 = D_8019DDA8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019DD9C == 0) { + D_8019DDA8 = D_8019DDA8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019DD9C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019DD9C; +} + + + +extern s32 D_8019DDA8; + +void func_8013D164(void) { + D_8019DDA8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019F2B2; +extern u8 D_8019F326; +extern u8 D_8019F1DA; +extern u8 D_8019F294; +extern u8 D_8019F1B8; +extern u8 D_8019F1D9; +extern s32 D_8019F298; + +void func_8013D330(void) { + if ((D_8019F2B2 & 0xff) != D_8019F326) { + D_8019F2B2 = ((D_8019F2B2 & 0xff) < D_8019F326) ? (D_8019F2B2 + 1) : (D_8019F2B2 - 1); + } + if ((D_8019F1DA & 0xff) != D_8019F294) { + D_8019F1DA = ((D_8019F1DA & 0xff) < D_8019F294) ? (D_8019F1DA + 1) : (D_8019F1DA - 1); + } + if ((D_8019F1B8 & 0xff) != D_8019F1D9) { + D_8019F1B8 = ((D_8019F1B8 & 0xff) < D_8019F1D9) ? (D_8019F1B8 + 1) : (D_8019F1B8 - 1); + } + D_8019F298 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019DD80; +extern void *D_8019DD84; +extern void *D_8019DD88; +extern s32 D_8019DDB0; +extern s32 D_8019DDB4; +extern s32 D_8019DDB8; +extern s32 D_8019F20C[]; + +extern u8 D_80181EAC[]; +extern u8 D_80181F54[]; +extern u8 D_80181E04[]; +extern u8 D_80181F00[]; +extern u8 D_80181F80[]; +extern u8 D_80181E58[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019DDB0 = param_2; + D_8019DDB4 = (param_2 >> 2) & 3; + D_8019DDB8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019DD80 = D_80181EAC; + D_8019DD84 = D_80181F54; + D_8019DD88 = D_80181E04; + } else { + D_8019DD80 = D_80181F00; + D_8019DD84 = D_80181F80; + D_8019DD88 = D_80181E58; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019DDB8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019DDB0 & 2) != 0) { + D_8019F20C[0] = 0x140; + D_8019F20C[3] = 0x80; + if (p[0x37] == 4) { + D_8019F20C[0] = 0x140; + D_8019F20C[3] = 0; + } + if (p[0x37] == 0) { + D_8019F20C[0] = 0x140; + D_8019F20C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019DD88)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019DD88; +extern s16 *D_8019DD8C; +extern s32 D_8019DD9C; +extern s32 D_8019DDBC; +extern s32 D_8019DDC0; +extern s32 D_8019DDC4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019DD8C != 0) { + D_8019DD9C = 0; + p = (int *)(param_1 * 12 + (int)D_8019DD88); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019DDBC != x) { + flag = 1; + if (D_8019DDBC < x) { + if (x - D_8019DDBC < 5) { + D_8019DDBC = x; + } else { + D_8019DDBC = D_8019DDBC + 4; + } + } else { + if (D_8019DDBC - x < 5) { + D_8019DDBC = x; + } else { + D_8019DDBC = D_8019DDBC - 4; + } + } + } + if (D_8019DDC0 != y) { + flag = 1; + if (D_8019DDC0 < y) { + if (y - D_8019DDC0 < 5) { + D_8019DDC0 = y; + } else { + D_8019DDC0 = D_8019DDC0 + 4; + } + } else { + if (D_8019DDC0 - y < 5) { + D_8019DDC0 = y; + } else { + D_8019DDC0 = D_8019DDC0 - 4; + } + } + } + if (D_8019DDC4 != z) { + flag = 1; + if (D_8019DDC4 < z) { + if (z - D_8019DDC4 < 5) { + D_8019DDC4 = z; + } else { + D_8019DDC4 = D_8019DDC4 + 4; + } + } else { + if (D_8019DDC4 - z < 5) { + D_8019DDC4 = z; + } else { + D_8019DDC4 = D_8019DDC4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019DD9C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182010[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019DD8C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019DDBC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019DDC0); + uVar5 = (*(int*)&D_8019DDC4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182010); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019DDA4; + +s32 func_8013E054(void) { + return D_8019DDA4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80182A0C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801829E4; +extern s16 D_801829E6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80182A0C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801829E4 = 2; + D_801829E6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801829E6 = 0; + D_801829E4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019DDD8; + extern void * D_8019DDDC; + extern unsigned char D_80182684; + extern unsigned char D_8018269C; + extern unsigned char D_80182710; + extern unsigned char D_80182718; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019DDD8 = &D_80182684; + D_8019DDDC = &D_80182710; + } else { + D_8019DDD8 = &D_8018269C; + D_8019DDDC = &D_80182718; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80182A0C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80182A0C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80182A0C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801829E8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801829E8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801829E8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801829E4; +extern s16 D_801829E6; +extern unsigned char D_801829E8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801829E6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801829E4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801829E6; + if (*r < 3) { + *r = *r + 1; + } + D_801829E4 = (u16)D_801829E4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801829E8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801829E8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801829E8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013FAF8); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8013FFD8); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8014032C); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80140608); + + +// @class: iv-combine +// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source +// pointer compile to fixed offsets when written base[0..n]; the target advances +// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead +// final increment, yielding the "increment N-2 then offset 0/2" tail). + +extern u8 *D_801826C4; +extern u8 *D_801826C8; +extern u8 *D_801826CC; +extern u8 *D_801826D0; +extern u8 *D_801826D4; +extern u16 *D_801826D8[]; +extern u16 *D_801826E0[]; +extern u16 *D_80182700[]; + +extern s32 func_80028D58(void); +extern s32 func_80028DE0(void); +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); + +void func_801407F4(void) +{ + u8 *puVar1; + s32 iVar2; + u16 *puVar3; + + puVar1 = D_801826C4; + iVar2 = func_80028D58(); + puVar3 = D_801826D8[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + puVar1 = D_801826C8; + iVar2 = func_80028DE0(); + puVar3 = D_801826D8[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + iVar2 = func_80028FBC(); + *(s16 *)(D_801826CC + 0x18) = *D_801826E0[iVar2]; + iVar2 = func_80029000(); + *(s16 *)(D_801826D0 + 0x18) = *D_801826E0[iVar2]; + + puVar1 = D_801826D4; + iVar2 = func_80028D9C(); + puVar3 = D_80182700[iVar2]; + *(s16 *)(puVar1 + 0x12) = *puVar3++; + *(s16 *)(puVar1 + 0x14) = *puVar3++; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + *(s16 *)(puVar1 + 0x1c) = *puVar3++; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80140958); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80140D68); + + +// @class: struct +// @stuck: none — MATCH + +extern unsigned char D_80078E7F; +extern unsigned char D_80078E7E; +extern unsigned char D_80078E7D; +extern M2C_UNK D_80182600; + +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); + +void func_80140E6C(void) { + void *puVar1; + unsigned int uVar2; + unsigned int uVar3; + unsigned int uVar4; + + puVar1 = (*(void * *)&D_80182600); + uVar2 = func_800D2CA8(D_80078E7F, 0x18); + uVar3 = func_800D2CA8(D_80078E7E, 0xc); + uVar4 = func_800D2CA8(D_80078E7D, 0); + func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); +} + + + + +// @class: plumbing +// @stuck: none — MATCH (128/128 ins, match_one confirmed) + +extern short D_80115128; +extern u8 D_80182610; +extern char *D_80182630; +extern char *D_80182634; +extern char *D_80182638; +extern char *D_8018263C; +extern char *D_80182640; + +extern int func_80029FE4(void); +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); +extern char *func_8002AAB4(void); +extern char *strcpy(char *, const char *); +extern int func_8002A26C(void); +extern int func_8002A2B0(void); +extern int func_8002A4B8(void); +extern s32 func_8002A4FC(s32 a0); +extern int func_8002A998(void); +extern int func_8002A9DC(void); +extern int func_8002A728(void); +extern int func_8002A76C(void); +extern int func_80029FD4(void); + +void func_80140F00(void) { + char *p; + int r; + + if (D_80115128 == 0) { + p = (*(char * *)&D_80182610); + r = func_800D2CA8(func_80029FE4() + 1, 0x18); + func_800D2D10(r, 2, p + 4, 1); + strcpy(p + 0xA, func_8002AAB4()); + + p = D_80182630; + r = func_800D2CA8(func_8002A26C() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A2B0(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182634; + r = func_800D2CA8(func_8002A4B8() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182638; + r = func_800D2CA8(func_8002A998() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A9DC(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_8018263C; + r = func_800D2CA8(func_8002A728() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A76C(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80182640; + r = func_800D2CA8(func_80029FD4(), 4); + func_800D2D10(r, 7, p + 0x18, -1); + } +} + + + +// @class: other +// @stuck: none — MATCH + +extern short D_80115128; +extern unsigned short D_80115172; +extern unsigned short D_801824CA; +extern unsigned short D_801824CE; +extern unsigned short D_801824D2; +extern unsigned short D_801824D6; + +extern s32 func_8002A1B4(void); +extern short func_8002A28C(void); +extern short func_8002A27C(void); +extern s32 func_8002A400(void); +extern short func_8002A4D8(void); +extern short func_8002A4C8(void); +extern s32 func_8002A8E0(void); +extern short func_8002A9B8(void); +extern short func_8002A9A8(void); +extern s32 func_8002A670(void); +extern short func_8002A748(void); +extern short func_8002A738(void); +extern int func_801412A8(int, int, int, int, int, int); + +int func_80141100(int param_1) +{ + short sVar1; + int iVar7; + + if (D_80115128 == 0) { + iVar7 = D_80115172 + 0x31; + sVar1 = D_801824CA; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); + sVar1 = D_801824CE; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); + sVar1 = D_801824D2; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); + sVar1 = D_801824D6; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); + } + return param_1; +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_801412A8); + +DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ + +DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ + +DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ + + +extern unsigned short D_80115112; +extern void (*D_80182A60[])(void); + +void func_80141788(void) +{ + D_80182A60[D_80115112](); +} + + +DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ + +DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80141874); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_801418F8); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80141A60); + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80141B90); + +DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) + +extern u16 D_80115110; +extern u8 D_801829C0; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80141C0C(s32 param_1) +{ + func_8002D4C8(*(u16 *)(&D_801829C0 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); +} + + +DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ + +DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ + +DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ + +DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_801424E4); + + +extern void (*D_80182AA0[])(void); + +void func_801425CC(void *a0) { + D_80182AA0[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: schedule +// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail + +extern void func_8012C1B8(void); +extern s32 func_8012C1DC(s32 a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern s32 func_8012AD50(void *a0); +extern s32 D_80182A84; + +void func_80142608(s32 param_1) +{ + register s32 iVar1 __asm__("$16"); + + if (*(short *)(param_1 + 0x70) != 0) { + iVar1 = ((s32 (*)(void))func_8012C1B8)(); + } else { + iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); + } + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CA1C(iVar1, (s32)&D_80182A84); + *(short *)(iVar1 + 0x1a) = 0x200; + *(short *)(iVar1 + 0x18) = 0x200; + *(short *)(param_1 + 0xfc) = 0x40; + if (*(short *)(param_1 + 0x70) != 0) { + goto ad50; + } + if (*(s32 *)(param_1 + 100) != 0) { + *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); + goto ad50; + } + } + ((void (*)(s32))func_8012CAE4)(param_1); + return; +ad50: + *(short *)(param_1 + 0x98) = 0; + *(s32 *)(param_1 + 0x90) = 0; + ((void (*)(s32))func_8012AD50)(param_1); +} + + +DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ + +DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ + +DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ + +DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ + +DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80182AB4[])(); + +void func_801427EC(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80182AB4[*(u16 *)(param_1 + 2)](); + } +} + + +DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ + +DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80182AD0[])(); + +void func_8014292C(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80182AD0[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80182CA0[])(); + +void func_80142978(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80182CA0[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80182D58[])(); + +void func_801429C4(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80182D58[*(u16 *)(param_1 + 2)](); + } +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80142A10); + + +// @class: struct +// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) + +extern u16 D_800B99D8; +extern struct packed_word D_8019D428; +extern u8 D_8019DDE0; +extern u8 D_8019DDE1; +extern u8 D_8019DDE2; + +void func_80142A80(void) +{ + u16 flags; + union word_bytes local; + s32 mul; + + flags = D_800B99D8; + local.pw = D_8019D428; + + if (flags & 0x10) { + mul = (s8)((flags & 0xf) >> 1) + 9; + } else { + mul = 0x10 - (s8)((flags & 0xf) >> 1); + } + + D_8019DDE0 = mul * (local.b[0] >> 4); + D_8019DDE1 = mul * (local.b[1] >> 4); + D_8019DDE2 = mul * (local.b[2] >> 4); +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80142B2C); + +DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ + +DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ + +DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ + +DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ + +DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ + +DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern int D_80182AA8; + +void func_80142DC4(int param_1) +{ + int v0; + + *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_80182AA8); + *(short *)(v0 + 0x1a) = 0x1800; + *(short *)(v0 + 0x18) = 0x1800; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80182AC4[]; + +void func_80142E38(int param_1) +{ + short sVar1; + int iVar2; + + *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_80182AC4); + sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; + *(short *)(iVar2 + 0x1a) = sVar1; + *(short *)(iVar2 + 0x18) = sVar1; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80142EC0); + +DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ + +DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result +// survives across func_8001CA1C while $v0 serves the pre-call store/test; +// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80182CB0[]; +extern unsigned char D_80182D10[]; + +void func_8014305C(int param_1) +{ + register int s0_param __asm__("$16") = param_1; + register int s1_copy __asm__("$17"); + int iVar2; + short sVar1; + + iVar2 = ((int (*)(void))func_8012C1B8)(); + *(int *)(s0_param + 0x20) = iVar2; + s1_copy = iVar2; + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(s0_param); + } else { + ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80182CB0); + sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; + *(short *)(s1_copy + 0x1a) = sVar1; + *(short *)(s1_copy + 0x18) = sVar1; + *(short *)(s0_param + 0xfc) = 0; + func_8012A828(s0_param, D_80182D10); + ((void (*)(int))func_80142B2C)(s0_param); + } +} + + +DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ + +DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) + + +extern void *memcpy(void *, const void *, u32); + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern int func_8001CA88(int, void *); +extern s32 func_8012E504(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80142B2C(void *arg0); + +extern u8 D_8019D424; +extern u8 D_8019DDE0; +extern u8 D_8019DDE4; + +void func_801431E8(s32 param_1) { + u8 buf[8]; + s32 iVar5; + u16 uVar2; + s16 sVar4; + + register s32 d __asm__("$16"); + memcpy(buf, &D_8019D424, 4); + iVar5 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = iVar5; + d = iVar5; + if (iVar5 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, void *))func_8001CA88)(d, &D_8019DDE0); + uVar2 = *(u16 *)(param_1 + 0x70); + *(s16 *)(d + 0x76) = -0x10; + sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; + *(s16 *)(d + 0x1a) = sVar4; + *(s16 *)(d + 0x18) = sVar4; + *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; + if (func_8012E504(param_1, 0x33) == 0) { + *(s16 *)(param_1 + 0xfc) = 1; + func_800233CC(&D_8019DDE0, 0x10); + memcpy(&D_8019DDE4, buf, 4); + } else { + *(s16 *)(param_1 + 0xfc) = 0; + } + ((void (*)(s32))func_80142B2C)(param_1); + } +} + + +DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ + +DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ + +DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) + +extern u8 D_800D387C[]; +extern u32 D_80182E68[]; + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80143458(s32 param_1) +{ + s32 p; + u16 v; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + p = *(s32 *)(param_1 + 0x20); + if (*(s32 *)(p + 4) == 0) { + *(s32 *)(p + 4) = 0x50000000; + } + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + v = *(u16 *)(param_1 + 0x34) & 0x7fff; + if (v != 0) { + p = *(s32 *)(param_1 + 0x20); + *(u16 *)(p + 0x1a) = v; + *(u16 *)(p + 0x18) = v; + } + + func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, + D_80182E68[*(u16 *)(param_1 + 0x34) & 3]); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + +DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_8014358C); + +DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ + +DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ + +DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ + +DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ + +DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ + +DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ + + +extern void (*D_80182F90[])(void); + +void func_80143B30(void *a0) { + D_80182F90[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ + +DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ + + +extern void (*D_80182F9C[])(void); + +void func_80143C38(void *a0) { + D_80182F9C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ + + +extern void (*D_80182FA4[])(void); + +void func_80143C98(void *a0) { + D_80182FA4[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80143D28); + + +extern void (*D_80182FEC[])(void); + +void func_80143E68(void *a0) { + D_80182FEC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ + +DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ + +DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ + +DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ + + +extern void (*D_80183000[])(void); + +void func_80144054(void *a0) { + D_80183000[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80144090); + +extern void func_8012C218(void *a0); + +// @class: struct +// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) + +extern void (*D_80183008[])(); + +void func_801442F8(int param_1) +{ + int iVar1; + + D_80183008[*(u16 *)(param_1 + 2)](); + iVar1 = *(int *)(param_1 + 0x1c) + 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (0x1d < iVar1) { + func_8012C218(param_1); + } +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern u8 D_80182F84; + +void func_80144364(int param_1) { + int iVar3; + u16 uVar2; + s16 sVar1; + + iVar3 = ((s32 (*)(void))func_8012C194)(); + if (iVar3 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); + *(int *)(param_1 + 0xCC) = iVar3; + *(u16 *)(param_1 + 0xFC) = uVar2; + func_8001CB6C((u8 *)iVar3, (s32)&D_80182F84, 0x250, 0x1A0); + *(s32 *)(iVar3 + 4) = 0x60000000; + *(u8 *)(iVar3 + 0x27) = 0x14; + *(u16 *)(iVar3 + 0x10) = 0x400; + *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); + *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); + *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); + sVar1 = *(s16 *)(param_1 + 0x70); + if (sVar1 != 0) { + *(s16 *)(iVar3 + 0x1A) = sVar1; + *(s16 *)(iVar3 + 0x18) = sVar1; + } else { + *(u16 *)(iVar3 + 0x1A) = 0x2000; + *(u16 *)(iVar3 + 0x18) = 0x2000; + } + *(u16 *)(param_1 + 2) = 1; + } +} + + + + +extern void func_80016714(void *a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *a0); +extern s32 D_80182F98; + +void func_80144458(void *arg0) { + s32 temp_s0; + void *temp_s2; + void *temp_v0; + + temp_s2 = M2C_FIELD(arg0, void **, 0xCC); + if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { + temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); + if (temp_v0 != NULL) { + temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; + M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80182F98 * 0x10); + M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80182F98 * 0x10); + func_8012AD80(arg0); + } + } + M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); + M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); + M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); + if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { + func_80016714(temp_s2, 0x38); + func_8012C218(arg0); + } +} + + +DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ + +DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ + +DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_80182FAC; +extern u8 D_80182FB8; + +void func_8014477C(void *param_1) { + s32 v0; + s32 v1; + register s32 uVar2 __asm__("$2"); + register s32 addr __asm__("$3"); + s32 gv; + s32 fv; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)param_1 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(param_1); + return; + } + ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80182FAC); + if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { + *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); + uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); + if (uVar2 != 0) { + addr = uVar2 & 0xFFFFFFF; + gv = *(u16 *)((addr | 0x80000000) + 8); + fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; + *(u16 *)((s32)param_1 + 0xA) = gv + fv; + } else { + *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; + } + } + ((void (*)(void *, void *))func_8012A828)(param_1, &D_80182FB8); + v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; + *(s16 *)((s32)param_1 + 0x2) = 1; + *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; + *(s32 *)((s32)param_1 + 0x1C) = 0x78; +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); + +extern u8 D_80182F84; +extern u8 D_80182FF4; + +void func_80144880(s32 param_1) +{ + register s32 obj __asm__("$16"); /* $s0 */ + register s32 self __asm__("$17") = param_1; /* $s1 */ + register s32 b __asm__("$2"); /* $v0 */ + s32 e; + + obj = ((s32 (*)(void))func_8012C194)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(self); + } else { + *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); + *(s32 *)(self + 0xCC) = obj; + if (*(s16 *)(self + 0x70) == 1) { + func_8001CB6C((u8 *)obj, (s32)&D_80182F84, 0x250, 0x1A0); + b = 0x14; + } else { + func_8001CB6C((u8 *)obj, (s32)&D_80182FF4, 0x300, 0x1D0); + b = 0x6A; + } + *(u8 *)(obj + 0x27) = (u8)b; + *(s32 *)(obj + 4) = 0x60000000; + *(u16 *)(obj + 0x10) = 0x400; + *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); + *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); + e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); + *(u16 *)(obj + 0x1A) = 0x4000; + *(u16 *)(obj + 0x18) = 0x4000; + *(u16 *)(obj + 0xC) = (u16)e; + *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; + } +} + + +DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ + + +extern void (*D_80183010[])(void); + +void func_801449C8(void *a0) { + D_80183010[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ + + +extern void (*D_80183018[])(void); + +void func_80144A2C(void *a0) { + D_80183018[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ + +DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ + +DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ + +DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_004/nonmatchings/ov_SC05_004_jr_801380E0", func_80144B14); + diff --git a/src/ov_SC05_005/ov_SC05_005_jr_8012ACE0.c b/src/ov_SC05_005/ov_SC05_005_jr_8012ACE0.c index 8397a7a0a..3d7bb30e4 100644 --- a/src/ov_SC05_005/ov_SC05_005_jr_8012ACE0.c +++ b/src/ov_SC05_005/ov_SC05_005_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182A44[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182A44[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182A88; -extern u8 D_80182ACC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182A88; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182ACC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182B10[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182B4C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182B4C; - if (((s16)a1) < 0xC00) { - tbl = D_80182B10; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182B88, D_80182B8A, D_80182B8C, D_80182B8E, D_80182B90, D_80182B92; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182B8A < ang)) goto outer_else; - if (!(ang < D_80182B90)) goto inner_else; - if (ang < D_80182B8C) { *(s16 *)L = D_80182B8C; goto done; } - if (D_80182B8E < ang) { *(s16 *)L = D_80182B8E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182B88) { *(s16 *)L = D_80182B88; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80182B92 < ang) { *(s16 *)L = D_80182B92; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B09E0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B09E0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B09E0; -extern s8 D_801B09E4; -extern s8 D_801B09E5; - -void func_8013C9C4(void * arg0) -{ - D_801B09E0 = arg0; - D_801B09E4 = 0; - D_801B09E5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B09E0; -extern s8 D_801B09E4; -extern s8 D_801B09E5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B09E0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B09E5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B09E4)) * 2) + D_801B09E0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B09E5 = (unsigned char) p[1]; - D_801B09E4 = D_801B09E4 + 1; - if (D_801B09E5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B09E4 = 0; - *base = 0; - } - } - else - { - D_801B09E5 = c - 1; - } - } - return; -} - - - -extern s32 D_801B0A04; -extern s32 D_801B09F8; -extern s32 D_801B09FC; -extern s32 D_801B0A08; - -void func_8013CABC(void) { - D_801B0A04 = 1; - D_801B09F8 = 1; - D_801B09FC = 0; - D_801B0A08 = 1; -} - - - -extern s32 D_801B09F8; -extern s32 D_801B09FC; -extern s32 D_801B0A00; -extern s32 D_801B0A04; -extern s32 D_801B0A08; - -void func_8013CAE8(void) { - D_801B09F8 = 1; - D_801B0A04 = 0; - D_801B09FC = 0; - D_801B0A00 = -1; - D_801B0A08 = 0; -} - - - -extern s32 D_801B0A04; -extern s32 D_801B0A08; -extern s32 D_801B0A30; -extern s32 D_801B0A34; - -void func_8013CB20(void) -{ - D_801B0A30 = D_801B0A08; - D_801B0A34 = D_801B0A04; - D_801B0A08 = 1; - D_801B0A04 = 0; -} - - - -extern s32 D_801B0A30; -extern s32 D_801B0A34; -extern s32 D_801B0A08; -extern s32 D_801B0A04; - -void func_8013CB5C(void) { - D_801B0A08 = D_801B0A30; - D_801B0A04 = D_801B0A34; -} - - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B1ED8; - extern u8 D_801B1ED9; - extern u8 D_801B1EDA; - extern u8 D_801B1EDB; - extern u8 D_801B1EDC; - extern u8 D_801B1EDD; - extern u8 D_801B1EDE; - extern u8 D_801B1EDF; - extern u8 D_801B1EE0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B1ED8; t1 = D_801B1ED9; t2 = D_801B1EDA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B1EDB; t1 = D_801B1EDC; t2 = D_801B1EDD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B1EDE; t1 = D_801B1EDF; t2 = D_801B1EE0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B0A10; -extern s32 D_801B09F8; -extern s32 D_801B0A14; -extern s32 D_801B0A04; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B0A10 != 0) { - if (D_801B0A10 != 2) { - if (((D_801B0A10 < 3) && (D_801B0A10 == 1)) && - (D_801B0A14 = D_801B0A14 + 1, 0x23a < D_801B0A14)) { - D_801B09F8 = D_801B0A10; - D_801B0A10 = 2; - } - } else { - D_801B09F8 = D_801B09F8 + -1; - if (D_801B09F8 == 0) { - D_801B09F8 = D_801B0A10; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B0A04 == 0) { - D_801B0A10 = D_801B0A10 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B0A04; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B0A04; -} - - - -extern s32 D_801B0A10; - -void func_8013D164(void) { - D_801B0A10 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B1FBA; -extern u8 D_801B202E; -extern u8 D_801B1EE2; -extern u8 D_801B1F9C; -extern u8 D_801B1EC0; -extern u8 D_801B1EE1; -extern s32 D_801B1FA0; - -void func_8013D330(void) { - if ((D_801B1FBA & 0xff) != D_801B202E) { - D_801B1FBA = ((D_801B1FBA & 0xff) < D_801B202E) ? (D_801B1FBA + 1) : (D_801B1FBA - 1); - } - if ((D_801B1EE2 & 0xff) != D_801B1F9C) { - D_801B1EE2 = ((D_801B1EE2 & 0xff) < D_801B1F9C) ? (D_801B1EE2 + 1) : (D_801B1EE2 - 1); - } - if ((D_801B1EC0 & 0xff) != D_801B1EE1) { - D_801B1EC0 = ((D_801B1EC0 & 0xff) < D_801B1EE1) ? (D_801B1EC0 + 1) : (D_801B1EC0 - 1); - } - D_801B1FA0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B09E8; -extern void *D_801B09EC; -extern void *D_801B09F0; -extern s32 D_801B0A18; -extern s32 D_801B0A1C; -extern s32 D_801B0A20; -extern s32 D_801B1F14[]; - -extern u8 D_80182C80[]; -extern u8 D_80182D28[]; -extern u8 D_80182BD8[]; -extern u8 D_80182CD4[]; -extern u8 D_80182D54[]; -extern u8 D_80182C2C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B0A18 = param_2; - D_801B0A1C = (param_2 >> 2) & 3; - D_801B0A20 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B09E8 = D_80182C80; - D_801B09EC = D_80182D28; - D_801B09F0 = D_80182BD8; - } else { - D_801B09E8 = D_80182CD4; - D_801B09EC = D_80182D54; - D_801B09F0 = D_80182C2C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B0A20 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B0A18 & 2) != 0) { - D_801B1F14[0] = 0x140; - D_801B1F14[3] = 0x80; - if (p[0x37] == 4) { - D_801B1F14[0] = 0x140; - D_801B1F14[3] = 0; - } - if (p[0x37] == 0) { - D_801B1F14[0] = 0x140; - D_801B1F14[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B09F0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B09F0; -extern s16 *D_801B09F4; -extern s32 D_801B0A04; -extern s32 D_801B0A24; -extern s32 D_801B0A28; -extern s32 D_801B0A2C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B09F4 != 0) { - D_801B0A04 = 0; - p = (int *)(param_1 * 12 + (int)D_801B09F0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B0A24 != x) { - flag = 1; - if (D_801B0A24 < x) { - if (x - D_801B0A24 < 5) { - D_801B0A24 = x; - } else { - D_801B0A24 = D_801B0A24 + 4; - } - } else { - if (D_801B0A24 - x < 5) { - D_801B0A24 = x; - } else { - D_801B0A24 = D_801B0A24 - 4; - } - } - } - if (D_801B0A28 != y) { - flag = 1; - if (D_801B0A28 < y) { - if (y - D_801B0A28 < 5) { - D_801B0A28 = y; - } else { - D_801B0A28 = D_801B0A28 + 4; - } - } else { - if (D_801B0A28 - y < 5) { - D_801B0A28 = y; - } else { - D_801B0A28 = D_801B0A28 - 4; - } - } - } - if (D_801B0A2C != z) { - flag = 1; - if (D_801B0A2C < z) { - if (z - D_801B0A2C < 5) { - D_801B0A2C = z; - } else { - D_801B0A2C = D_801B0A2C + 4; - } - } else { - if (D_801B0A2C - z < 5) { - D_801B0A2C = z; - } else { - D_801B0A2C = D_801B0A2C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B0A04 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182DE4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B09F4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B0A24); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B0A28); - uVar5 = (*(int*)&D_801B0A2C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182DE4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B0A0C; - -s32 func_8013E054(void) { - return D_801B0A0C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801837E0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801837B8; -extern s16 D_801837BA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801837E0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801837B8 = 2; - D_801837BA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801837BA = 0; - D_801837B8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B0A40; - extern void * D_801B0A44; - extern unsigned char D_80183458; - extern unsigned char D_80183470; - extern unsigned char D_801834E4; - extern unsigned char D_801834EC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B0A40 = &D_80183458; - D_801B0A44 = &D_801834E4; - } else { - D_801B0A40 = &D_80183470; - D_801B0A44 = &D_801834EC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801837E0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801837E0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801837E0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801837BC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801837BC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801837BC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801837B8; -extern s16 D_801837BA; -extern unsigned char D_801837BC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801837BA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801837B8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801837BA; - if (*r < 3) { - *r = *r + 1; - } - D_801837B8 = (u16)D_801837B8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801837BC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801837BC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801837BC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_005/ov_SC05_005_jr_801380E0.c b/src/ov_SC05_005/ov_SC05_005_jr_801380E0.c new file mode 100644 index 000000000..cc0d1da56 --- /dev/null +++ b/src/ov_SC05_005/ov_SC05_005_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AF780; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801826D8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B08FC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B1FC0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AF780; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182414)(); +extern s16 (*D_80182418)(); +extern M2C_UNK (*D_80182420)(); +extern s32 (*D_80182424)(); +extern s32 D_801B08F8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AF784; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018276C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185C50; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80182784; +extern M2C_UNK D_8018278C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182794; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801827B0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801827BC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801827D0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182820[]; +extern s16 D_80182850[]; +extern s16 D_801828B0[]; +extern s16 D_801828B8[]; +extern s16 D_801828D8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182910[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182968[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801829B0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801829B8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801829C0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801829C8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182970; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182990; +extern void func_801321B0(int param_1); +extern int D_801829A0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B0968; +extern s32 D_801B096C[]; +extern int D_801B0970; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801829D4; +extern u8 D_801829D0; +extern s16 *D_801829D8; +extern u8 D_801829DC; +extern int D_801B0968; +extern u16 D_801B0978; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801829D8; /* holds a pointer value (*(u16**)&D_801829D8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801829EC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182A40; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182A44[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182A44[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182A88; +extern u8 D_80182ACC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182A88; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182ACC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182B10[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182B4C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182B4C; + if (((s16)a1) < 0xC00) { + tbl = D_80182B10; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182B88, D_80182B8A, D_80182B8C, D_80182B8E, D_80182B90, D_80182B92; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182B8A < ang)) goto outer_else; + if (!(ang < D_80182B90)) goto inner_else; + if (ang < D_80182B8C) { *(s16 *)L = D_80182B8C; goto done; } + if (D_80182B8E < ang) { *(s16 *)L = D_80182B8E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182B88) { *(s16 *)L = D_80182B88; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182B92 < ang) { *(s16 *)L = D_80182B92; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B09E0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B09E0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B09E0; +extern s8 D_801B09E4; +extern s8 D_801B09E5; + +void func_8013C9C4(void * arg0) +{ + D_801B09E0 = arg0; + D_801B09E4 = 0; + D_801B09E5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B09E0; +extern s8 D_801B09E4; +extern s8 D_801B09E5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B09E0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B09E5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B09E4)) * 2) + D_801B09E0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B09E5 = (unsigned char) p[1]; + D_801B09E4 = D_801B09E4 + 1; + if (D_801B09E5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B09E4 = 0; + *base = 0; + } + } + else + { + D_801B09E5 = c - 1; + } + } + return; +} + + + +extern s32 D_801B0A04; +extern s32 D_801B09F8; +extern s32 D_801B09FC; +extern s32 D_801B0A08; + +void func_8013CABC(void) { + D_801B0A04 = 1; + D_801B09F8 = 1; + D_801B09FC = 0; + D_801B0A08 = 1; +} + + + +extern s32 D_801B09F8; +extern s32 D_801B09FC; +extern s32 D_801B0A00; +extern s32 D_801B0A04; +extern s32 D_801B0A08; + +void func_8013CAE8(void) { + D_801B09F8 = 1; + D_801B0A04 = 0; + D_801B09FC = 0; + D_801B0A00 = -1; + D_801B0A08 = 0; +} + + + +extern s32 D_801B0A04; +extern s32 D_801B0A08; +extern s32 D_801B0A30; +extern s32 D_801B0A34; + +void func_8013CB20(void) +{ + D_801B0A30 = D_801B0A08; + D_801B0A34 = D_801B0A04; + D_801B0A08 = 1; + D_801B0A04 = 0; +} + + + +extern s32 D_801B0A30; +extern s32 D_801B0A34; +extern s32 D_801B0A08; +extern s32 D_801B0A04; + +void func_8013CB5C(void) { + D_801B0A08 = D_801B0A30; + D_801B0A04 = D_801B0A34; +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B1ED8; + extern u8 D_801B1ED9; + extern u8 D_801B1EDA; + extern u8 D_801B1EDB; + extern u8 D_801B1EDC; + extern u8 D_801B1EDD; + extern u8 D_801B1EDE; + extern u8 D_801B1EDF; + extern u8 D_801B1EE0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B1ED8; t1 = D_801B1ED9; t2 = D_801B1EDA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B1EDB; t1 = D_801B1EDC; t2 = D_801B1EDD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B1EDE; t1 = D_801B1EDF; t2 = D_801B1EE0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B0A10; +extern s32 D_801B09F8; +extern s32 D_801B0A14; +extern s32 D_801B0A04; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B0A10 != 0) { + if (D_801B0A10 != 2) { + if (((D_801B0A10 < 3) && (D_801B0A10 == 1)) && + (D_801B0A14 = D_801B0A14 + 1, 0x23a < D_801B0A14)) { + D_801B09F8 = D_801B0A10; + D_801B0A10 = 2; + } + } else { + D_801B09F8 = D_801B09F8 + -1; + if (D_801B09F8 == 0) { + D_801B09F8 = D_801B0A10; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B0A04 == 0) { + D_801B0A10 = D_801B0A10 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B0A04; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B0A04; +} + + + +extern s32 D_801B0A10; + +void func_8013D164(void) { + D_801B0A10 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B1FBA; +extern u8 D_801B202E; +extern u8 D_801B1EE2; +extern u8 D_801B1F9C; +extern u8 D_801B1EC0; +extern u8 D_801B1EE1; +extern s32 D_801B1FA0; + +void func_8013D330(void) { + if ((D_801B1FBA & 0xff) != D_801B202E) { + D_801B1FBA = ((D_801B1FBA & 0xff) < D_801B202E) ? (D_801B1FBA + 1) : (D_801B1FBA - 1); + } + if ((D_801B1EE2 & 0xff) != D_801B1F9C) { + D_801B1EE2 = ((D_801B1EE2 & 0xff) < D_801B1F9C) ? (D_801B1EE2 + 1) : (D_801B1EE2 - 1); + } + if ((D_801B1EC0 & 0xff) != D_801B1EE1) { + D_801B1EC0 = ((D_801B1EC0 & 0xff) < D_801B1EE1) ? (D_801B1EC0 + 1) : (D_801B1EC0 - 1); + } + D_801B1FA0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B09E8; +extern void *D_801B09EC; +extern void *D_801B09F0; +extern s32 D_801B0A18; +extern s32 D_801B0A1C; +extern s32 D_801B0A20; +extern s32 D_801B1F14[]; + +extern u8 D_80182C80[]; +extern u8 D_80182D28[]; +extern u8 D_80182BD8[]; +extern u8 D_80182CD4[]; +extern u8 D_80182D54[]; +extern u8 D_80182C2C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B0A18 = param_2; + D_801B0A1C = (param_2 >> 2) & 3; + D_801B0A20 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B09E8 = D_80182C80; + D_801B09EC = D_80182D28; + D_801B09F0 = D_80182BD8; + } else { + D_801B09E8 = D_80182CD4; + D_801B09EC = D_80182D54; + D_801B09F0 = D_80182C2C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B0A20 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B0A18 & 2) != 0) { + D_801B1F14[0] = 0x140; + D_801B1F14[3] = 0x80; + if (p[0x37] == 4) { + D_801B1F14[0] = 0x140; + D_801B1F14[3] = 0; + } + if (p[0x37] == 0) { + D_801B1F14[0] = 0x140; + D_801B1F14[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B09F0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B09F0; +extern s16 *D_801B09F4; +extern s32 D_801B0A04; +extern s32 D_801B0A24; +extern s32 D_801B0A28; +extern s32 D_801B0A2C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B09F4 != 0) { + D_801B0A04 = 0; + p = (int *)(param_1 * 12 + (int)D_801B09F0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B0A24 != x) { + flag = 1; + if (D_801B0A24 < x) { + if (x - D_801B0A24 < 5) { + D_801B0A24 = x; + } else { + D_801B0A24 = D_801B0A24 + 4; + } + } else { + if (D_801B0A24 - x < 5) { + D_801B0A24 = x; + } else { + D_801B0A24 = D_801B0A24 - 4; + } + } + } + if (D_801B0A28 != y) { + flag = 1; + if (D_801B0A28 < y) { + if (y - D_801B0A28 < 5) { + D_801B0A28 = y; + } else { + D_801B0A28 = D_801B0A28 + 4; + } + } else { + if (D_801B0A28 - y < 5) { + D_801B0A28 = y; + } else { + D_801B0A28 = D_801B0A28 - 4; + } + } + } + if (D_801B0A2C != z) { + flag = 1; + if (D_801B0A2C < z) { + if (z - D_801B0A2C < 5) { + D_801B0A2C = z; + } else { + D_801B0A2C = D_801B0A2C + 4; + } + } else { + if (D_801B0A2C - z < 5) { + D_801B0A2C = z; + } else { + D_801B0A2C = D_801B0A2C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B0A04 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182DE4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B09F4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B0A24); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B0A28); + uVar5 = (*(int*)&D_801B0A2C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182DE4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B0A0C; + +s32 func_8013E054(void) { + return D_801B0A0C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801837E0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801837B8; +extern s16 D_801837BA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801837E0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801837B8 = 2; + D_801837BA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801837BA = 0; + D_801837B8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B0A40; + extern void * D_801B0A44; + extern unsigned char D_80183458; + extern unsigned char D_80183470; + extern unsigned char D_801834E4; + extern unsigned char D_801834EC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B0A40 = &D_80183458; + D_801B0A44 = &D_801834E4; + } else { + D_801B0A40 = &D_80183470; + D_801B0A44 = &D_801834EC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801837E0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801837E0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801837E0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801837BC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801837BC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801837BC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801837B8; +extern s16 D_801837BA; +extern unsigned char D_801837BC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801837BA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801837B8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801837BA; + if (*r < 3) { + *r = *r + 1; + } + D_801837B8 = (u16)D_801837B8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801837BC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801837BC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801837BC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_005/nonmatchings/ov_SC05_005_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_006/ov_SC05_006_jr_8012ACE0.c b/src/ov_SC05_006/ov_SC05_006_jr_8012ACE0.c index 8696d0f75..2fceaa71e 100644 --- a/src/ov_SC05_006/ov_SC05_006_jr_8012ACE0.c +++ b/src/ov_SC05_006/ov_SC05_006_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017FA64[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017FA64[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017FAA8; -extern u8 D_8017FAEC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017FAA8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017FAEC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017FB30[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017FB6C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017FB6C; - if (((s16)a1) < 0xC00) { - tbl = D_8017FB30; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017FBA8, D_8017FBAA, D_8017FBAC, D_8017FBAE, D_8017FBB0, D_8017FBB2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017FBAA < ang)) goto outer_else; - if (!(ang < D_8017FBB0)) goto inner_else; - if (ang < D_8017FBAC) { *(s16 *)L = D_8017FBAC; goto done; } - if (D_8017FBAE < ang) { *(s16 *)L = D_8017FBAE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017FBA8) { *(s16 *)L = D_8017FBA8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017FBB2 < ang) { *(s16 *)L = D_8017FBB2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018EB18; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018EB18, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018EB18; -extern s8 D_8018EB1C; -extern s8 D_8018EB1D; - -void func_8013C9C4(void * arg0) -{ - D_8018EB18 = arg0; - D_8018EB1C = 0; - D_8018EB1D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018EB18; -extern s8 D_8018EB1C; -extern s8 D_8018EB1D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018EB18; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018EB1D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018EB1C)) * 2) + D_8018EB18); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018EB1D = (unsigned char) p[1]; - D_8018EB1C = D_8018EB1C + 1; - if (D_8018EB1D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018EB1C = 0; - *base = 0; - } - } - else - { - D_8018EB1D = c - 1; - } - } - return; -} - - - -extern s32 D_8018EB3C; -extern s32 D_8018EB30; -extern s32 D_8018EB34; -extern s32 D_8018EB40; - -void func_8013CABC(void) { - D_8018EB3C = 1; - D_8018EB30 = 1; - D_8018EB34 = 0; - D_8018EB40 = 1; -} - - - -extern s32 D_8018EB30; -extern s32 D_8018EB34; -extern s32 D_8018EB38; -extern s32 D_8018EB3C; -extern s32 D_8018EB40; - -void func_8013CAE8(void) { - D_8018EB30 = 1; - D_8018EB3C = 0; - D_8018EB34 = 0; - D_8018EB38 = -1; - D_8018EB40 = 0; -} - - - -extern s32 D_8018EB3C; -extern s32 D_8018EB40; -extern s32 D_8018EB68; -extern s32 D_8018EB6C; - -void func_8013CB20(void) -{ - D_8018EB68 = D_8018EB40; - D_8018EB6C = D_8018EB3C; - D_8018EB40 = 1; - D_8018EB3C = 0; -} - - - -extern s32 D_8018EB68; -extern s32 D_8018EB6C; -extern s32 D_8018EB40; -extern s32 D_8018EB3C; - -void func_8013CB5C(void) { - D_8018EB40 = D_8018EB68; - D_8018EB3C = D_8018EB6C; -} - - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80190008; - extern u8 D_80190009; - extern u8 D_8019000A; - extern u8 D_8019000B; - extern u8 D_8019000C; - extern u8 D_8019000D; - extern u8 D_8019000E; - extern u8 D_8019000F; - extern u8 D_80190010; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80190008; t1 = D_80190009; t2 = D_8019000A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019000B; t1 = D_8019000C; t2 = D_8019000D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019000E; t1 = D_8019000F; t2 = D_80190010; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018EB48; -extern s32 D_8018EB30; -extern s32 D_8018EB4C; -extern s32 D_8018EB3C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018EB48 != 0) { - if (D_8018EB48 != 2) { - if (((D_8018EB48 < 3) && (D_8018EB48 == 1)) && - (D_8018EB4C = D_8018EB4C + 1, 0x23a < D_8018EB4C)) { - D_8018EB30 = D_8018EB48; - D_8018EB48 = 2; - } - } else { - D_8018EB30 = D_8018EB30 + -1; - if (D_8018EB30 == 0) { - D_8018EB30 = D_8018EB48; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018EB3C == 0) { - D_8018EB48 = D_8018EB48 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018EB3C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018EB3C; -} - - - -extern s32 D_8018EB48; - -void func_8013D164(void) { - D_8018EB48 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801900EA; -extern u8 D_8019015E; -extern u8 D_80190012; -extern u8 D_801900CC; -extern u8 D_8018FFF0; -extern u8 D_80190011; -extern s32 D_801900D0; - -void func_8013D330(void) { - if ((D_801900EA & 0xff) != D_8019015E) { - D_801900EA = ((D_801900EA & 0xff) < D_8019015E) ? (D_801900EA + 1) : (D_801900EA - 1); - } - if ((D_80190012 & 0xff) != D_801900CC) { - D_80190012 = ((D_80190012 & 0xff) < D_801900CC) ? (D_80190012 + 1) : (D_80190012 - 1); - } - if ((D_8018FFF0 & 0xff) != D_80190011) { - D_8018FFF0 = ((D_8018FFF0 & 0xff) < D_80190011) ? (D_8018FFF0 + 1) : (D_8018FFF0 - 1); - } - D_801900D0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018EB20; -extern void *D_8018EB24; -extern void *D_8018EB28; -extern s32 D_8018EB50; -extern s32 D_8018EB54; -extern s32 D_8018EB58; -extern s32 D_80190044[]; - -extern u8 D_8017FCA0[]; -extern u8 D_8017FD48[]; -extern u8 D_8017FBF8[]; -extern u8 D_8017FCF4[]; -extern u8 D_8017FD74[]; -extern u8 D_8017FC4C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018EB50 = param_2; - D_8018EB54 = (param_2 >> 2) & 3; - D_8018EB58 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018EB20 = D_8017FCA0; - D_8018EB24 = D_8017FD48; - D_8018EB28 = D_8017FBF8; - } else { - D_8018EB20 = D_8017FCF4; - D_8018EB24 = D_8017FD74; - D_8018EB28 = D_8017FC4C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018EB58 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018EB50 & 2) != 0) { - D_80190044[0] = 0x140; - D_80190044[3] = 0x80; - if (p[0x37] == 4) { - D_80190044[0] = 0x140; - D_80190044[3] = 0; - } - if (p[0x37] == 0) { - D_80190044[0] = 0x140; - D_80190044[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018EB28)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018EB28; -extern s16 *D_8018EB2C; -extern s32 D_8018EB3C; -extern s32 D_8018EB5C; -extern s32 D_8018EB60; -extern s32 D_8018EB64; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018EB2C != 0) { - D_8018EB3C = 0; - p = (int *)(param_1 * 12 + (int)D_8018EB28); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018EB5C != x) { - flag = 1; - if (D_8018EB5C < x) { - if (x - D_8018EB5C < 5) { - D_8018EB5C = x; - } else { - D_8018EB5C = D_8018EB5C + 4; - } - } else { - if (D_8018EB5C - x < 5) { - D_8018EB5C = x; - } else { - D_8018EB5C = D_8018EB5C - 4; - } - } - } - if (D_8018EB60 != y) { - flag = 1; - if (D_8018EB60 < y) { - if (y - D_8018EB60 < 5) { - D_8018EB60 = y; - } else { - D_8018EB60 = D_8018EB60 + 4; - } - } else { - if (D_8018EB60 - y < 5) { - D_8018EB60 = y; - } else { - D_8018EB60 = D_8018EB60 - 4; - } - } - } - if (D_8018EB64 != z) { - flag = 1; - if (D_8018EB64 < z) { - if (z - D_8018EB64 < 5) { - D_8018EB64 = z; - } else { - D_8018EB64 = D_8018EB64 + 4; - } - } else { - if (D_8018EB64 - z < 5) { - D_8018EB64 = z; - } else { - D_8018EB64 = D_8018EB64 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018EB3C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FE04[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018EB2C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018EB5C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018EB60); - uVar5 = (*(int*)&D_8018EB64); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FE04); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018EB44; - -s32 func_8013E054(void) { - return D_8018EB44; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180800; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801807D8; -extern s16 D_801807DA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180800; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801807D8 = 2; - D_801807DA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801807DA = 0; - D_801807D8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018EB78; - extern void * D_8018EB7C; - extern unsigned char D_80180478; - extern unsigned char D_80180490; - extern unsigned char D_80180504; - extern unsigned char D_8018050C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018EB78 = &D_80180478; - D_8018EB7C = &D_80180504; - } else { - D_8018EB78 = &D_80180490; - D_8018EB7C = &D_8018050C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180800/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180800 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180800)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801807DC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801807DC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801807DC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801807D8; -extern s16 D_801807DA; -extern unsigned char D_801807DC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801807DA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801807D8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801807DA; - if (*r < 3) { - *r = *r + 1; - } - D_801807D8 = (u16)D_801807D8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801807DC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801807DC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801807DC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_006/ov_SC05_006_jr_801380E0.c b/src/ov_SC05_006/ov_SC05_006_jr_801380E0.c new file mode 100644 index 000000000..cabfe8067 --- /dev/null +++ b/src/ov_SC05_006/ov_SC05_006_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D8D0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F6F8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018EA34; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801900F0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D8D0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F434)(); +extern s16 (*D_8017F438)(); +extern M2C_UNK (*D_8017F440)(); +extern s32 (*D_8017F444)(); +extern s32 D_8018EA30; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D8D4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F78C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182C70; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F7A4; +extern M2C_UNK D_8017F7AC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F7B4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F7D0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F7DC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F7F0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F840[]; +extern s16 D_8017F870[]; +extern s16 D_8017F8D0[]; +extern s16 D_8017F8D8[]; +extern s16 D_8017F8F8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F930[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F988[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F9D0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F9D8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F9E0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F9E8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F990; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F9B0; +extern void func_801321B0(int param_1); +extern int D_8017F9C0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018EAA0; +extern s32 D_8018EAA4[]; +extern int D_8018EAA8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F9F4; +extern u8 D_8017F9F0; +extern s16 *D_8017F9F8; +extern u8 D_8017F9FC; +extern int D_8018EAA0; +extern u16 D_8018EAB0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F9F8; /* holds a pointer value (*(u16**)&D_8017F9F8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017FA0C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017FA60; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017FA64[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017FA64[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017FAA8; +extern u8 D_8017FAEC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017FAA8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017FAEC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017FB30[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017FB6C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017FB6C; + if (((s16)a1) < 0xC00) { + tbl = D_8017FB30; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017FBA8, D_8017FBAA, D_8017FBAC, D_8017FBAE, D_8017FBB0, D_8017FBB2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017FBAA < ang)) goto outer_else; + if (!(ang < D_8017FBB0)) goto inner_else; + if (ang < D_8017FBAC) { *(s16 *)L = D_8017FBAC; goto done; } + if (D_8017FBAE < ang) { *(s16 *)L = D_8017FBAE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017FBA8) { *(s16 *)L = D_8017FBA8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017FBB2 < ang) { *(s16 *)L = D_8017FBB2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018EB18; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018EB18, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018EB18; +extern s8 D_8018EB1C; +extern s8 D_8018EB1D; + +void func_8013C9C4(void * arg0) +{ + D_8018EB18 = arg0; + D_8018EB1C = 0; + D_8018EB1D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018EB18; +extern s8 D_8018EB1C; +extern s8 D_8018EB1D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018EB18; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018EB1D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018EB1C)) * 2) + D_8018EB18); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018EB1D = (unsigned char) p[1]; + D_8018EB1C = D_8018EB1C + 1; + if (D_8018EB1D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018EB1C = 0; + *base = 0; + } + } + else + { + D_8018EB1D = c - 1; + } + } + return; +} + + + +extern s32 D_8018EB3C; +extern s32 D_8018EB30; +extern s32 D_8018EB34; +extern s32 D_8018EB40; + +void func_8013CABC(void) { + D_8018EB3C = 1; + D_8018EB30 = 1; + D_8018EB34 = 0; + D_8018EB40 = 1; +} + + + +extern s32 D_8018EB30; +extern s32 D_8018EB34; +extern s32 D_8018EB38; +extern s32 D_8018EB3C; +extern s32 D_8018EB40; + +void func_8013CAE8(void) { + D_8018EB30 = 1; + D_8018EB3C = 0; + D_8018EB34 = 0; + D_8018EB38 = -1; + D_8018EB40 = 0; +} + + + +extern s32 D_8018EB3C; +extern s32 D_8018EB40; +extern s32 D_8018EB68; +extern s32 D_8018EB6C; + +void func_8013CB20(void) +{ + D_8018EB68 = D_8018EB40; + D_8018EB6C = D_8018EB3C; + D_8018EB40 = 1; + D_8018EB3C = 0; +} + + + +extern s32 D_8018EB68; +extern s32 D_8018EB6C; +extern s32 D_8018EB40; +extern s32 D_8018EB3C; + +void func_8013CB5C(void) { + D_8018EB40 = D_8018EB68; + D_8018EB3C = D_8018EB6C; +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80190008; + extern u8 D_80190009; + extern u8 D_8019000A; + extern u8 D_8019000B; + extern u8 D_8019000C; + extern u8 D_8019000D; + extern u8 D_8019000E; + extern u8 D_8019000F; + extern u8 D_80190010; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80190008; t1 = D_80190009; t2 = D_8019000A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019000B; t1 = D_8019000C; t2 = D_8019000D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019000E; t1 = D_8019000F; t2 = D_80190010; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018EB48; +extern s32 D_8018EB30; +extern s32 D_8018EB4C; +extern s32 D_8018EB3C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018EB48 != 0) { + if (D_8018EB48 != 2) { + if (((D_8018EB48 < 3) && (D_8018EB48 == 1)) && + (D_8018EB4C = D_8018EB4C + 1, 0x23a < D_8018EB4C)) { + D_8018EB30 = D_8018EB48; + D_8018EB48 = 2; + } + } else { + D_8018EB30 = D_8018EB30 + -1; + if (D_8018EB30 == 0) { + D_8018EB30 = D_8018EB48; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018EB3C == 0) { + D_8018EB48 = D_8018EB48 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018EB3C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018EB3C; +} + + + +extern s32 D_8018EB48; + +void func_8013D164(void) { + D_8018EB48 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801900EA; +extern u8 D_8019015E; +extern u8 D_80190012; +extern u8 D_801900CC; +extern u8 D_8018FFF0; +extern u8 D_80190011; +extern s32 D_801900D0; + +void func_8013D330(void) { + if ((D_801900EA & 0xff) != D_8019015E) { + D_801900EA = ((D_801900EA & 0xff) < D_8019015E) ? (D_801900EA + 1) : (D_801900EA - 1); + } + if ((D_80190012 & 0xff) != D_801900CC) { + D_80190012 = ((D_80190012 & 0xff) < D_801900CC) ? (D_80190012 + 1) : (D_80190012 - 1); + } + if ((D_8018FFF0 & 0xff) != D_80190011) { + D_8018FFF0 = ((D_8018FFF0 & 0xff) < D_80190011) ? (D_8018FFF0 + 1) : (D_8018FFF0 - 1); + } + D_801900D0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018EB20; +extern void *D_8018EB24; +extern void *D_8018EB28; +extern s32 D_8018EB50; +extern s32 D_8018EB54; +extern s32 D_8018EB58; +extern s32 D_80190044[]; + +extern u8 D_8017FCA0[]; +extern u8 D_8017FD48[]; +extern u8 D_8017FBF8[]; +extern u8 D_8017FCF4[]; +extern u8 D_8017FD74[]; +extern u8 D_8017FC4C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018EB50 = param_2; + D_8018EB54 = (param_2 >> 2) & 3; + D_8018EB58 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018EB20 = D_8017FCA0; + D_8018EB24 = D_8017FD48; + D_8018EB28 = D_8017FBF8; + } else { + D_8018EB20 = D_8017FCF4; + D_8018EB24 = D_8017FD74; + D_8018EB28 = D_8017FC4C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018EB58 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018EB50 & 2) != 0) { + D_80190044[0] = 0x140; + D_80190044[3] = 0x80; + if (p[0x37] == 4) { + D_80190044[0] = 0x140; + D_80190044[3] = 0; + } + if (p[0x37] == 0) { + D_80190044[0] = 0x140; + D_80190044[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018EB28)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018EB28; +extern s16 *D_8018EB2C; +extern s32 D_8018EB3C; +extern s32 D_8018EB5C; +extern s32 D_8018EB60; +extern s32 D_8018EB64; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018EB2C != 0) { + D_8018EB3C = 0; + p = (int *)(param_1 * 12 + (int)D_8018EB28); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018EB5C != x) { + flag = 1; + if (D_8018EB5C < x) { + if (x - D_8018EB5C < 5) { + D_8018EB5C = x; + } else { + D_8018EB5C = D_8018EB5C + 4; + } + } else { + if (D_8018EB5C - x < 5) { + D_8018EB5C = x; + } else { + D_8018EB5C = D_8018EB5C - 4; + } + } + } + if (D_8018EB60 != y) { + flag = 1; + if (D_8018EB60 < y) { + if (y - D_8018EB60 < 5) { + D_8018EB60 = y; + } else { + D_8018EB60 = D_8018EB60 + 4; + } + } else { + if (D_8018EB60 - y < 5) { + D_8018EB60 = y; + } else { + D_8018EB60 = D_8018EB60 - 4; + } + } + } + if (D_8018EB64 != z) { + flag = 1; + if (D_8018EB64 < z) { + if (z - D_8018EB64 < 5) { + D_8018EB64 = z; + } else { + D_8018EB64 = D_8018EB64 + 4; + } + } else { + if (D_8018EB64 - z < 5) { + D_8018EB64 = z; + } else { + D_8018EB64 = D_8018EB64 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018EB3C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FE04[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018EB2C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018EB5C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018EB60); + uVar5 = (*(int*)&D_8018EB64); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FE04); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018EB44; + +s32 func_8013E054(void) { + return D_8018EB44; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180800; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801807D8; +extern s16 D_801807DA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180800; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801807D8 = 2; + D_801807DA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801807DA = 0; + D_801807D8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018EB78; + extern void * D_8018EB7C; + extern unsigned char D_80180478; + extern unsigned char D_80180490; + extern unsigned char D_80180504; + extern unsigned char D_8018050C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018EB78 = &D_80180478; + D_8018EB7C = &D_80180504; + } else { + D_8018EB78 = &D_80180490; + D_8018EB7C = &D_8018050C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180800/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180800 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180800)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801807DC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801807DC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801807DC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801807D8; +extern s16 D_801807DA; +extern unsigned char D_801807DC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801807DA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801807D8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801807DA; + if (*r < 3) { + *r = *r + 1; + } + D_801807D8 = (u16)D_801807D8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801807DC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801807DC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801807DC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_006/nonmatchings/ov_SC05_006_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_007/ov_SC05_007_jr_8012ACE0.c b/src/ov_SC05_007/ov_SC05_007_jr_8012ACE0.c index 6831635f9..c77011a3b 100644 --- a/src/ov_SC05_007/ov_SC05_007_jr_8012ACE0.c +++ b/src/ov_SC05_007/ov_SC05_007_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80181060[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80181060[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801810A4; -extern u8 D_801810E8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801810A4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801810E8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018112C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80181168[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80181168; - if (((s16)a1) < 0xC00) { - tbl = D_8018112C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801811A4, D_801811A6, D_801811A8, D_801811AA, D_801811AC, D_801811AE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801811A6 < ang)) goto outer_else; - if (!(ang < D_801811AC)) goto inner_else; - if (ang < D_801811A8) { *(s16 *)L = D_801811A8; goto done; } - if (D_801811AA < ang) { *(s16 *)L = D_801811AA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801811A4) { *(s16 *)L = D_801811A4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801811AE < ang) { *(s16 *)L = D_801811AE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019BAF8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019BAF8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019BAF8; -extern s8 D_8019BAFC; -extern s8 D_8019BAFD; - -void func_8013C9C4(void * arg0) -{ - D_8019BAF8 = arg0; - D_8019BAFC = 0; - D_8019BAFD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019BAF8; -extern s8 D_8019BAFC; -extern s8 D_8019BAFD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019BAF8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019BAFD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019BAFC)) * 2) + D_8019BAF8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019BAFD = (unsigned char) p[1]; - D_8019BAFC = D_8019BAFC + 1; - if (D_8019BAFD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019BAFC = 0; - *base = 0; - } - } - else - { - D_8019BAFD = c - 1; - } - } - return; -} - - - -extern s32 D_8019BB1C; -extern s32 D_8019BB10; -extern s32 D_8019BB14; -extern s32 D_8019BB20; - -void func_8013CABC(void) { - D_8019BB1C = 1; - D_8019BB10 = 1; - D_8019BB14 = 0; - D_8019BB20 = 1; -} - - - -extern s32 D_8019BB10; -extern s32 D_8019BB14; -extern s32 D_8019BB18; -extern s32 D_8019BB1C; -extern s32 D_8019BB20; - -void func_8013CAE8(void) { - D_8019BB10 = 1; - D_8019BB1C = 0; - D_8019BB14 = 0; - D_8019BB18 = -1; - D_8019BB20 = 0; -} - - - -extern s32 D_8019BB1C; -extern s32 D_8019BB20; -extern s32 D_8019BB48; -extern s32 D_8019BB4C; - -void func_8013CB20(void) -{ - D_8019BB48 = D_8019BB20; - D_8019BB4C = D_8019BB1C; - D_8019BB20 = 1; - D_8019BB1C = 0; -} - - - -extern s32 D_8019BB48; -extern s32 D_8019BB4C; -extern s32 D_8019BB20; -extern s32 D_8019BB1C; - -void func_8013CB5C(void) { - D_8019BB20 = D_8019BB48; - D_8019BB1C = D_8019BB4C; -} - - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019CDA8; - extern u8 D_8019CDA9; - extern u8 D_8019CDAA; - extern u8 D_8019CDAB; - extern u8 D_8019CDAC; - extern u8 D_8019CDAD; - extern u8 D_8019CDAE; - extern u8 D_8019CDAF; - extern u8 D_8019CDB0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019CDA8; t1 = D_8019CDA9; t2 = D_8019CDAA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019CDAB; t1 = D_8019CDAC; t2 = D_8019CDAD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019CDAE; t1 = D_8019CDAF; t2 = D_8019CDB0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019BB28; -extern s32 D_8019BB10; -extern s32 D_8019BB2C; -extern s32 D_8019BB1C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019BB28 != 0) { - if (D_8019BB28 != 2) { - if (((D_8019BB28 < 3) && (D_8019BB28 == 1)) && - (D_8019BB2C = D_8019BB2C + 1, 0x23a < D_8019BB2C)) { - D_8019BB10 = D_8019BB28; - D_8019BB28 = 2; - } - } else { - D_8019BB10 = D_8019BB10 + -1; - if (D_8019BB10 == 0) { - D_8019BB10 = D_8019BB28; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019BB1C == 0) { - D_8019BB28 = D_8019BB28 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019BB1C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019BB1C; -} - - - -extern s32 D_8019BB28; - -void func_8013D164(void) { - D_8019BB28 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019CE8A; -extern u8 D_8019CEFE; -extern u8 D_8019CDB2; -extern u8 D_8019CE6C; -extern u8 D_8019CD90; -extern u8 D_8019CDB1; -extern s32 D_8019CE70; - -void func_8013D330(void) { - if ((D_8019CE8A & 0xff) != D_8019CEFE) { - D_8019CE8A = ((D_8019CE8A & 0xff) < D_8019CEFE) ? (D_8019CE8A + 1) : (D_8019CE8A - 1); - } - if ((D_8019CDB2 & 0xff) != D_8019CE6C) { - D_8019CDB2 = ((D_8019CDB2 & 0xff) < D_8019CE6C) ? (D_8019CDB2 + 1) : (D_8019CDB2 - 1); - } - if ((D_8019CD90 & 0xff) != D_8019CDB1) { - D_8019CD90 = ((D_8019CD90 & 0xff) < D_8019CDB1) ? (D_8019CD90 + 1) : (D_8019CD90 - 1); - } - D_8019CE70 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019BB00; -extern void *D_8019BB04; -extern void *D_8019BB08; -extern s32 D_8019BB30; -extern s32 D_8019BB34; -extern s32 D_8019BB38; -extern s32 D_8019CDE4[]; - -extern u8 D_8018129C[]; -extern u8 D_80181344[]; -extern u8 D_801811F4[]; -extern u8 D_801812F0[]; -extern u8 D_80181370[]; -extern u8 D_80181248[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019BB30 = param_2; - D_8019BB34 = (param_2 >> 2) & 3; - D_8019BB38 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019BB00 = D_8018129C; - D_8019BB04 = D_80181344; - D_8019BB08 = D_801811F4; - } else { - D_8019BB00 = D_801812F0; - D_8019BB04 = D_80181370; - D_8019BB08 = D_80181248; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019BB38 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019BB30 & 2) != 0) { - D_8019CDE4[0] = 0x140; - D_8019CDE4[3] = 0x80; - if (p[0x37] == 4) { - D_8019CDE4[0] = 0x140; - D_8019CDE4[3] = 0; - } - if (p[0x37] == 0) { - D_8019CDE4[0] = 0x140; - D_8019CDE4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019BB08)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019BB08; -extern s16 *D_8019BB0C; -extern s32 D_8019BB1C; -extern s32 D_8019BB3C; -extern s32 D_8019BB40; -extern s32 D_8019BB44; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019BB0C != 0) { - D_8019BB1C = 0; - p = (int *)(param_1 * 12 + (int)D_8019BB08); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019BB3C != x) { - flag = 1; - if (D_8019BB3C < x) { - if (x - D_8019BB3C < 5) { - D_8019BB3C = x; - } else { - D_8019BB3C = D_8019BB3C + 4; - } - } else { - if (D_8019BB3C - x < 5) { - D_8019BB3C = x; - } else { - D_8019BB3C = D_8019BB3C - 4; - } - } - } - if (D_8019BB40 != y) { - flag = 1; - if (D_8019BB40 < y) { - if (y - D_8019BB40 < 5) { - D_8019BB40 = y; - } else { - D_8019BB40 = D_8019BB40 + 4; - } - } else { - if (D_8019BB40 - y < 5) { - D_8019BB40 = y; - } else { - D_8019BB40 = D_8019BB40 - 4; - } - } - } - if (D_8019BB44 != z) { - flag = 1; - if (D_8019BB44 < z) { - if (z - D_8019BB44 < 5) { - D_8019BB44 = z; - } else { - D_8019BB44 = D_8019BB44 + 4; - } - } else { - if (D_8019BB44 - z < 5) { - D_8019BB44 = z; - } else { - D_8019BB44 = D_8019BB44 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019BB1C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80181400[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019BB0C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019BB3C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019BB40); - uVar5 = (*(int*)&D_8019BB44); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80181400); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019BB24; - -s32 func_8013E054(void) { - return D_8019BB24; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80181DFC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80181DD4; -extern s16 D_80181DD6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80181DFC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80181DD4 = 2; - D_80181DD6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80181DD6 = 0; - D_80181DD4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019BB58; - extern void * D_8019BB5C; - extern unsigned char D_80181A74; - extern unsigned char D_80181A8C; - extern unsigned char D_80181B00; - extern unsigned char D_80181B08; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019BB58 = &D_80181A74; - D_8019BB5C = &D_80181B00; - } else { - D_8019BB58 = &D_80181A8C; - D_8019BB5C = &D_80181B08; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80181DFC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80181DFC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80181DFC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80181DD8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181DD8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181DD8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80181DD4; -extern s16 D_80181DD6; -extern unsigned char D_80181DD8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181DD6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80181DD4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80181DD6; - if (*r < 3) { - *r = *r + 1; - } - D_80181DD4 = (u16)D_80181DD4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181DD8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80181DD8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181DD8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_007/ov_SC05_007_jr_801380E0.c b/src/ov_SC05_007/ov_SC05_007_jr_801380E0.c new file mode 100644 index 000000000..835bf279a --- /dev/null +++ b/src/ov_SC05_007/ov_SC05_007_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019A8A8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80180CF4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019BA14; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019CE90; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019A8A8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180A30)(); +extern s16 (*D_80180A34)(); +extern M2C_UNK (*D_80180A3C)(); +extern s32 (*D_80180A40)(); +extern s32 D_8019BA10; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019A8AC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80180D88; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018426C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80180DA0; +extern M2C_UNK D_80180DA8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80180DB0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80180DCC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80180DD8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80180DEC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180E3C[]; +extern s16 D_80180E6C[]; +extern s16 D_80180ECC[]; +extern s16 D_80180ED4[]; +extern s16 D_80180EF4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80180F2C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180F84[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80180FCC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80180FD4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80180FDC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80180FE4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180F8C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80180FAC; +extern void func_801321B0(int param_1); +extern int D_80180FBC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019BA80; +extern s32 D_8019BA84[]; +extern int D_8019BA88; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80180FF0; +extern u8 D_80180FEC; +extern s16 *D_80180FF4; +extern u8 D_80180FF8; +extern int D_8019BA80; +extern u16 D_8019BA90; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80180FF4; /* holds a pointer value (*(u16**)&D_80180FF4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80181008[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018105C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80181060[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80181060[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801810A4; +extern u8 D_801810E8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801810A4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801810E8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018112C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80181168[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80181168; + if (((s16)a1) < 0xC00) { + tbl = D_8018112C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801811A4, D_801811A6, D_801811A8, D_801811AA, D_801811AC, D_801811AE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801811A6 < ang)) goto outer_else; + if (!(ang < D_801811AC)) goto inner_else; + if (ang < D_801811A8) { *(s16 *)L = D_801811A8; goto done; } + if (D_801811AA < ang) { *(s16 *)L = D_801811AA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801811A4) { *(s16 *)L = D_801811A4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801811AE < ang) { *(s16 *)L = D_801811AE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019BAF8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019BAF8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019BAF8; +extern s8 D_8019BAFC; +extern s8 D_8019BAFD; + +void func_8013C9C4(void * arg0) +{ + D_8019BAF8 = arg0; + D_8019BAFC = 0; + D_8019BAFD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019BAF8; +extern s8 D_8019BAFC; +extern s8 D_8019BAFD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019BAF8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019BAFD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019BAFC)) * 2) + D_8019BAF8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019BAFD = (unsigned char) p[1]; + D_8019BAFC = D_8019BAFC + 1; + if (D_8019BAFD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019BAFC = 0; + *base = 0; + } + } + else + { + D_8019BAFD = c - 1; + } + } + return; +} + + + +extern s32 D_8019BB1C; +extern s32 D_8019BB10; +extern s32 D_8019BB14; +extern s32 D_8019BB20; + +void func_8013CABC(void) { + D_8019BB1C = 1; + D_8019BB10 = 1; + D_8019BB14 = 0; + D_8019BB20 = 1; +} + + + +extern s32 D_8019BB10; +extern s32 D_8019BB14; +extern s32 D_8019BB18; +extern s32 D_8019BB1C; +extern s32 D_8019BB20; + +void func_8013CAE8(void) { + D_8019BB10 = 1; + D_8019BB1C = 0; + D_8019BB14 = 0; + D_8019BB18 = -1; + D_8019BB20 = 0; +} + + + +extern s32 D_8019BB1C; +extern s32 D_8019BB20; +extern s32 D_8019BB48; +extern s32 D_8019BB4C; + +void func_8013CB20(void) +{ + D_8019BB48 = D_8019BB20; + D_8019BB4C = D_8019BB1C; + D_8019BB20 = 1; + D_8019BB1C = 0; +} + + + +extern s32 D_8019BB48; +extern s32 D_8019BB4C; +extern s32 D_8019BB20; +extern s32 D_8019BB1C; + +void func_8013CB5C(void) { + D_8019BB20 = D_8019BB48; + D_8019BB1C = D_8019BB4C; +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019CDA8; + extern u8 D_8019CDA9; + extern u8 D_8019CDAA; + extern u8 D_8019CDAB; + extern u8 D_8019CDAC; + extern u8 D_8019CDAD; + extern u8 D_8019CDAE; + extern u8 D_8019CDAF; + extern u8 D_8019CDB0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019CDA8; t1 = D_8019CDA9; t2 = D_8019CDAA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019CDAB; t1 = D_8019CDAC; t2 = D_8019CDAD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019CDAE; t1 = D_8019CDAF; t2 = D_8019CDB0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019BB28; +extern s32 D_8019BB10; +extern s32 D_8019BB2C; +extern s32 D_8019BB1C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019BB28 != 0) { + if (D_8019BB28 != 2) { + if (((D_8019BB28 < 3) && (D_8019BB28 == 1)) && + (D_8019BB2C = D_8019BB2C + 1, 0x23a < D_8019BB2C)) { + D_8019BB10 = D_8019BB28; + D_8019BB28 = 2; + } + } else { + D_8019BB10 = D_8019BB10 + -1; + if (D_8019BB10 == 0) { + D_8019BB10 = D_8019BB28; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019BB1C == 0) { + D_8019BB28 = D_8019BB28 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019BB1C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019BB1C; +} + + + +extern s32 D_8019BB28; + +void func_8013D164(void) { + D_8019BB28 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019CE8A; +extern u8 D_8019CEFE; +extern u8 D_8019CDB2; +extern u8 D_8019CE6C; +extern u8 D_8019CD90; +extern u8 D_8019CDB1; +extern s32 D_8019CE70; + +void func_8013D330(void) { + if ((D_8019CE8A & 0xff) != D_8019CEFE) { + D_8019CE8A = ((D_8019CE8A & 0xff) < D_8019CEFE) ? (D_8019CE8A + 1) : (D_8019CE8A - 1); + } + if ((D_8019CDB2 & 0xff) != D_8019CE6C) { + D_8019CDB2 = ((D_8019CDB2 & 0xff) < D_8019CE6C) ? (D_8019CDB2 + 1) : (D_8019CDB2 - 1); + } + if ((D_8019CD90 & 0xff) != D_8019CDB1) { + D_8019CD90 = ((D_8019CD90 & 0xff) < D_8019CDB1) ? (D_8019CD90 + 1) : (D_8019CD90 - 1); + } + D_8019CE70 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019BB00; +extern void *D_8019BB04; +extern void *D_8019BB08; +extern s32 D_8019BB30; +extern s32 D_8019BB34; +extern s32 D_8019BB38; +extern s32 D_8019CDE4[]; + +extern u8 D_8018129C[]; +extern u8 D_80181344[]; +extern u8 D_801811F4[]; +extern u8 D_801812F0[]; +extern u8 D_80181370[]; +extern u8 D_80181248[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019BB30 = param_2; + D_8019BB34 = (param_2 >> 2) & 3; + D_8019BB38 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019BB00 = D_8018129C; + D_8019BB04 = D_80181344; + D_8019BB08 = D_801811F4; + } else { + D_8019BB00 = D_801812F0; + D_8019BB04 = D_80181370; + D_8019BB08 = D_80181248; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019BB38 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019BB30 & 2) != 0) { + D_8019CDE4[0] = 0x140; + D_8019CDE4[3] = 0x80; + if (p[0x37] == 4) { + D_8019CDE4[0] = 0x140; + D_8019CDE4[3] = 0; + } + if (p[0x37] == 0) { + D_8019CDE4[0] = 0x140; + D_8019CDE4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019BB08)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019BB08; +extern s16 *D_8019BB0C; +extern s32 D_8019BB1C; +extern s32 D_8019BB3C; +extern s32 D_8019BB40; +extern s32 D_8019BB44; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019BB0C != 0) { + D_8019BB1C = 0; + p = (int *)(param_1 * 12 + (int)D_8019BB08); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019BB3C != x) { + flag = 1; + if (D_8019BB3C < x) { + if (x - D_8019BB3C < 5) { + D_8019BB3C = x; + } else { + D_8019BB3C = D_8019BB3C + 4; + } + } else { + if (D_8019BB3C - x < 5) { + D_8019BB3C = x; + } else { + D_8019BB3C = D_8019BB3C - 4; + } + } + } + if (D_8019BB40 != y) { + flag = 1; + if (D_8019BB40 < y) { + if (y - D_8019BB40 < 5) { + D_8019BB40 = y; + } else { + D_8019BB40 = D_8019BB40 + 4; + } + } else { + if (D_8019BB40 - y < 5) { + D_8019BB40 = y; + } else { + D_8019BB40 = D_8019BB40 - 4; + } + } + } + if (D_8019BB44 != z) { + flag = 1; + if (D_8019BB44 < z) { + if (z - D_8019BB44 < 5) { + D_8019BB44 = z; + } else { + D_8019BB44 = D_8019BB44 + 4; + } + } else { + if (D_8019BB44 - z < 5) { + D_8019BB44 = z; + } else { + D_8019BB44 = D_8019BB44 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019BB1C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80181400[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019BB0C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019BB3C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019BB40); + uVar5 = (*(int*)&D_8019BB44); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80181400); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019BB24; + +s32 func_8013E054(void) { + return D_8019BB24; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80181DFC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80181DD4; +extern s16 D_80181DD6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80181DFC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80181DD4 = 2; + D_80181DD6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80181DD6 = 0; + D_80181DD4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019BB58; + extern void * D_8019BB5C; + extern unsigned char D_80181A74; + extern unsigned char D_80181A8C; + extern unsigned char D_80181B00; + extern unsigned char D_80181B08; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019BB58 = &D_80181A74; + D_8019BB5C = &D_80181B00; + } else { + D_8019BB58 = &D_80181A8C; + D_8019BB5C = &D_80181B08; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80181DFC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80181DFC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80181DFC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80181DD8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80181DD8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80181DD8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80181DD4; +extern s16 D_80181DD6; +extern unsigned char D_80181DD8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80181DD6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80181DD4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80181DD6; + if (*r < 3) { + *r = *r + 1; + } + D_80181DD4 = (u16)D_80181DD4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181DD8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80181DD8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80181DD8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_007/nonmatchings/ov_SC05_007_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_008/ov_SC05_008_jr_8012ACE0.c b/src/ov_SC05_008/ov_SC05_008_jr_8012ACE0.c index 8a92b9c7b..e6647acb8 100644 --- a/src/ov_SC05_008/ov_SC05_008_jr_8012ACE0.c +++ b/src/ov_SC05_008/ov_SC05_008_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182FB8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182FB8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182FFC; -extern u8 D_80183040; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182FFC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80183040 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80183084[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801830C0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801830C0; - if (((s16)a1) < 0xC00) { - tbl = D_80183084; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801830FC, D_801830FE, D_80183100, D_80183102, D_80183104, D_80183106; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801830FE < ang)) goto outer_else; - if (!(ang < D_80183104)) goto inner_else; - if (ang < D_80183100) { *(s16 *)L = D_80183100; goto done; } - if (D_80183102 < ang) { *(s16 *)L = D_80183102; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801830FC) { *(s16 *)L = D_801830FC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80183106 < ang) { *(s16 *)L = D_80183106; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019FE28; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019FE28, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019FE28; -extern s8 D_8019FE2C; -extern s8 D_8019FE2D; - -void func_8013C9C4(void * arg0) -{ - D_8019FE28 = arg0; - D_8019FE2C = 0; - D_8019FE2D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019FE28; -extern s8 D_8019FE2C; -extern s8 D_8019FE2D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019FE28; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019FE2D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019FE2C)) * 2) + D_8019FE28); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019FE2D = (unsigned char) p[1]; - D_8019FE2C = D_8019FE2C + 1; - if (D_8019FE2D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019FE2C = 0; - *base = 0; - } - } - else - { - D_8019FE2D = c - 1; - } - } - return; -} - - - -extern s32 D_8019FE4C; -extern s32 D_8019FE40; -extern s32 D_8019FE44; -extern s32 D_8019FE50; - -void func_8013CABC(void) { - D_8019FE4C = 1; - D_8019FE40 = 1; - D_8019FE44 = 0; - D_8019FE50 = 1; -} - - - -extern s32 D_8019FE40; -extern s32 D_8019FE44; -extern s32 D_8019FE48; -extern s32 D_8019FE4C; -extern s32 D_8019FE50; - -void func_8013CAE8(void) { - D_8019FE40 = 1; - D_8019FE4C = 0; - D_8019FE44 = 0; - D_8019FE48 = -1; - D_8019FE50 = 0; -} - - - -extern s32 D_8019FE4C; -extern s32 D_8019FE50; -extern s32 D_8019FE78; -extern s32 D_8019FE7C; - -void func_8013CB20(void) -{ - D_8019FE78 = D_8019FE50; - D_8019FE7C = D_8019FE4C; - D_8019FE50 = 1; - D_8019FE4C = 0; -} - - - -extern s32 D_8019FE78; -extern s32 D_8019FE7C; -extern s32 D_8019FE50; -extern s32 D_8019FE4C; - -void func_8013CB5C(void) { - D_8019FE50 = D_8019FE78; - D_8019FE4C = D_8019FE7C; -} - - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A1190; - extern u8 D_801A1191; - extern u8 D_801A1192; - extern u8 D_801A1193; - extern u8 D_801A1194; - extern u8 D_801A1195; - extern u8 D_801A1196; - extern u8 D_801A1197; - extern u8 D_801A1198; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A1190; t1 = D_801A1191; t2 = D_801A1192; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A1193; t1 = D_801A1194; t2 = D_801A1195; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A1196; t1 = D_801A1197; t2 = D_801A1198; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019FE58; -extern s32 D_8019FE40; -extern s32 D_8019FE5C; -extern s32 D_8019FE4C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019FE58 != 0) { - if (D_8019FE58 != 2) { - if (((D_8019FE58 < 3) && (D_8019FE58 == 1)) && - (D_8019FE5C = D_8019FE5C + 1, 0x23a < D_8019FE5C)) { - D_8019FE40 = D_8019FE58; - D_8019FE58 = 2; - } - } else { - D_8019FE40 = D_8019FE40 + -1; - if (D_8019FE40 == 0) { - D_8019FE40 = D_8019FE58; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019FE4C == 0) { - D_8019FE58 = D_8019FE58 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019FE4C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019FE4C; -} - - - -extern s32 D_8019FE58; - -void func_8013D164(void) { - D_8019FE58 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A1272; -extern u8 D_801A12EA; -extern u8 D_801A119A; -extern u8 D_801A1254; -extern u8 D_801A1148; -extern u8 D_801A1199; -extern s32 D_801A1258; - -void func_8013D330(void) { - if ((D_801A1272 & 0xff) != D_801A12EA) { - D_801A1272 = ((D_801A1272 & 0xff) < D_801A12EA) ? (D_801A1272 + 1) : (D_801A1272 - 1); - } - if ((D_801A119A & 0xff) != D_801A1254) { - D_801A119A = ((D_801A119A & 0xff) < D_801A1254) ? (D_801A119A + 1) : (D_801A119A - 1); - } - if ((D_801A1148 & 0xff) != D_801A1199) { - D_801A1148 = ((D_801A1148 & 0xff) < D_801A1199) ? (D_801A1148 + 1) : (D_801A1148 - 1); - } - D_801A1258 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019FE30; -extern void *D_8019FE34; -extern void *D_8019FE38; -extern s32 D_8019FE60; -extern s32 D_8019FE64; -extern s32 D_8019FE68; -extern s32 D_801A11CC[]; - -extern u8 D_801831F4[]; -extern u8 D_8018329C[]; -extern u8 D_8018314C[]; -extern u8 D_80183248[]; -extern u8 D_801832C8[]; -extern u8 D_801831A0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019FE60 = param_2; - D_8019FE64 = (param_2 >> 2) & 3; - D_8019FE68 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019FE30 = D_801831F4; - D_8019FE34 = D_8018329C; - D_8019FE38 = D_8018314C; - } else { - D_8019FE30 = D_80183248; - D_8019FE34 = D_801832C8; - D_8019FE38 = D_801831A0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019FE68 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019FE60 & 2) != 0) { - D_801A11CC[0] = 0x140; - D_801A11CC[3] = 0x80; - if (p[0x37] == 4) { - D_801A11CC[0] = 0x140; - D_801A11CC[3] = 0; - } - if (p[0x37] == 0) { - D_801A11CC[0] = 0x140; - D_801A11CC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019FE38)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019FE38; -extern s16 *D_8019FE3C; -extern s32 D_8019FE4C; -extern s32 D_8019FE6C; -extern s32 D_8019FE70; -extern s32 D_8019FE74; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019FE3C != 0) { - D_8019FE4C = 0; - p = (int *)(param_1 * 12 + (int)D_8019FE38); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019FE6C != x) { - flag = 1; - if (D_8019FE6C < x) { - if (x - D_8019FE6C < 5) { - D_8019FE6C = x; - } else { - D_8019FE6C = D_8019FE6C + 4; - } - } else { - if (D_8019FE6C - x < 5) { - D_8019FE6C = x; - } else { - D_8019FE6C = D_8019FE6C - 4; - } - } - } - if (D_8019FE70 != y) { - flag = 1; - if (D_8019FE70 < y) { - if (y - D_8019FE70 < 5) { - D_8019FE70 = y; - } else { - D_8019FE70 = D_8019FE70 + 4; - } - } else { - if (D_8019FE70 - y < 5) { - D_8019FE70 = y; - } else { - D_8019FE70 = D_8019FE70 - 4; - } - } - } - if (D_8019FE74 != z) { - flag = 1; - if (D_8019FE74 < z) { - if (z - D_8019FE74 < 5) { - D_8019FE74 = z; - } else { - D_8019FE74 = D_8019FE74 + 4; - } - } else { - if (D_8019FE74 - z < 5) { - D_8019FE74 = z; - } else { - D_8019FE74 = D_8019FE74 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019FE4C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183358[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019FE3C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019FE6C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019FE70); - uVar5 = (*(int*)&D_8019FE74); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183358); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019FE54; - -s32 func_8013E054(void) { - return D_8019FE54; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183D54; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183D2C; -extern s16 D_80183D2E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183D54; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183D2C = 2; - D_80183D2E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80183D2E = 0; - D_80183D2C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019FE88; - extern void * D_8019FE8C; - extern unsigned char D_801839CC; - extern unsigned char D_801839E4; - extern unsigned char D_80183A58; - extern unsigned char D_80183A60; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019FE88 = &D_801839CC; - D_8019FE8C = &D_80183A58; - } else { - D_8019FE88 = &D_801839E4; - D_8019FE8C = &D_80183A60; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183D54/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183D54 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183D54)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80183D30; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183D30)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183D30)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183D2C; -extern s16 D_80183D2E; -extern unsigned char D_80183D30; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183D2E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183D2C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80183D2E; - if (*r < 3) { - *r = *r + 1; - } - D_80183D2C = (u16)D_80183D2C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183D30); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80183D30; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183D30); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_008/ov_SC05_008_jr_801380E0.c b/src/ov_SC05_008/ov_SC05_008_jr_801380E0.c new file mode 100644 index 000000000..516ffd2f1 --- /dev/null +++ b/src/ov_SC05_008/ov_SC05_008_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019EBDC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182C4C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019FD44; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A1278; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019EBDC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182988)(); +extern s16 (*D_8018298C)(); +extern M2C_UNK (*D_80182994)(); +extern s32 (*D_80182998)(); +extern s32 D_8019FD40; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019EBE0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182CE0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801861C4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80182CF8; +extern M2C_UNK D_80182D00; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182D08; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80182D24[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80182D30[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182D44[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182D94[]; +extern s16 D_80182DC4[]; +extern s16 D_80182E24[]; +extern s16 D_80182E2C[]; +extern s16 D_80182E4C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182E84[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182EDC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182F24[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182F2C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182F34[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182F3C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182EE4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182F04; +extern void func_801321B0(int param_1); +extern int D_80182F14; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019FDB0; +extern s32 D_8019FDB4[]; +extern int D_8019FDB8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182F48; +extern u8 D_80182F44; +extern s16 *D_80182F4C; +extern u8 D_80182F50; +extern int D_8019FDB0; +extern u16 D_8019FDC0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182F4C; /* holds a pointer value (*(u16**)&D_80182F4C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182F60[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182FB4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182FB8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182FB8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182FFC; +extern u8 D_80183040; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182FFC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80183040 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80183084[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801830C0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801830C0; + if (((s16)a1) < 0xC00) { + tbl = D_80183084; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801830FC, D_801830FE, D_80183100, D_80183102, D_80183104, D_80183106; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801830FE < ang)) goto outer_else; + if (!(ang < D_80183104)) goto inner_else; + if (ang < D_80183100) { *(s16 *)L = D_80183100; goto done; } + if (D_80183102 < ang) { *(s16 *)L = D_80183102; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801830FC) { *(s16 *)L = D_801830FC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80183106 < ang) { *(s16 *)L = D_80183106; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019FE28; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019FE28, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019FE28; +extern s8 D_8019FE2C; +extern s8 D_8019FE2D; + +void func_8013C9C4(void * arg0) +{ + D_8019FE28 = arg0; + D_8019FE2C = 0; + D_8019FE2D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019FE28; +extern s8 D_8019FE2C; +extern s8 D_8019FE2D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019FE28; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019FE2D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019FE2C)) * 2) + D_8019FE28); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019FE2D = (unsigned char) p[1]; + D_8019FE2C = D_8019FE2C + 1; + if (D_8019FE2D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019FE2C = 0; + *base = 0; + } + } + else + { + D_8019FE2D = c - 1; + } + } + return; +} + + + +extern s32 D_8019FE4C; +extern s32 D_8019FE40; +extern s32 D_8019FE44; +extern s32 D_8019FE50; + +void func_8013CABC(void) { + D_8019FE4C = 1; + D_8019FE40 = 1; + D_8019FE44 = 0; + D_8019FE50 = 1; +} + + + +extern s32 D_8019FE40; +extern s32 D_8019FE44; +extern s32 D_8019FE48; +extern s32 D_8019FE4C; +extern s32 D_8019FE50; + +void func_8013CAE8(void) { + D_8019FE40 = 1; + D_8019FE4C = 0; + D_8019FE44 = 0; + D_8019FE48 = -1; + D_8019FE50 = 0; +} + + + +extern s32 D_8019FE4C; +extern s32 D_8019FE50; +extern s32 D_8019FE78; +extern s32 D_8019FE7C; + +void func_8013CB20(void) +{ + D_8019FE78 = D_8019FE50; + D_8019FE7C = D_8019FE4C; + D_8019FE50 = 1; + D_8019FE4C = 0; +} + + + +extern s32 D_8019FE78; +extern s32 D_8019FE7C; +extern s32 D_8019FE50; +extern s32 D_8019FE4C; + +void func_8013CB5C(void) { + D_8019FE50 = D_8019FE78; + D_8019FE4C = D_8019FE7C; +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A1190; + extern u8 D_801A1191; + extern u8 D_801A1192; + extern u8 D_801A1193; + extern u8 D_801A1194; + extern u8 D_801A1195; + extern u8 D_801A1196; + extern u8 D_801A1197; + extern u8 D_801A1198; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A1190; t1 = D_801A1191; t2 = D_801A1192; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A1193; t1 = D_801A1194; t2 = D_801A1195; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A1196; t1 = D_801A1197; t2 = D_801A1198; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019FE58; +extern s32 D_8019FE40; +extern s32 D_8019FE5C; +extern s32 D_8019FE4C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019FE58 != 0) { + if (D_8019FE58 != 2) { + if (((D_8019FE58 < 3) && (D_8019FE58 == 1)) && + (D_8019FE5C = D_8019FE5C + 1, 0x23a < D_8019FE5C)) { + D_8019FE40 = D_8019FE58; + D_8019FE58 = 2; + } + } else { + D_8019FE40 = D_8019FE40 + -1; + if (D_8019FE40 == 0) { + D_8019FE40 = D_8019FE58; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019FE4C == 0) { + D_8019FE58 = D_8019FE58 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019FE4C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019FE4C; +} + + + +extern s32 D_8019FE58; + +void func_8013D164(void) { + D_8019FE58 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A1272; +extern u8 D_801A12EA; +extern u8 D_801A119A; +extern u8 D_801A1254; +extern u8 D_801A1148; +extern u8 D_801A1199; +extern s32 D_801A1258; + +void func_8013D330(void) { + if ((D_801A1272 & 0xff) != D_801A12EA) { + D_801A1272 = ((D_801A1272 & 0xff) < D_801A12EA) ? (D_801A1272 + 1) : (D_801A1272 - 1); + } + if ((D_801A119A & 0xff) != D_801A1254) { + D_801A119A = ((D_801A119A & 0xff) < D_801A1254) ? (D_801A119A + 1) : (D_801A119A - 1); + } + if ((D_801A1148 & 0xff) != D_801A1199) { + D_801A1148 = ((D_801A1148 & 0xff) < D_801A1199) ? (D_801A1148 + 1) : (D_801A1148 - 1); + } + D_801A1258 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019FE30; +extern void *D_8019FE34; +extern void *D_8019FE38; +extern s32 D_8019FE60; +extern s32 D_8019FE64; +extern s32 D_8019FE68; +extern s32 D_801A11CC[]; + +extern u8 D_801831F4[]; +extern u8 D_8018329C[]; +extern u8 D_8018314C[]; +extern u8 D_80183248[]; +extern u8 D_801832C8[]; +extern u8 D_801831A0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019FE60 = param_2; + D_8019FE64 = (param_2 >> 2) & 3; + D_8019FE68 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019FE30 = D_801831F4; + D_8019FE34 = D_8018329C; + D_8019FE38 = D_8018314C; + } else { + D_8019FE30 = D_80183248; + D_8019FE34 = D_801832C8; + D_8019FE38 = D_801831A0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019FE68 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019FE60 & 2) != 0) { + D_801A11CC[0] = 0x140; + D_801A11CC[3] = 0x80; + if (p[0x37] == 4) { + D_801A11CC[0] = 0x140; + D_801A11CC[3] = 0; + } + if (p[0x37] == 0) { + D_801A11CC[0] = 0x140; + D_801A11CC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019FE38)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019FE38; +extern s16 *D_8019FE3C; +extern s32 D_8019FE4C; +extern s32 D_8019FE6C; +extern s32 D_8019FE70; +extern s32 D_8019FE74; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019FE3C != 0) { + D_8019FE4C = 0; + p = (int *)(param_1 * 12 + (int)D_8019FE38); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019FE6C != x) { + flag = 1; + if (D_8019FE6C < x) { + if (x - D_8019FE6C < 5) { + D_8019FE6C = x; + } else { + D_8019FE6C = D_8019FE6C + 4; + } + } else { + if (D_8019FE6C - x < 5) { + D_8019FE6C = x; + } else { + D_8019FE6C = D_8019FE6C - 4; + } + } + } + if (D_8019FE70 != y) { + flag = 1; + if (D_8019FE70 < y) { + if (y - D_8019FE70 < 5) { + D_8019FE70 = y; + } else { + D_8019FE70 = D_8019FE70 + 4; + } + } else { + if (D_8019FE70 - y < 5) { + D_8019FE70 = y; + } else { + D_8019FE70 = D_8019FE70 - 4; + } + } + } + if (D_8019FE74 != z) { + flag = 1; + if (D_8019FE74 < z) { + if (z - D_8019FE74 < 5) { + D_8019FE74 = z; + } else { + D_8019FE74 = D_8019FE74 + 4; + } + } else { + if (D_8019FE74 - z < 5) { + D_8019FE74 = z; + } else { + D_8019FE74 = D_8019FE74 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019FE4C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183358[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019FE3C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019FE6C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019FE70); + uVar5 = (*(int*)&D_8019FE74); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183358); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019FE54; + +s32 func_8013E054(void) { + return D_8019FE54; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183D54; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183D2C; +extern s16 D_80183D2E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183D54; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183D2C = 2; + D_80183D2E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80183D2E = 0; + D_80183D2C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019FE88; + extern void * D_8019FE8C; + extern unsigned char D_801839CC; + extern unsigned char D_801839E4; + extern unsigned char D_80183A58; + extern unsigned char D_80183A60; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019FE88 = &D_801839CC; + D_8019FE8C = &D_80183A58; + } else { + D_8019FE88 = &D_801839E4; + D_8019FE8C = &D_80183A60; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183D54/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183D54 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183D54)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80183D30; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183D30)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183D30)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183D2C; +extern s16 D_80183D2E; +extern unsigned char D_80183D30; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183D2E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183D2C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80183D2E; + if (*r < 3) { + *r = *r + 1; + } + D_80183D2C = (u16)D_80183D2C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183D30); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80183D30; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183D30); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_008/nonmatchings/ov_SC05_008_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_009/ov_SC05_009_jr_8012ACE0.c b/src/ov_SC05_009/ov_SC05_009_jr_8012ACE0.c index 4085b2f8a..b788ed670 100644 --- a/src/ov_SC05_009/ov_SC05_009_jr_8012ACE0.c +++ b/src/ov_SC05_009/ov_SC05_009_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F0C8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F0C8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F10C; -extern u8 D_8017F150; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F10C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F150 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F194[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F1D0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F1D0; - if (((s16)a1) < 0xC00) { - tbl = D_8017F194; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F20C, D_8017F20E, D_8017F210, D_8017F212, D_8017F214, D_8017F216; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F20E < ang)) goto outer_else; - if (!(ang < D_8017F214)) goto inner_else; - if (ang < D_8017F210) { *(s16 *)L = D_8017F210; goto done; } - if (D_8017F212 < ang) { *(s16 *)L = D_8017F212; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F20C) { *(s16 *)L = D_8017F20C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F216 < ang) { *(s16 *)L = D_8017F216; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80195838; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80195838, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80195838; -extern s8 D_8019583C; -extern s8 D_8019583D; - -void func_8013C9C4(void * arg0) -{ - D_80195838 = arg0; - D_8019583C = 0; - D_8019583D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80195838; -extern s8 D_8019583C; -extern s8 D_8019583D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80195838; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019583D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019583C)) * 2) + D_80195838); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019583D = (unsigned char) p[1]; - D_8019583C = D_8019583C + 1; - if (D_8019583D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019583C = 0; - *base = 0; - } - } - else - { - D_8019583D = c - 1; - } - } - return; -} - - - -extern s32 D_8019585C; -extern s32 D_80195850; -extern s32 D_80195854; -extern s32 D_80195860; - -void func_8013CABC(void) { - D_8019585C = 1; - D_80195850 = 1; - D_80195854 = 0; - D_80195860 = 1; -} - - - -extern s32 D_80195850; -extern s32 D_80195854; -extern s32 D_80195858; -extern s32 D_8019585C; -extern s32 D_80195860; - -void func_8013CAE8(void) { - D_80195850 = 1; - D_8019585C = 0; - D_80195854 = 0; - D_80195858 = -1; - D_80195860 = 0; -} - - - -extern s32 D_8019585C; -extern s32 D_80195860; -extern s32 D_80195888; -extern s32 D_8019588C; - -void func_8013CB20(void) -{ - D_80195888 = D_80195860; - D_8019588C = D_8019585C; - D_80195860 = 1; - D_8019585C = 0; -} - - - -extern s32 D_80195888; -extern s32 D_8019588C; -extern s32 D_80195860; -extern s32 D_8019585C; - -void func_8013CB5C(void) { - D_80195860 = D_80195888; - D_8019585C = D_8019588C; -} - - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_80196AF0; - extern u8 D_80196AF1; - extern u8 D_80196AF2; - extern u8 D_80196AF3; - extern u8 D_80196AF4; - extern u8 D_80196AF5; - extern u8 D_80196AF6; - extern u8 D_80196AF7; - extern u8 D_80196AF8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_80196AF0; t1 = D_80196AF1; t2 = D_80196AF2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_80196AF3; t1 = D_80196AF4; t2 = D_80196AF5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_80196AF6; t1 = D_80196AF7; t2 = D_80196AF8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80195868; -extern s32 D_80195850; -extern s32 D_8019586C; -extern s32 D_8019585C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80195868 != 0) { - if (D_80195868 != 2) { - if (((D_80195868 < 3) && (D_80195868 == 1)) && - (D_8019586C = D_8019586C + 1, 0x23a < D_8019586C)) { - D_80195850 = D_80195868; - D_80195868 = 2; - } - } else { - D_80195850 = D_80195850 + -1; - if (D_80195850 == 0) { - D_80195850 = D_80195868; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019585C == 0) { - D_80195868 = D_80195868 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019585C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019585C; -} - - - -extern s32 D_80195868; - -void func_8013D164(void) { - D_80195868 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_80196BD2; -extern u8 D_80196C46; -extern u8 D_80196AFA; -extern u8 D_80196BB4; -extern u8 D_80196AD8; -extern u8 D_80196AF9; -extern s32 D_80196BB8; - -void func_8013D330(void) { - if ((D_80196BD2 & 0xff) != D_80196C46) { - D_80196BD2 = ((D_80196BD2 & 0xff) < D_80196C46) ? (D_80196BD2 + 1) : (D_80196BD2 - 1); - } - if ((D_80196AFA & 0xff) != D_80196BB4) { - D_80196AFA = ((D_80196AFA & 0xff) < D_80196BB4) ? (D_80196AFA + 1) : (D_80196AFA - 1); - } - if ((D_80196AD8 & 0xff) != D_80196AF9) { - D_80196AD8 = ((D_80196AD8 & 0xff) < D_80196AF9) ? (D_80196AD8 + 1) : (D_80196AD8 - 1); - } - D_80196BB8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80195840; -extern void *D_80195844; -extern void *D_80195848; -extern s32 D_80195870; -extern s32 D_80195874; -extern s32 D_80195878; -extern s32 D_80196B2C[]; - -extern u8 D_8017F304[]; -extern u8 D_8017F3AC[]; -extern u8 D_8017F25C[]; -extern u8 D_8017F358[]; -extern u8 D_8017F3D8[]; -extern u8 D_8017F2B0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80195870 = param_2; - D_80195874 = (param_2 >> 2) & 3; - D_80195878 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80195840 = D_8017F304; - D_80195844 = D_8017F3AC; - D_80195848 = D_8017F25C; - } else { - D_80195840 = D_8017F358; - D_80195844 = D_8017F3D8; - D_80195848 = D_8017F2B0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80195878 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80195870 & 2) != 0) { - D_80196B2C[0] = 0x140; - D_80196B2C[3] = 0x80; - if (p[0x37] == 4) { - D_80196B2C[0] = 0x140; - D_80196B2C[3] = 0; - } - if (p[0x37] == 0) { - D_80196B2C[0] = 0x140; - D_80196B2C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80195848)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80195848; -extern s16 *D_8019584C; -extern s32 D_8019585C; -extern s32 D_8019587C; -extern s32 D_80195880; -extern s32 D_80195884; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019584C != 0) { - D_8019585C = 0; - p = (int *)(param_1 * 12 + (int)D_80195848); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019587C != x) { - flag = 1; - if (D_8019587C < x) { - if (x - D_8019587C < 5) { - D_8019587C = x; - } else { - D_8019587C = D_8019587C + 4; - } - } else { - if (D_8019587C - x < 5) { - D_8019587C = x; - } else { - D_8019587C = D_8019587C - 4; - } - } - } - if (D_80195880 != y) { - flag = 1; - if (D_80195880 < y) { - if (y - D_80195880 < 5) { - D_80195880 = y; - } else { - D_80195880 = D_80195880 + 4; - } - } else { - if (D_80195880 - y < 5) { - D_80195880 = y; - } else { - D_80195880 = D_80195880 - 4; - } - } - } - if (D_80195884 != z) { - flag = 1; - if (D_80195884 < z) { - if (z - D_80195884 < 5) { - D_80195884 = z; - } else { - D_80195884 = D_80195884 + 4; - } - } else { - if (D_80195884 - z < 5) { - D_80195884 = z; - } else { - D_80195884 = D_80195884 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019585C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F468[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019584C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019587C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80195880); - uVar5 = (*(int*)&D_80195884); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F468); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80195864; - -s32 func_8013E054(void) { - return D_80195864; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FE64; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FE3C; -extern s16 D_8017FE3E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FE64; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FE3C = 2; - D_8017FE3E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FE3E = 0; - D_8017FE3C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80195898; - extern void * D_8019589C; - extern unsigned char D_8017FADC; - extern unsigned char D_8017FAF4; - extern unsigned char D_8017FB68; - extern unsigned char D_8017FB70; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80195898 = &D_8017FADC; - D_8019589C = &D_8017FB68; - } else { - D_80195898 = &D_8017FAF4; - D_8019589C = &D_8017FB70; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FE64/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE64 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FE64)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FE40; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE40)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE40)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FE3C; -extern s16 D_8017FE3E; -extern unsigned char D_8017FE40; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE3E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FE3C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FE3E; - if (*r < 3) { - *r = *r + 1; - } - D_8017FE3C = (u16)D_8017FE3C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FE40; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_009/ov_SC05_009_jr_801380E0.c b/src/ov_SC05_009/ov_SC05_009_jr_801380E0.c new file mode 100644 index 000000000..9eeabba29 --- /dev/null +++ b/src/ov_SC05_009/ov_SC05_009_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801945F0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017ED5C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80195754; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80196BD8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801945F0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EA98)(); +extern s16 (*D_8017EA9C)(); +extern M2C_UNK (*D_8017EAA4)(); +extern s32 (*D_8017EAA8)(); +extern s32 D_80195750; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801945F4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017EDF0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801822D4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017EE08; +extern M2C_UNK D_8017EE10; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017EE18; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EE34[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EE40[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EE54[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EEA4[]; +extern s16 D_8017EED4[]; +extern s16 D_8017EF34[]; +extern s16 D_8017EF3C[]; +extern s16 D_8017EF5C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EF94[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017EFEC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F034[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F03C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F044[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F04C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017EFF4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F014; +extern void func_801321B0(int param_1); +extern int D_8017F024; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801957C0; +extern s32 D_801957C4[]; +extern int D_801957C8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F058; +extern u8 D_8017F054; +extern s16 *D_8017F05C; +extern u8 D_8017F060; +extern int D_801957C0; +extern u16 D_801957D0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F05C; /* holds a pointer value (*(u16**)&D_8017F05C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F070[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F0C4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F0C8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F0C8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F10C; +extern u8 D_8017F150; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F10C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F150 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F194[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F1D0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F1D0; + if (((s16)a1) < 0xC00) { + tbl = D_8017F194; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F20C, D_8017F20E, D_8017F210, D_8017F212, D_8017F214, D_8017F216; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F20E < ang)) goto outer_else; + if (!(ang < D_8017F214)) goto inner_else; + if (ang < D_8017F210) { *(s16 *)L = D_8017F210; goto done; } + if (D_8017F212 < ang) { *(s16 *)L = D_8017F212; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F20C) { *(s16 *)L = D_8017F20C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F216 < ang) { *(s16 *)L = D_8017F216; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80195838; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80195838, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80195838; +extern s8 D_8019583C; +extern s8 D_8019583D; + +void func_8013C9C4(void * arg0) +{ + D_80195838 = arg0; + D_8019583C = 0; + D_8019583D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80195838; +extern s8 D_8019583C; +extern s8 D_8019583D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80195838; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019583D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019583C)) * 2) + D_80195838); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019583D = (unsigned char) p[1]; + D_8019583C = D_8019583C + 1; + if (D_8019583D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019583C = 0; + *base = 0; + } + } + else + { + D_8019583D = c - 1; + } + } + return; +} + + + +extern s32 D_8019585C; +extern s32 D_80195850; +extern s32 D_80195854; +extern s32 D_80195860; + +void func_8013CABC(void) { + D_8019585C = 1; + D_80195850 = 1; + D_80195854 = 0; + D_80195860 = 1; +} + + + +extern s32 D_80195850; +extern s32 D_80195854; +extern s32 D_80195858; +extern s32 D_8019585C; +extern s32 D_80195860; + +void func_8013CAE8(void) { + D_80195850 = 1; + D_8019585C = 0; + D_80195854 = 0; + D_80195858 = -1; + D_80195860 = 0; +} + + + +extern s32 D_8019585C; +extern s32 D_80195860; +extern s32 D_80195888; +extern s32 D_8019588C; + +void func_8013CB20(void) +{ + D_80195888 = D_80195860; + D_8019588C = D_8019585C; + D_80195860 = 1; + D_8019585C = 0; +} + + + +extern s32 D_80195888; +extern s32 D_8019588C; +extern s32 D_80195860; +extern s32 D_8019585C; + +void func_8013CB5C(void) { + D_80195860 = D_80195888; + D_8019585C = D_8019588C; +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_80196AF0; + extern u8 D_80196AF1; + extern u8 D_80196AF2; + extern u8 D_80196AF3; + extern u8 D_80196AF4; + extern u8 D_80196AF5; + extern u8 D_80196AF6; + extern u8 D_80196AF7; + extern u8 D_80196AF8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_80196AF0; t1 = D_80196AF1; t2 = D_80196AF2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_80196AF3; t1 = D_80196AF4; t2 = D_80196AF5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_80196AF6; t1 = D_80196AF7; t2 = D_80196AF8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80195868; +extern s32 D_80195850; +extern s32 D_8019586C; +extern s32 D_8019585C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80195868 != 0) { + if (D_80195868 != 2) { + if (((D_80195868 < 3) && (D_80195868 == 1)) && + (D_8019586C = D_8019586C + 1, 0x23a < D_8019586C)) { + D_80195850 = D_80195868; + D_80195868 = 2; + } + } else { + D_80195850 = D_80195850 + -1; + if (D_80195850 == 0) { + D_80195850 = D_80195868; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019585C == 0) { + D_80195868 = D_80195868 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019585C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019585C; +} + + + +extern s32 D_80195868; + +void func_8013D164(void) { + D_80195868 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_80196BD2; +extern u8 D_80196C46; +extern u8 D_80196AFA; +extern u8 D_80196BB4; +extern u8 D_80196AD8; +extern u8 D_80196AF9; +extern s32 D_80196BB8; + +void func_8013D330(void) { + if ((D_80196BD2 & 0xff) != D_80196C46) { + D_80196BD2 = ((D_80196BD2 & 0xff) < D_80196C46) ? (D_80196BD2 + 1) : (D_80196BD2 - 1); + } + if ((D_80196AFA & 0xff) != D_80196BB4) { + D_80196AFA = ((D_80196AFA & 0xff) < D_80196BB4) ? (D_80196AFA + 1) : (D_80196AFA - 1); + } + if ((D_80196AD8 & 0xff) != D_80196AF9) { + D_80196AD8 = ((D_80196AD8 & 0xff) < D_80196AF9) ? (D_80196AD8 + 1) : (D_80196AD8 - 1); + } + D_80196BB8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80195840; +extern void *D_80195844; +extern void *D_80195848; +extern s32 D_80195870; +extern s32 D_80195874; +extern s32 D_80195878; +extern s32 D_80196B2C[]; + +extern u8 D_8017F304[]; +extern u8 D_8017F3AC[]; +extern u8 D_8017F25C[]; +extern u8 D_8017F358[]; +extern u8 D_8017F3D8[]; +extern u8 D_8017F2B0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80195870 = param_2; + D_80195874 = (param_2 >> 2) & 3; + D_80195878 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80195840 = D_8017F304; + D_80195844 = D_8017F3AC; + D_80195848 = D_8017F25C; + } else { + D_80195840 = D_8017F358; + D_80195844 = D_8017F3D8; + D_80195848 = D_8017F2B0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80195878 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80195870 & 2) != 0) { + D_80196B2C[0] = 0x140; + D_80196B2C[3] = 0x80; + if (p[0x37] == 4) { + D_80196B2C[0] = 0x140; + D_80196B2C[3] = 0; + } + if (p[0x37] == 0) { + D_80196B2C[0] = 0x140; + D_80196B2C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80195848)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80195848; +extern s16 *D_8019584C; +extern s32 D_8019585C; +extern s32 D_8019587C; +extern s32 D_80195880; +extern s32 D_80195884; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019584C != 0) { + D_8019585C = 0; + p = (int *)(param_1 * 12 + (int)D_80195848); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019587C != x) { + flag = 1; + if (D_8019587C < x) { + if (x - D_8019587C < 5) { + D_8019587C = x; + } else { + D_8019587C = D_8019587C + 4; + } + } else { + if (D_8019587C - x < 5) { + D_8019587C = x; + } else { + D_8019587C = D_8019587C - 4; + } + } + } + if (D_80195880 != y) { + flag = 1; + if (D_80195880 < y) { + if (y - D_80195880 < 5) { + D_80195880 = y; + } else { + D_80195880 = D_80195880 + 4; + } + } else { + if (D_80195880 - y < 5) { + D_80195880 = y; + } else { + D_80195880 = D_80195880 - 4; + } + } + } + if (D_80195884 != z) { + flag = 1; + if (D_80195884 < z) { + if (z - D_80195884 < 5) { + D_80195884 = z; + } else { + D_80195884 = D_80195884 + 4; + } + } else { + if (D_80195884 - z < 5) { + D_80195884 = z; + } else { + D_80195884 = D_80195884 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019585C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F468[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019584C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019587C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80195880); + uVar5 = (*(int*)&D_80195884); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F468); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80195864; + +s32 func_8013E054(void) { + return D_80195864; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FE64; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FE3C; +extern s16 D_8017FE3E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FE64; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FE3C = 2; + D_8017FE3E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FE3E = 0; + D_8017FE3C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80195898; + extern void * D_8019589C; + extern unsigned char D_8017FADC; + extern unsigned char D_8017FAF4; + extern unsigned char D_8017FB68; + extern unsigned char D_8017FB70; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80195898 = &D_8017FADC; + D_8019589C = &D_8017FB68; + } else { + D_80195898 = &D_8017FAF4; + D_8019589C = &D_8017FB70; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FE64/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE64 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FE64)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FE40; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE40)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE40)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FE3C; +extern s16 D_8017FE3E; +extern unsigned char D_8017FE40; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE3E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FE3C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FE3E; + if (*r < 3) { + *r = *r + 1; + } + D_8017FE3C = (u16)D_8017FE3C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FE40; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE40); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_009/nonmatchings/ov_SC05_009_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_010/ov_SC05_010_jr_8012ACE0.c b/src/ov_SC05_010/ov_SC05_010_jr_8012ACE0.c index b85281706..2d26f4609 100644 --- a/src/ov_SC05_010/ov_SC05_010_jr_8012ACE0.c +++ b/src/ov_SC05_010/ov_SC05_010_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80188FA4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80188FA4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80188FE8; -extern u8 D_8018902C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80188FE8; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018902C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80189070[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801890AC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801890AC; - if (((s16)a1) < 0xC00) { - tbl = D_80189070; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801890E8, D_801890EA, D_801890EC, D_801890EE, D_801890F0, D_801890F2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801890EA < ang)) goto outer_else; - if (!(ang < D_801890F0)) goto inner_else; - if (ang < D_801890EC) { *(s16 *)L = D_801890EC; goto done; } - if (D_801890EE < ang) { *(s16 *)L = D_801890EE; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801890E8) { *(s16 *)L = D_801890E8; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801890F2 < ang) { *(s16 *)L = D_801890F2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801C5C88; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801C5C88, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801C5C88; -extern s8 D_801C5C8C; -extern s8 D_801C5C8D; - -void func_8013C9C4(void * arg0) -{ - D_801C5C88 = arg0; - D_801C5C8C = 0; - D_801C5C8D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801C5C88; -extern s8 D_801C5C8C; -extern s8 D_801C5C8D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801C5C88; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801C5C8D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801C5C8C)) * 2) + D_801C5C88); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801C5C8D = (unsigned char) p[1]; - D_801C5C8C = D_801C5C8C + 1; - if (D_801C5C8D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801C5C8C = 0; - *base = 0; - } - } - else - { - D_801C5C8D = c - 1; - } - } - return; -} - - - -extern s32 D_801C5CAC; -extern s32 D_801C5CA0; -extern s32 D_801C5CA4; -extern s32 D_801C5CB0; - -void func_8013CABC(void) { - D_801C5CAC = 1; - D_801C5CA0 = 1; - D_801C5CA4 = 0; - D_801C5CB0 = 1; -} - - - -extern s32 D_801C5CA0; -extern s32 D_801C5CA4; -extern s32 D_801C5CA8; -extern s32 D_801C5CAC; -extern s32 D_801C5CB0; - -void func_8013CAE8(void) { - D_801C5CA0 = 1; - D_801C5CAC = 0; - D_801C5CA4 = 0; - D_801C5CA8 = -1; - D_801C5CB0 = 0; -} - - - -extern s32 D_801C5CAC; -extern s32 D_801C5CB0; -extern s32 D_801C5CD8; -extern s32 D_801C5CDC; - -void func_8013CB20(void) -{ - D_801C5CD8 = D_801C5CB0; - D_801C5CDC = D_801C5CAC; - D_801C5CB0 = 1; - D_801C5CAC = 0; -} - - - -extern s32 D_801C5CD8; -extern s32 D_801C5CDC; -extern s32 D_801C5CB0; -extern s32 D_801C5CAC; - -void func_8013CB5C(void) { - D_801C5CB0 = D_801C5CD8; - D_801C5CAC = D_801C5CDC; -} - - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801C7ED8; - extern u8 D_801C7ED9; - extern u8 D_801C7EDA; - extern u8 D_801C7EDB; - extern u8 D_801C7EDC; - extern u8 D_801C7EDD; - extern u8 D_801C7EDE; - extern u8 D_801C7EDF; - extern u8 D_801C7EE0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801C7ED8; t1 = D_801C7ED9; t2 = D_801C7EDA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801C7EDB; t1 = D_801C7EDC; t2 = D_801C7EDD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801C7EDE; t1 = D_801C7EDF; t2 = D_801C7EE0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801C5CB8; -extern s32 D_801C5CA0; -extern s32 D_801C5CBC; -extern s32 D_801C5CAC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801C5CB8 != 0) { - if (D_801C5CB8 != 2) { - if (((D_801C5CB8 < 3) && (D_801C5CB8 == 1)) && - (D_801C5CBC = D_801C5CBC + 1, 0x23a < D_801C5CBC)) { - D_801C5CA0 = D_801C5CB8; - D_801C5CB8 = 2; - } - } else { - D_801C5CA0 = D_801C5CA0 + -1; - if (D_801C5CA0 == 0) { - D_801C5CA0 = D_801C5CB8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801C5CAC == 0) { - D_801C5CB8 = D_801C5CB8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801C5CAC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801C5CAC; -} - - - -extern s32 D_801C5CB8; - -void func_8013D164(void) { - D_801C5CB8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801C7FBA; -extern u8 D_801C802E; -extern u8 D_801C7EE2; -extern u8 D_801C7F9C; -extern u8 D_801C7EC0; -extern u8 D_801C7EE1; -extern s32 D_801C7FA0; - -void func_8013D330(void) { - if ((D_801C7FBA & 0xff) != D_801C802E) { - D_801C7FBA = ((D_801C7FBA & 0xff) < D_801C802E) ? (D_801C7FBA + 1) : (D_801C7FBA - 1); - } - if ((D_801C7EE2 & 0xff) != D_801C7F9C) { - D_801C7EE2 = ((D_801C7EE2 & 0xff) < D_801C7F9C) ? (D_801C7EE2 + 1) : (D_801C7EE2 - 1); - } - if ((D_801C7EC0 & 0xff) != D_801C7EE1) { - D_801C7EC0 = ((D_801C7EC0 & 0xff) < D_801C7EE1) ? (D_801C7EC0 + 1) : (D_801C7EC0 - 1); - } - D_801C7FA0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801C5C90; -extern void *D_801C5C94; -extern void *D_801C5C98; -extern s32 D_801C5CC0; -extern s32 D_801C5CC4; -extern s32 D_801C5CC8; -extern s32 D_801C7F14[]; - -extern u8 D_801891E0[]; -extern u8 D_80189288[]; -extern u8 D_80189138[]; -extern u8 D_80189234[]; -extern u8 D_801892B4[]; -extern u8 D_8018918C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801C5CC0 = param_2; - D_801C5CC4 = (param_2 >> 2) & 3; - D_801C5CC8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801C5C90 = D_801891E0; - D_801C5C94 = D_80189288; - D_801C5C98 = D_80189138; - } else { - D_801C5C90 = D_80189234; - D_801C5C94 = D_801892B4; - D_801C5C98 = D_8018918C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801C5CC8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801C5CC0 & 2) != 0) { - D_801C7F14[0] = 0x140; - D_801C7F14[3] = 0x80; - if (p[0x37] == 4) { - D_801C7F14[0] = 0x140; - D_801C7F14[3] = 0; - } - if (p[0x37] == 0) { - D_801C7F14[0] = 0x140; - D_801C7F14[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801C5C98)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801C5C98; -extern s16 *D_801C5C9C; -extern s32 D_801C5CAC; -extern s32 D_801C5CCC; -extern s32 D_801C5CD0; -extern s32 D_801C5CD4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801C5C9C != 0) { - D_801C5CAC = 0; - p = (int *)(param_1 * 12 + (int)D_801C5C98); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801C5CCC != x) { - flag = 1; - if (D_801C5CCC < x) { - if (x - D_801C5CCC < 5) { - D_801C5CCC = x; - } else { - D_801C5CCC = D_801C5CCC + 4; - } - } else { - if (D_801C5CCC - x < 5) { - D_801C5CCC = x; - } else { - D_801C5CCC = D_801C5CCC - 4; - } - } - } - if (D_801C5CD0 != y) { - flag = 1; - if (D_801C5CD0 < y) { - if (y - D_801C5CD0 < 5) { - D_801C5CD0 = y; - } else { - D_801C5CD0 = D_801C5CD0 + 4; - } - } else { - if (D_801C5CD0 - y < 5) { - D_801C5CD0 = y; - } else { - D_801C5CD0 = D_801C5CD0 - 4; - } - } - } - if (D_801C5CD4 != z) { - flag = 1; - if (D_801C5CD4 < z) { - if (z - D_801C5CD4 < 5) { - D_801C5CD4 = z; - } else { - D_801C5CD4 = D_801C5CD4 + 4; - } - } else { - if (D_801C5CD4 - z < 5) { - D_801C5CD4 = z; - } else { - D_801C5CD4 = D_801C5CD4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801C5CAC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80189344[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801C5C9C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C5CCC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C5CD0); - uVar5 = (*(int*)&D_801C5CD4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80189344); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801C5CB4; - -s32 func_8013E054(void) { - return D_801C5CB4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80189D40; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80189D18; -extern s16 D_80189D1A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80189D40; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80189D18 = 2; - D_80189D1A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80189D1A = 0; - D_80189D18 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801C5CE8; - extern void * D_801C5CEC; - extern unsigned char D_801899B8; - extern unsigned char D_801899D0; - extern unsigned char D_80189A44; - extern unsigned char D_80189A4C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801C5CE8 = &D_801899B8; - D_801C5CEC = &D_80189A44; - } else { - D_801C5CE8 = &D_801899D0; - D_801C5CEC = &D_80189A4C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80189D40/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80189D40 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80189D40)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80189D1C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80189D1C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80189D1C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80189D18; -extern s16 D_80189D1A; -extern unsigned char D_80189D1C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80189D1A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80189D18` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80189D1A; - if (*r < 3) { - *r = *r + 1; - } - D_80189D18 = (u16)D_80189D18 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189D1C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80189D1C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189D1C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_010/ov_SC05_010_jr_801380E0.c b/src/ov_SC05_010/ov_SC05_010_jr_801380E0.c new file mode 100644 index 000000000..2bfda81c2 --- /dev/null +++ b/src/ov_SC05_010/ov_SC05_010_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801C4824; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80188C38[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801C5BA4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801C7FC0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801C4824; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80188974)(); +extern s16 (*D_80188978)(); +extern M2C_UNK (*D_80188980)(); +extern s32 (*D_80188984)(); +extern s32 D_801C5BA0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801C4828; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80188CCC; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018C1B0; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80188CE4; +extern M2C_UNK D_80188CEC; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80188CF4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80188D10[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80188D1C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80188D30[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80188D80[]; +extern s16 D_80188DB0[]; +extern s16 D_80188E10[]; +extern s16 D_80188E18[]; +extern s16 D_80188E38[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80188E70[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80188EC8[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80188F10[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80188F18[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80188F20[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80188F28[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80188ED0; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80188EF0; +extern void func_801321B0(int param_1); +extern int D_80188F00; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801C5C10; +extern s32 D_801C5C14[]; +extern int D_801C5C18; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80188F34; +extern u8 D_80188F30; +extern s16 *D_80188F38; +extern u8 D_80188F3C; +extern int D_801C5C10; +extern u16 D_801C5C20; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80188F38; /* holds a pointer value (*(u16**)&D_80188F38) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80188F4C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80188FA0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80188FA4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80188FA4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80188FE8; +extern u8 D_8018902C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80188FE8; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018902C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80189070[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801890AC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801890AC; + if (((s16)a1) < 0xC00) { + tbl = D_80189070; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801890E8, D_801890EA, D_801890EC, D_801890EE, D_801890F0, D_801890F2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801890EA < ang)) goto outer_else; + if (!(ang < D_801890F0)) goto inner_else; + if (ang < D_801890EC) { *(s16 *)L = D_801890EC; goto done; } + if (D_801890EE < ang) { *(s16 *)L = D_801890EE; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801890E8) { *(s16 *)L = D_801890E8; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801890F2 < ang) { *(s16 *)L = D_801890F2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801C5C88; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801C5C88, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801C5C88; +extern s8 D_801C5C8C; +extern s8 D_801C5C8D; + +void func_8013C9C4(void * arg0) +{ + D_801C5C88 = arg0; + D_801C5C8C = 0; + D_801C5C8D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801C5C88; +extern s8 D_801C5C8C; +extern s8 D_801C5C8D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801C5C88; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801C5C8D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801C5C8C)) * 2) + D_801C5C88); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801C5C8D = (unsigned char) p[1]; + D_801C5C8C = D_801C5C8C + 1; + if (D_801C5C8D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801C5C8C = 0; + *base = 0; + } + } + else + { + D_801C5C8D = c - 1; + } + } + return; +} + + + +extern s32 D_801C5CAC; +extern s32 D_801C5CA0; +extern s32 D_801C5CA4; +extern s32 D_801C5CB0; + +void func_8013CABC(void) { + D_801C5CAC = 1; + D_801C5CA0 = 1; + D_801C5CA4 = 0; + D_801C5CB0 = 1; +} + + + +extern s32 D_801C5CA0; +extern s32 D_801C5CA4; +extern s32 D_801C5CA8; +extern s32 D_801C5CAC; +extern s32 D_801C5CB0; + +void func_8013CAE8(void) { + D_801C5CA0 = 1; + D_801C5CAC = 0; + D_801C5CA4 = 0; + D_801C5CA8 = -1; + D_801C5CB0 = 0; +} + + + +extern s32 D_801C5CAC; +extern s32 D_801C5CB0; +extern s32 D_801C5CD8; +extern s32 D_801C5CDC; + +void func_8013CB20(void) +{ + D_801C5CD8 = D_801C5CB0; + D_801C5CDC = D_801C5CAC; + D_801C5CB0 = 1; + D_801C5CAC = 0; +} + + + +extern s32 D_801C5CD8; +extern s32 D_801C5CDC; +extern s32 D_801C5CB0; +extern s32 D_801C5CAC; + +void func_8013CB5C(void) { + D_801C5CB0 = D_801C5CD8; + D_801C5CAC = D_801C5CDC; +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801C7ED8; + extern u8 D_801C7ED9; + extern u8 D_801C7EDA; + extern u8 D_801C7EDB; + extern u8 D_801C7EDC; + extern u8 D_801C7EDD; + extern u8 D_801C7EDE; + extern u8 D_801C7EDF; + extern u8 D_801C7EE0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801C7ED8; t1 = D_801C7ED9; t2 = D_801C7EDA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801C7EDB; t1 = D_801C7EDC; t2 = D_801C7EDD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801C7EDE; t1 = D_801C7EDF; t2 = D_801C7EE0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801C5CB8; +extern s32 D_801C5CA0; +extern s32 D_801C5CBC; +extern s32 D_801C5CAC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801C5CB8 != 0) { + if (D_801C5CB8 != 2) { + if (((D_801C5CB8 < 3) && (D_801C5CB8 == 1)) && + (D_801C5CBC = D_801C5CBC + 1, 0x23a < D_801C5CBC)) { + D_801C5CA0 = D_801C5CB8; + D_801C5CB8 = 2; + } + } else { + D_801C5CA0 = D_801C5CA0 + -1; + if (D_801C5CA0 == 0) { + D_801C5CA0 = D_801C5CB8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801C5CAC == 0) { + D_801C5CB8 = D_801C5CB8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801C5CAC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801C5CAC; +} + + + +extern s32 D_801C5CB8; + +void func_8013D164(void) { + D_801C5CB8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801C7FBA; +extern u8 D_801C802E; +extern u8 D_801C7EE2; +extern u8 D_801C7F9C; +extern u8 D_801C7EC0; +extern u8 D_801C7EE1; +extern s32 D_801C7FA0; + +void func_8013D330(void) { + if ((D_801C7FBA & 0xff) != D_801C802E) { + D_801C7FBA = ((D_801C7FBA & 0xff) < D_801C802E) ? (D_801C7FBA + 1) : (D_801C7FBA - 1); + } + if ((D_801C7EE2 & 0xff) != D_801C7F9C) { + D_801C7EE2 = ((D_801C7EE2 & 0xff) < D_801C7F9C) ? (D_801C7EE2 + 1) : (D_801C7EE2 - 1); + } + if ((D_801C7EC0 & 0xff) != D_801C7EE1) { + D_801C7EC0 = ((D_801C7EC0 & 0xff) < D_801C7EE1) ? (D_801C7EC0 + 1) : (D_801C7EC0 - 1); + } + D_801C7FA0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801C5C90; +extern void *D_801C5C94; +extern void *D_801C5C98; +extern s32 D_801C5CC0; +extern s32 D_801C5CC4; +extern s32 D_801C5CC8; +extern s32 D_801C7F14[]; + +extern u8 D_801891E0[]; +extern u8 D_80189288[]; +extern u8 D_80189138[]; +extern u8 D_80189234[]; +extern u8 D_801892B4[]; +extern u8 D_8018918C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801C5CC0 = param_2; + D_801C5CC4 = (param_2 >> 2) & 3; + D_801C5CC8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801C5C90 = D_801891E0; + D_801C5C94 = D_80189288; + D_801C5C98 = D_80189138; + } else { + D_801C5C90 = D_80189234; + D_801C5C94 = D_801892B4; + D_801C5C98 = D_8018918C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801C5CC8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801C5CC0 & 2) != 0) { + D_801C7F14[0] = 0x140; + D_801C7F14[3] = 0x80; + if (p[0x37] == 4) { + D_801C7F14[0] = 0x140; + D_801C7F14[3] = 0; + } + if (p[0x37] == 0) { + D_801C7F14[0] = 0x140; + D_801C7F14[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801C5C98)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801C5C98; +extern s16 *D_801C5C9C; +extern s32 D_801C5CAC; +extern s32 D_801C5CCC; +extern s32 D_801C5CD0; +extern s32 D_801C5CD4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801C5C9C != 0) { + D_801C5CAC = 0; + p = (int *)(param_1 * 12 + (int)D_801C5C98); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801C5CCC != x) { + flag = 1; + if (D_801C5CCC < x) { + if (x - D_801C5CCC < 5) { + D_801C5CCC = x; + } else { + D_801C5CCC = D_801C5CCC + 4; + } + } else { + if (D_801C5CCC - x < 5) { + D_801C5CCC = x; + } else { + D_801C5CCC = D_801C5CCC - 4; + } + } + } + if (D_801C5CD0 != y) { + flag = 1; + if (D_801C5CD0 < y) { + if (y - D_801C5CD0 < 5) { + D_801C5CD0 = y; + } else { + D_801C5CD0 = D_801C5CD0 + 4; + } + } else { + if (D_801C5CD0 - y < 5) { + D_801C5CD0 = y; + } else { + D_801C5CD0 = D_801C5CD0 - 4; + } + } + } + if (D_801C5CD4 != z) { + flag = 1; + if (D_801C5CD4 < z) { + if (z - D_801C5CD4 < 5) { + D_801C5CD4 = z; + } else { + D_801C5CD4 = D_801C5CD4 + 4; + } + } else { + if (D_801C5CD4 - z < 5) { + D_801C5CD4 = z; + } else { + D_801C5CD4 = D_801C5CD4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801C5CAC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80189344[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801C5C9C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801C5CCC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801C5CD0); + uVar5 = (*(int*)&D_801C5CD4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80189344); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801C5CB4; + +s32 func_8013E054(void) { + return D_801C5CB4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80189D40; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80189D18; +extern s16 D_80189D1A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80189D40; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80189D18 = 2; + D_80189D1A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80189D1A = 0; + D_80189D18 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801C5CE8; + extern void * D_801C5CEC; + extern unsigned char D_801899B8; + extern unsigned char D_801899D0; + extern unsigned char D_80189A44; + extern unsigned char D_80189A4C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801C5CE8 = &D_801899B8; + D_801C5CEC = &D_80189A44; + } else { + D_801C5CE8 = &D_801899D0; + D_801C5CEC = &D_80189A4C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80189D40/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80189D40 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80189D40)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80189D1C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80189D1C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80189D1C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80189D18; +extern s16 D_80189D1A; +extern unsigned char D_80189D1C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80189D1A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80189D18` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80189D1A; + if (*r < 3) { + *r = *r + 1; + } + D_80189D18 = (u16)D_80189D18 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189D1C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80189D1C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189D1C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_010/nonmatchings/ov_SC05_010_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_011/ov_SC05_011_jr_8012ACE0.c b/src/ov_SC05_011/ov_SC05_011_jr_8012ACE0.c index 91b2aa089..0409bbae5 100644 --- a/src/ov_SC05_011/ov_SC05_011_jr_8012ACE0.c +++ b/src/ov_SC05_011/ov_SC05_011_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E31C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E31C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E360; -extern u8 D_8017E3A4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E360; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E3A4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E3E8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E424[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E424; - if (((s16)a1) < 0xC00) { - tbl = D_8017E3E8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E460, D_8017E462, D_8017E464, D_8017E466, D_8017E468, D_8017E46A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E462 < ang)) goto outer_else; - if (!(ang < D_8017E468)) goto inner_else; - if (ang < D_8017E464) { *(s16 *)L = D_8017E464; goto done; } - if (D_8017E466 < ang) { *(s16 *)L = D_8017E466; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E460) { *(s16 *)L = D_8017E460; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E46A < ang) { *(s16 *)L = D_8017E46A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019BE10; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019BE10, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019BE10; -extern s8 D_8019BE14; -extern s8 D_8019BE15; - -void func_8013C9C4(void * arg0) -{ - D_8019BE10 = arg0; - D_8019BE14 = 0; - D_8019BE15 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019BE10; -extern s8 D_8019BE14; -extern s8 D_8019BE15; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019BE10; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019BE15; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019BE14)) * 2) + D_8019BE10); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019BE15 = (unsigned char) p[1]; - D_8019BE14 = D_8019BE14 + 1; - if (D_8019BE15 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019BE14 = 0; - *base = 0; - } - } - else - { - D_8019BE15 = c - 1; - } - } - return; -} - - - -extern s32 D_8019BE34; -extern s32 D_8019BE28; -extern s32 D_8019BE2C; -extern s32 D_8019BE38; - -void func_8013CABC(void) { - D_8019BE34 = 1; - D_8019BE28 = 1; - D_8019BE2C = 0; - D_8019BE38 = 1; -} - - - -extern s32 D_8019BE28; -extern s32 D_8019BE2C; -extern s32 D_8019BE30; -extern s32 D_8019BE34; -extern s32 D_8019BE38; - -void func_8013CAE8(void) { - D_8019BE28 = 1; - D_8019BE34 = 0; - D_8019BE2C = 0; - D_8019BE30 = -1; - D_8019BE38 = 0; -} - - - -extern s32 D_8019BE34; -extern s32 D_8019BE38; -extern s32 D_8019BE60; -extern s32 D_8019BE64; - -void func_8013CB20(void) -{ - D_8019BE60 = D_8019BE38; - D_8019BE64 = D_8019BE34; - D_8019BE38 = 1; - D_8019BE34 = 0; -} - - - -extern s32 D_8019BE60; -extern s32 D_8019BE64; -extern s32 D_8019BE38; -extern s32 D_8019BE34; - -void func_8013CB5C(void) { - D_8019BE38 = D_8019BE60; - D_8019BE34 = D_8019BE64; -} - - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019D088; - extern u8 D_8019D089; - extern u8 D_8019D08A; - extern u8 D_8019D08B; - extern u8 D_8019D08C; - extern u8 D_8019D08D; - extern u8 D_8019D08E; - extern u8 D_8019D08F; - extern u8 D_8019D090; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019D088; t1 = D_8019D089; t2 = D_8019D08A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019D08B; t1 = D_8019D08C; t2 = D_8019D08D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019D08E; t1 = D_8019D08F; t2 = D_8019D090; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019BE40; -extern s32 D_8019BE28; -extern s32 D_8019BE44; -extern s32 D_8019BE34; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019BE40 != 0) { - if (D_8019BE40 != 2) { - if (((D_8019BE40 < 3) && (D_8019BE40 == 1)) && - (D_8019BE44 = D_8019BE44 + 1, 0x23a < D_8019BE44)) { - D_8019BE28 = D_8019BE40; - D_8019BE40 = 2; - } - } else { - D_8019BE28 = D_8019BE28 + -1; - if (D_8019BE28 == 0) { - D_8019BE28 = D_8019BE40; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019BE34 == 0) { - D_8019BE40 = D_8019BE40 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019BE34; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019BE34; -} - - - -extern s32 D_8019BE40; - -void func_8013D164(void) { - D_8019BE40 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019D16A; -extern u8 D_8019D1DE; -extern u8 D_8019D092; -extern u8 D_8019D14C; -extern u8 D_8019D070; -extern u8 D_8019D091; -extern s32 D_8019D150; - -void func_8013D330(void) { - if ((D_8019D16A & 0xff) != D_8019D1DE) { - D_8019D16A = ((D_8019D16A & 0xff) < D_8019D1DE) ? (D_8019D16A + 1) : (D_8019D16A - 1); - } - if ((D_8019D092 & 0xff) != D_8019D14C) { - D_8019D092 = ((D_8019D092 & 0xff) < D_8019D14C) ? (D_8019D092 + 1) : (D_8019D092 - 1); - } - if ((D_8019D070 & 0xff) != D_8019D091) { - D_8019D070 = ((D_8019D070 & 0xff) < D_8019D091) ? (D_8019D070 + 1) : (D_8019D070 - 1); - } - D_8019D150 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019BE18; -extern void *D_8019BE1C; -extern void *D_8019BE20; -extern s32 D_8019BE48; -extern s32 D_8019BE4C; -extern s32 D_8019BE50; -extern s32 D_8019D0C4[]; - -extern u8 D_8017E558[]; -extern u8 D_8017E600[]; -extern u8 D_8017E4B0[]; -extern u8 D_8017E5AC[]; -extern u8 D_8017E62C[]; -extern u8 D_8017E504[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019BE48 = param_2; - D_8019BE4C = (param_2 >> 2) & 3; - D_8019BE50 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019BE18 = D_8017E558; - D_8019BE1C = D_8017E600; - D_8019BE20 = D_8017E4B0; - } else { - D_8019BE18 = D_8017E5AC; - D_8019BE1C = D_8017E62C; - D_8019BE20 = D_8017E504; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019BE50 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019BE48 & 2) != 0) { - D_8019D0C4[0] = 0x140; - D_8019D0C4[3] = 0x80; - if (p[0x37] == 4) { - D_8019D0C4[0] = 0x140; - D_8019D0C4[3] = 0; - } - if (p[0x37] == 0) { - D_8019D0C4[0] = 0x140; - D_8019D0C4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019BE20)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019BE20; -extern s16 *D_8019BE24; -extern s32 D_8019BE34; -extern s32 D_8019BE54; -extern s32 D_8019BE58; -extern s32 D_8019BE5C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019BE24 != 0) { - D_8019BE34 = 0; - p = (int *)(param_1 * 12 + (int)D_8019BE20); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019BE54 != x) { - flag = 1; - if (D_8019BE54 < x) { - if (x - D_8019BE54 < 5) { - D_8019BE54 = x; - } else { - D_8019BE54 = D_8019BE54 + 4; - } - } else { - if (D_8019BE54 - x < 5) { - D_8019BE54 = x; - } else { - D_8019BE54 = D_8019BE54 - 4; - } - } - } - if (D_8019BE58 != y) { - flag = 1; - if (D_8019BE58 < y) { - if (y - D_8019BE58 < 5) { - D_8019BE58 = y; - } else { - D_8019BE58 = D_8019BE58 + 4; - } - } else { - if (D_8019BE58 - y < 5) { - D_8019BE58 = y; - } else { - D_8019BE58 = D_8019BE58 - 4; - } - } - } - if (D_8019BE5C != z) { - flag = 1; - if (D_8019BE5C < z) { - if (z - D_8019BE5C < 5) { - D_8019BE5C = z; - } else { - D_8019BE5C = D_8019BE5C + 4; - } - } else { - if (D_8019BE5C - z < 5) { - D_8019BE5C = z; - } else { - D_8019BE5C = D_8019BE5C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019BE34 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017E6BC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019BE24); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019BE54); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019BE58); - uVar5 = (*(int*)&D_8019BE5C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017E6BC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019BE3C; - -s32 func_8013E054(void) { - return D_8019BE3C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F0B8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F090; -extern s16 D_8017F092; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F0B8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F090 = 2; - D_8017F092 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F092 = 0; - D_8017F090 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019BE70; - extern void * D_8019BE74; - extern unsigned char D_8017ED30; - extern unsigned char D_8017ED48; - extern unsigned char D_8017EDBC; - extern unsigned char D_8017EDC4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019BE70 = &D_8017ED30; - D_8019BE74 = &D_8017EDBC; - } else { - D_8019BE70 = &D_8017ED48; - D_8019BE74 = &D_8017EDC4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F0B8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F0B8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F0B8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F094; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F094)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F094)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F090; -extern s16 D_8017F092; -extern unsigned char D_8017F094; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F092` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F090` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F092; - if (*r < 3) { - *r = *r + 1; - } - D_8017F090 = (u16)D_8017F090 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F094); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F094; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F094); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_011/ov_SC05_011_jr_801380E0.c b/src/ov_SC05_011/ov_SC05_011_jr_801380E0.c new file mode 100644 index 000000000..f7a1e7722 --- /dev/null +++ b/src/ov_SC05_011/ov_SC05_011_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019AB88; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017DFB0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019BD2C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019D170; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019AB88; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017DCEC)(); +extern s16 (*D_8017DCF0)(); +extern M2C_UNK (*D_8017DCF8)(); +extern s32 (*D_8017DCFC)(); +extern s32 D_8019BD28; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019AB8C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E044; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80181528; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E05C; +extern M2C_UNK D_8017E064; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E06C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E088[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E094[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E0A8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E0F8[]; +extern s16 D_8017E128[]; +extern s16 D_8017E188[]; +extern s16 D_8017E190[]; +extern s16 D_8017E1B0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E1E8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E240[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E288[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E290[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E298[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E2A0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E248; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E268; +extern void func_801321B0(int param_1); +extern int D_8017E278; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019BD98; +extern s32 D_8019BD9C[]; +extern int D_8019BDA0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E2AC; +extern u8 D_8017E2A8; +extern s16 *D_8017E2B0; +extern u8 D_8017E2B4; +extern int D_8019BD98; +extern u16 D_8019BDA8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E2B0; /* holds a pointer value (*(u16**)&D_8017E2B0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E2C4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E318; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E31C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E31C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E360; +extern u8 D_8017E3A4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E360; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E3A4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E3E8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E424[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E424; + if (((s16)a1) < 0xC00) { + tbl = D_8017E3E8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E460, D_8017E462, D_8017E464, D_8017E466, D_8017E468, D_8017E46A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E462 < ang)) goto outer_else; + if (!(ang < D_8017E468)) goto inner_else; + if (ang < D_8017E464) { *(s16 *)L = D_8017E464; goto done; } + if (D_8017E466 < ang) { *(s16 *)L = D_8017E466; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E460) { *(s16 *)L = D_8017E460; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E46A < ang) { *(s16 *)L = D_8017E46A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019BE10; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019BE10, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019BE10; +extern s8 D_8019BE14; +extern s8 D_8019BE15; + +void func_8013C9C4(void * arg0) +{ + D_8019BE10 = arg0; + D_8019BE14 = 0; + D_8019BE15 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019BE10; +extern s8 D_8019BE14; +extern s8 D_8019BE15; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019BE10; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019BE15; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019BE14)) * 2) + D_8019BE10); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019BE15 = (unsigned char) p[1]; + D_8019BE14 = D_8019BE14 + 1; + if (D_8019BE15 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019BE14 = 0; + *base = 0; + } + } + else + { + D_8019BE15 = c - 1; + } + } + return; +} + + + +extern s32 D_8019BE34; +extern s32 D_8019BE28; +extern s32 D_8019BE2C; +extern s32 D_8019BE38; + +void func_8013CABC(void) { + D_8019BE34 = 1; + D_8019BE28 = 1; + D_8019BE2C = 0; + D_8019BE38 = 1; +} + + + +extern s32 D_8019BE28; +extern s32 D_8019BE2C; +extern s32 D_8019BE30; +extern s32 D_8019BE34; +extern s32 D_8019BE38; + +void func_8013CAE8(void) { + D_8019BE28 = 1; + D_8019BE34 = 0; + D_8019BE2C = 0; + D_8019BE30 = -1; + D_8019BE38 = 0; +} + + + +extern s32 D_8019BE34; +extern s32 D_8019BE38; +extern s32 D_8019BE60; +extern s32 D_8019BE64; + +void func_8013CB20(void) +{ + D_8019BE60 = D_8019BE38; + D_8019BE64 = D_8019BE34; + D_8019BE38 = 1; + D_8019BE34 = 0; +} + + + +extern s32 D_8019BE60; +extern s32 D_8019BE64; +extern s32 D_8019BE38; +extern s32 D_8019BE34; + +void func_8013CB5C(void) { + D_8019BE38 = D_8019BE60; + D_8019BE34 = D_8019BE64; +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019D088; + extern u8 D_8019D089; + extern u8 D_8019D08A; + extern u8 D_8019D08B; + extern u8 D_8019D08C; + extern u8 D_8019D08D; + extern u8 D_8019D08E; + extern u8 D_8019D08F; + extern u8 D_8019D090; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019D088; t1 = D_8019D089; t2 = D_8019D08A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019D08B; t1 = D_8019D08C; t2 = D_8019D08D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019D08E; t1 = D_8019D08F; t2 = D_8019D090; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019BE40; +extern s32 D_8019BE28; +extern s32 D_8019BE44; +extern s32 D_8019BE34; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019BE40 != 0) { + if (D_8019BE40 != 2) { + if (((D_8019BE40 < 3) && (D_8019BE40 == 1)) && + (D_8019BE44 = D_8019BE44 + 1, 0x23a < D_8019BE44)) { + D_8019BE28 = D_8019BE40; + D_8019BE40 = 2; + } + } else { + D_8019BE28 = D_8019BE28 + -1; + if (D_8019BE28 == 0) { + D_8019BE28 = D_8019BE40; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019BE34 == 0) { + D_8019BE40 = D_8019BE40 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019BE34; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019BE34; +} + + + +extern s32 D_8019BE40; + +void func_8013D164(void) { + D_8019BE40 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019D16A; +extern u8 D_8019D1DE; +extern u8 D_8019D092; +extern u8 D_8019D14C; +extern u8 D_8019D070; +extern u8 D_8019D091; +extern s32 D_8019D150; + +void func_8013D330(void) { + if ((D_8019D16A & 0xff) != D_8019D1DE) { + D_8019D16A = ((D_8019D16A & 0xff) < D_8019D1DE) ? (D_8019D16A + 1) : (D_8019D16A - 1); + } + if ((D_8019D092 & 0xff) != D_8019D14C) { + D_8019D092 = ((D_8019D092 & 0xff) < D_8019D14C) ? (D_8019D092 + 1) : (D_8019D092 - 1); + } + if ((D_8019D070 & 0xff) != D_8019D091) { + D_8019D070 = ((D_8019D070 & 0xff) < D_8019D091) ? (D_8019D070 + 1) : (D_8019D070 - 1); + } + D_8019D150 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019BE18; +extern void *D_8019BE1C; +extern void *D_8019BE20; +extern s32 D_8019BE48; +extern s32 D_8019BE4C; +extern s32 D_8019BE50; +extern s32 D_8019D0C4[]; + +extern u8 D_8017E558[]; +extern u8 D_8017E600[]; +extern u8 D_8017E4B0[]; +extern u8 D_8017E5AC[]; +extern u8 D_8017E62C[]; +extern u8 D_8017E504[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019BE48 = param_2; + D_8019BE4C = (param_2 >> 2) & 3; + D_8019BE50 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019BE18 = D_8017E558; + D_8019BE1C = D_8017E600; + D_8019BE20 = D_8017E4B0; + } else { + D_8019BE18 = D_8017E5AC; + D_8019BE1C = D_8017E62C; + D_8019BE20 = D_8017E504; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019BE50 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019BE48 & 2) != 0) { + D_8019D0C4[0] = 0x140; + D_8019D0C4[3] = 0x80; + if (p[0x37] == 4) { + D_8019D0C4[0] = 0x140; + D_8019D0C4[3] = 0; + } + if (p[0x37] == 0) { + D_8019D0C4[0] = 0x140; + D_8019D0C4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019BE20)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019BE20; +extern s16 *D_8019BE24; +extern s32 D_8019BE34; +extern s32 D_8019BE54; +extern s32 D_8019BE58; +extern s32 D_8019BE5C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019BE24 != 0) { + D_8019BE34 = 0; + p = (int *)(param_1 * 12 + (int)D_8019BE20); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019BE54 != x) { + flag = 1; + if (D_8019BE54 < x) { + if (x - D_8019BE54 < 5) { + D_8019BE54 = x; + } else { + D_8019BE54 = D_8019BE54 + 4; + } + } else { + if (D_8019BE54 - x < 5) { + D_8019BE54 = x; + } else { + D_8019BE54 = D_8019BE54 - 4; + } + } + } + if (D_8019BE58 != y) { + flag = 1; + if (D_8019BE58 < y) { + if (y - D_8019BE58 < 5) { + D_8019BE58 = y; + } else { + D_8019BE58 = D_8019BE58 + 4; + } + } else { + if (D_8019BE58 - y < 5) { + D_8019BE58 = y; + } else { + D_8019BE58 = D_8019BE58 - 4; + } + } + } + if (D_8019BE5C != z) { + flag = 1; + if (D_8019BE5C < z) { + if (z - D_8019BE5C < 5) { + D_8019BE5C = z; + } else { + D_8019BE5C = D_8019BE5C + 4; + } + } else { + if (D_8019BE5C - z < 5) { + D_8019BE5C = z; + } else { + D_8019BE5C = D_8019BE5C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019BE34 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017E6BC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019BE24); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019BE54); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019BE58); + uVar5 = (*(int*)&D_8019BE5C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017E6BC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019BE3C; + +s32 func_8013E054(void) { + return D_8019BE3C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F0B8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F090; +extern s16 D_8017F092; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F0B8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F090 = 2; + D_8017F092 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F092 = 0; + D_8017F090 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019BE70; + extern void * D_8019BE74; + extern unsigned char D_8017ED30; + extern unsigned char D_8017ED48; + extern unsigned char D_8017EDBC; + extern unsigned char D_8017EDC4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019BE70 = &D_8017ED30; + D_8019BE74 = &D_8017EDBC; + } else { + D_8019BE70 = &D_8017ED48; + D_8019BE74 = &D_8017EDC4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F0B8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F0B8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F0B8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F094; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F094)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F094)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F090; +extern s16 D_8017F092; +extern unsigned char D_8017F094; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F092` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F090` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F092; + if (*r < 3) { + *r = *r + 1; + } + D_8017F090 = (u16)D_8017F090 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F094); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F094; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F094); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_011/nonmatchings/ov_SC05_011_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_017/ov_SC05_017_jr_8012ACE0.c b/src/ov_SC05_017/ov_SC05_017_jr_8012ACE0.c index 25a55aad9..7253f0321 100644 --- a/src/ov_SC05_017/ov_SC05_017_jr_8012ACE0.c +++ b/src/ov_SC05_017/ov_SC05_017_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018D7DC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018D7DC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018D820; -extern u8 D_8018D864; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018D820; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018D864 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018D8A8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018D8E4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018D8E4; - if (((s16)a1) < 0xC00) { - tbl = D_8018D8A8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018D920, D_8018D922, D_8018D924, D_8018D926, D_8018D928, D_8018D92A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018D922 < ang)) goto outer_else; - if (!(ang < D_8018D928)) goto inner_else; - if (ang < D_8018D924) { *(s16 *)L = D_8018D924; goto done; } - if (D_8018D926 < ang) { *(s16 *)L = D_8018D926; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018D920) { *(s16 *)L = D_8018D920; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018D92A < ang) { *(s16 *)L = D_8018D92A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801EB950; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801EB950, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801EB950; -extern s8 D_801EB954; -extern s8 D_801EB955; - -void func_8013C9C4(void * arg0) -{ - D_801EB950 = arg0; - D_801EB954 = 0; - D_801EB955 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801EB950; -extern s8 D_801EB954; -extern s8 D_801EB955; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801EB950; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801EB955; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801EB954)) * 2) + D_801EB950); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801EB955 = (unsigned char) p[1]; - D_801EB954 = D_801EB954 + 1; - if (D_801EB955 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801EB954 = 0; - *base = 0; - } - } - else - { - D_801EB955 = c - 1; - } - } - return; -} - - - -extern s32 D_801EB974; -extern s32 D_801EB968; -extern s32 D_801EB96C; -extern s32 D_801EB978; - -void func_8013CABC(void) { - D_801EB974 = 1; - D_801EB968 = 1; - D_801EB96C = 0; - D_801EB978 = 1; -} - - - -extern s32 D_801EB968; -extern s32 D_801EB96C; -extern s32 D_801EB970; -extern s32 D_801EB974; -extern s32 D_801EB978; - -void func_8013CAE8(void) { - D_801EB968 = 1; - D_801EB974 = 0; - D_801EB96C = 0; - D_801EB970 = -1; - D_801EB978 = 0; -} - - - -extern s32 D_801EB974; -extern s32 D_801EB978; -extern s32 D_801EB9A0; -extern s32 D_801EB9A4; - -void func_8013CB20(void) -{ - D_801EB9A0 = D_801EB978; - D_801EB9A4 = D_801EB974; - D_801EB978 = 1; - D_801EB974 = 0; -} - - - -extern s32 D_801EB9A0; -extern s32 D_801EB9A4; -extern s32 D_801EB978; -extern s32 D_801EB974; - -void func_8013CB5C(void) { - D_801EB978 = D_801EB9A0; - D_801EB974 = D_801EB9A4; -} - - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801ED808; - extern u8 D_801ED809; - extern u8 D_801ED80A; - extern u8 D_801ED80B; - extern u8 D_801ED80C; - extern u8 D_801ED80D; - extern u8 D_801ED80E; - extern u8 D_801ED80F; - extern u8 D_801ED810; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801ED808; t1 = D_801ED809; t2 = D_801ED80A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801ED80B; t1 = D_801ED80C; t2 = D_801ED80D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801ED80E; t1 = D_801ED80F; t2 = D_801ED810; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801EB980; -extern s32 D_801EB968; -extern s32 D_801EB984; -extern s32 D_801EB974; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801EB980 != 0) { - if (D_801EB980 != 2) { - if (((D_801EB980 < 3) && (D_801EB980 == 1)) && - (D_801EB984 = D_801EB984 + 1, 0x23a < D_801EB984)) { - D_801EB968 = D_801EB980; - D_801EB980 = 2; - } - } else { - D_801EB968 = D_801EB968 + -1; - if (D_801EB968 == 0) { - D_801EB968 = D_801EB980; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801EB974 == 0) { - D_801EB980 = D_801EB980 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801EB974; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801EB974; -} - - - -extern s32 D_801EB980; - -void func_8013D164(void) { - D_801EB980 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801ED912; -extern u8 D_801ED986; -extern u8 D_801ED812; -extern u8 D_801ED8DC; -extern u8 D_801ED7E8; -extern u8 D_801ED811; -extern s32 D_801ED8E0; - -void func_8013D330(void) { - if ((D_801ED912 & 0xff) != D_801ED986) { - D_801ED912 = ((D_801ED912 & 0xff) < D_801ED986) ? (D_801ED912 + 1) : (D_801ED912 - 1); - } - if ((D_801ED812 & 0xff) != D_801ED8DC) { - D_801ED812 = ((D_801ED812 & 0xff) < D_801ED8DC) ? (D_801ED812 + 1) : (D_801ED812 - 1); - } - if ((D_801ED7E8 & 0xff) != D_801ED811) { - D_801ED7E8 = ((D_801ED7E8 & 0xff) < D_801ED811) ? (D_801ED7E8 + 1) : (D_801ED7E8 - 1); - } - D_801ED8E0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801EB958; -extern void *D_801EB95C; -extern void *D_801EB960; -extern s32 D_801EB988; -extern s32 D_801EB98C; -extern s32 D_801EB990; -extern s32 D_801ED854[]; - -extern u8 D_8018DA18[]; -extern u8 D_8018DAC0[]; -extern u8 D_8018D970[]; -extern u8 D_8018DA6C[]; -extern u8 D_8018DAEC[]; -extern u8 D_8018D9C4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801EB988 = param_2; - D_801EB98C = (param_2 >> 2) & 3; - D_801EB990 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801EB958 = D_8018DA18; - D_801EB95C = D_8018DAC0; - D_801EB960 = D_8018D970; - } else { - D_801EB958 = D_8018DA6C; - D_801EB95C = D_8018DAEC; - D_801EB960 = D_8018D9C4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801EB990 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801EB988 & 2) != 0) { - D_801ED854[0] = 0x140; - D_801ED854[3] = 0x80; - if (p[0x37] == 4) { - D_801ED854[0] = 0x140; - D_801ED854[3] = 0; - } - if (p[0x37] == 0) { - D_801ED854[0] = 0x140; - D_801ED854[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801EB960)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801EB960; -extern s16 *D_801EB964; -extern s32 D_801EB974; -extern s32 D_801EB994; -extern s32 D_801EB998; -extern s32 D_801EB99C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801EB964 != 0) { - D_801EB974 = 0; - p = (int *)(param_1 * 12 + (int)D_801EB960); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801EB994 != x) { - flag = 1; - if (D_801EB994 < x) { - if (x - D_801EB994 < 5) { - D_801EB994 = x; - } else { - D_801EB994 = D_801EB994 + 4; - } - } else { - if (D_801EB994 - x < 5) { - D_801EB994 = x; - } else { - D_801EB994 = D_801EB994 - 4; - } - } - } - if (D_801EB998 != y) { - flag = 1; - if (D_801EB998 < y) { - if (y - D_801EB998 < 5) { - D_801EB998 = y; - } else { - D_801EB998 = D_801EB998 + 4; - } - } else { - if (D_801EB998 - y < 5) { - D_801EB998 = y; - } else { - D_801EB998 = D_801EB998 - 4; - } - } - } - if (D_801EB99C != z) { - flag = 1; - if (D_801EB99C < z) { - if (z - D_801EB99C < 5) { - D_801EB99C = z; - } else { - D_801EB99C = D_801EB99C + 4; - } - } else { - if (D_801EB99C - z < 5) { - D_801EB99C = z; - } else { - D_801EB99C = D_801EB99C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801EB974 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018DB7C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801EB964); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EB994); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EB998); - uVar5 = (*(int*)&D_801EB99C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018DB7C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801EB97C; - -s32 func_8013E054(void) { - return D_801EB97C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018E578; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018E550; -extern s16 D_8018E552; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018E578; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018E550 = 2; - D_8018E552 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018E552 = 0; - D_8018E550 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801EB9B0; - extern void * D_801EB9B4; - extern unsigned char D_8018E1F0; - extern unsigned char D_8018E208; - extern unsigned char D_8018E27C; - extern unsigned char D_8018E284; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801EB9B0 = &D_8018E1F0; - D_801EB9B4 = &D_8018E27C; - } else { - D_801EB9B0 = &D_8018E208; - D_801EB9B4 = &D_8018E284; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018E578/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E578 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018E578)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018E554; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E554)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E554)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018E550; -extern s16 D_8018E552; -extern unsigned char D_8018E554; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E552` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018E550` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018E552; - if (*r < 3) { - *r = *r + 1; - } - D_8018E550 = (u16)D_8018E550 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E554); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018E554; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E554); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c b/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c new file mode 100644 index 000000000..5e9be504d --- /dev/null +++ b/src/ov_SC05_017/ov_SC05_017_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801EA270; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018D470[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801EB86C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801ED918; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801EA270; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018D1A4)(); +extern s16 (*D_8018D1A8)(); +extern M2C_UNK (*D_8018D1B0)(); +extern s32 (*D_8018D1B4)(); +extern s32 D_801EB868; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801EA274; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018D504; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801909E8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018D51C; +extern M2C_UNK D_8018D524; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018D52C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018D548[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018D554[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018D568[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D5B8[]; +extern s16 D_8018D5E8[]; +extern s16 D_8018D648[]; +extern s16 D_8018D650[]; +extern s16 D_8018D670[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018D6A8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018D700[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018D748[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018D750[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018D758[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018D760[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018D708; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018D728; +extern void func_801321B0(int param_1); +extern int D_8018D738; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801EB8D8; +extern s32 D_801EB8DC[]; +extern int D_801EB8E0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018D76C; +extern u8 D_8018D768; +extern s16 *D_8018D770; +extern u8 D_8018D774; +extern int D_801EB8D8; +extern u16 D_801EB8E8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018D770; /* holds a pointer value (*(u16**)&D_8018D770) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018D784[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018D7D8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018D7DC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018D7DC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018D820; +extern u8 D_8018D864; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018D820; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018D864 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018D8A8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018D8E4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018D8E4; + if (((s16)a1) < 0xC00) { + tbl = D_8018D8A8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018D920, D_8018D922, D_8018D924, D_8018D926, D_8018D928, D_8018D92A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018D922 < ang)) goto outer_else; + if (!(ang < D_8018D928)) goto inner_else; + if (ang < D_8018D924) { *(s16 *)L = D_8018D924; goto done; } + if (D_8018D926 < ang) { *(s16 *)L = D_8018D926; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018D920) { *(s16 *)L = D_8018D920; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018D92A < ang) { *(s16 *)L = D_8018D92A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801EB950; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801EB950, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801EB950; +extern s8 D_801EB954; +extern s8 D_801EB955; + +void func_8013C9C4(void * arg0) +{ + D_801EB950 = arg0; + D_801EB954 = 0; + D_801EB955 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801EB950; +extern s8 D_801EB954; +extern s8 D_801EB955; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801EB950; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801EB955; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801EB954)) * 2) + D_801EB950); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801EB955 = (unsigned char) p[1]; + D_801EB954 = D_801EB954 + 1; + if (D_801EB955 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801EB954 = 0; + *base = 0; + } + } + else + { + D_801EB955 = c - 1; + } + } + return; +} + + + +extern s32 D_801EB974; +extern s32 D_801EB968; +extern s32 D_801EB96C; +extern s32 D_801EB978; + +void func_8013CABC(void) { + D_801EB974 = 1; + D_801EB968 = 1; + D_801EB96C = 0; + D_801EB978 = 1; +} + + + +extern s32 D_801EB968; +extern s32 D_801EB96C; +extern s32 D_801EB970; +extern s32 D_801EB974; +extern s32 D_801EB978; + +void func_8013CAE8(void) { + D_801EB968 = 1; + D_801EB974 = 0; + D_801EB96C = 0; + D_801EB970 = -1; + D_801EB978 = 0; +} + + + +extern s32 D_801EB974; +extern s32 D_801EB978; +extern s32 D_801EB9A0; +extern s32 D_801EB9A4; + +void func_8013CB20(void) +{ + D_801EB9A0 = D_801EB978; + D_801EB9A4 = D_801EB974; + D_801EB978 = 1; + D_801EB974 = 0; +} + + + +extern s32 D_801EB9A0; +extern s32 D_801EB9A4; +extern s32 D_801EB978; +extern s32 D_801EB974; + +void func_8013CB5C(void) { + D_801EB978 = D_801EB9A0; + D_801EB974 = D_801EB9A4; +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801ED808; + extern u8 D_801ED809; + extern u8 D_801ED80A; + extern u8 D_801ED80B; + extern u8 D_801ED80C; + extern u8 D_801ED80D; + extern u8 D_801ED80E; + extern u8 D_801ED80F; + extern u8 D_801ED810; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801ED808; t1 = D_801ED809; t2 = D_801ED80A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801ED80B; t1 = D_801ED80C; t2 = D_801ED80D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801ED80E; t1 = D_801ED80F; t2 = D_801ED810; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801EB980; +extern s32 D_801EB968; +extern s32 D_801EB984; +extern s32 D_801EB974; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801EB980 != 0) { + if (D_801EB980 != 2) { + if (((D_801EB980 < 3) && (D_801EB980 == 1)) && + (D_801EB984 = D_801EB984 + 1, 0x23a < D_801EB984)) { + D_801EB968 = D_801EB980; + D_801EB980 = 2; + } + } else { + D_801EB968 = D_801EB968 + -1; + if (D_801EB968 == 0) { + D_801EB968 = D_801EB980; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801EB974 == 0) { + D_801EB980 = D_801EB980 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801EB974; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801EB974; +} + + + +extern s32 D_801EB980; + +void func_8013D164(void) { + D_801EB980 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801ED912; +extern u8 D_801ED986; +extern u8 D_801ED812; +extern u8 D_801ED8DC; +extern u8 D_801ED7E8; +extern u8 D_801ED811; +extern s32 D_801ED8E0; + +void func_8013D330(void) { + if ((D_801ED912 & 0xff) != D_801ED986) { + D_801ED912 = ((D_801ED912 & 0xff) < D_801ED986) ? (D_801ED912 + 1) : (D_801ED912 - 1); + } + if ((D_801ED812 & 0xff) != D_801ED8DC) { + D_801ED812 = ((D_801ED812 & 0xff) < D_801ED8DC) ? (D_801ED812 + 1) : (D_801ED812 - 1); + } + if ((D_801ED7E8 & 0xff) != D_801ED811) { + D_801ED7E8 = ((D_801ED7E8 & 0xff) < D_801ED811) ? (D_801ED7E8 + 1) : (D_801ED7E8 - 1); + } + D_801ED8E0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801EB958; +extern void *D_801EB95C; +extern void *D_801EB960; +extern s32 D_801EB988; +extern s32 D_801EB98C; +extern s32 D_801EB990; +extern s32 D_801ED854[]; + +extern u8 D_8018DA18[]; +extern u8 D_8018DAC0[]; +extern u8 D_8018D970[]; +extern u8 D_8018DA6C[]; +extern u8 D_8018DAEC[]; +extern u8 D_8018D9C4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801EB988 = param_2; + D_801EB98C = (param_2 >> 2) & 3; + D_801EB990 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801EB958 = D_8018DA18; + D_801EB95C = D_8018DAC0; + D_801EB960 = D_8018D970; + } else { + D_801EB958 = D_8018DA6C; + D_801EB95C = D_8018DAEC; + D_801EB960 = D_8018D9C4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801EB990 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801EB988 & 2) != 0) { + D_801ED854[0] = 0x140; + D_801ED854[3] = 0x80; + if (p[0x37] == 4) { + D_801ED854[0] = 0x140; + D_801ED854[3] = 0; + } + if (p[0x37] == 0) { + D_801ED854[0] = 0x140; + D_801ED854[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801EB960)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801EB960; +extern s16 *D_801EB964; +extern s32 D_801EB974; +extern s32 D_801EB994; +extern s32 D_801EB998; +extern s32 D_801EB99C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801EB964 != 0) { + D_801EB974 = 0; + p = (int *)(param_1 * 12 + (int)D_801EB960); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801EB994 != x) { + flag = 1; + if (D_801EB994 < x) { + if (x - D_801EB994 < 5) { + D_801EB994 = x; + } else { + D_801EB994 = D_801EB994 + 4; + } + } else { + if (D_801EB994 - x < 5) { + D_801EB994 = x; + } else { + D_801EB994 = D_801EB994 - 4; + } + } + } + if (D_801EB998 != y) { + flag = 1; + if (D_801EB998 < y) { + if (y - D_801EB998 < 5) { + D_801EB998 = y; + } else { + D_801EB998 = D_801EB998 + 4; + } + } else { + if (D_801EB998 - y < 5) { + D_801EB998 = y; + } else { + D_801EB998 = D_801EB998 - 4; + } + } + } + if (D_801EB99C != z) { + flag = 1; + if (D_801EB99C < z) { + if (z - D_801EB99C < 5) { + D_801EB99C = z; + } else { + D_801EB99C = D_801EB99C + 4; + } + } else { + if (D_801EB99C - z < 5) { + D_801EB99C = z; + } else { + D_801EB99C = D_801EB99C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801EB974 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018DB7C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801EB964); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801EB994); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801EB998); + uVar5 = (*(int*)&D_801EB99C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018DB7C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801EB97C; + +s32 func_8013E054(void) { + return D_801EB97C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018E578; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018E550; +extern s16 D_8018E552; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018E578; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018E550 = 2; + D_8018E552 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018E552 = 0; + D_8018E550 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801EB9B0; + extern void * D_801EB9B4; + extern unsigned char D_8018E1F0; + extern unsigned char D_8018E208; + extern unsigned char D_8018E27C; + extern unsigned char D_8018E284; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801EB9B0 = &D_8018E1F0; + D_801EB9B4 = &D_8018E27C; + } else { + D_801EB9B0 = &D_8018E208; + D_801EB9B4 = &D_8018E284; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018E578/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E578 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018E578)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018E554; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E554)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E554)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018E550; +extern s16 D_8018E552; +extern unsigned char D_8018E554; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E552` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018E550` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018E552; + if (*r < 3) { + *r = *r + 1; + } + D_8018E550 = (u16)D_8018E550 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E554); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018E554; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E554); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_018/ov_SC05_018_jr_8012ACE0.c b/src/ov_SC05_018/ov_SC05_018_jr_8012ACE0.c index 850ddd97c..172fe4cd2 100644 --- a/src/ov_SC05_018/ov_SC05_018_jr_8012ACE0.c +++ b/src/ov_SC05_018/ov_SC05_018_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186F38[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186F38[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80186F7C; -extern u8 D_80186FC0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80186F7C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80186FC0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80187004[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80187040[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80187040; - if (((s16)a1) < 0xC00) { - tbl = D_80187004; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018707C, D_8018707E, D_80187080, D_80187082, D_80187084, D_80187086; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018707E < ang)) goto outer_else; - if (!(ang < D_80187084)) goto inner_else; - if (ang < D_80187080) { *(s16 *)L = D_80187080; goto done; } - if (D_80187082 < ang) { *(s16 *)L = D_80187082; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018707C) { *(s16 *)L = D_8018707C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80187086 < ang) { *(s16 *)L = D_80187086; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E5090; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E5090, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E5090; -extern s8 D_801E5094; -extern s8 D_801E5095; - -void func_8013C9C4(void * arg0) -{ - D_801E5090 = arg0; - D_801E5094 = 0; - D_801E5095 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E5090; -extern s8 D_801E5094; -extern s8 D_801E5095; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E5090; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E5095; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E5094)) * 2) + D_801E5090); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E5095 = (unsigned char) p[1]; - D_801E5094 = D_801E5094 + 1; - if (D_801E5095 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E5094 = 0; - *base = 0; - } - } - else - { - D_801E5095 = c - 1; - } - } - return; -} - - - -extern s32 D_801E50B4; -extern s32 D_801E50A8; -extern s32 D_801E50AC; -extern s32 D_801E50B8; - -void func_8013CABC(void) { - D_801E50B4 = 1; - D_801E50A8 = 1; - D_801E50AC = 0; - D_801E50B8 = 1; -} - - - -extern s32 D_801E50A8; -extern s32 D_801E50AC; -extern s32 D_801E50B0; -extern s32 D_801E50B4; -extern s32 D_801E50B8; - -void func_8013CAE8(void) { - D_801E50A8 = 1; - D_801E50B4 = 0; - D_801E50AC = 0; - D_801E50B0 = -1; - D_801E50B8 = 0; -} - - - -extern s32 D_801E50B4; -extern s32 D_801E50B8; -extern s32 D_801E50E0; -extern s32 D_801E50E4; - -void func_8013CB20(void) -{ - D_801E50E0 = D_801E50B8; - D_801E50E4 = D_801E50B4; - D_801E50B8 = 1; - D_801E50B4 = 0; -} - - - -extern s32 D_801E50E0; -extern s32 D_801E50E4; -extern s32 D_801E50B8; -extern s32 D_801E50B4; - -void func_8013CB5C(void) { - D_801E50B8 = D_801E50E0; - D_801E50B4 = D_801E50E4; -} - - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E6708; - extern u8 D_801E6709; - extern u8 D_801E670A; - extern u8 D_801E670B; - extern u8 D_801E670C; - extern u8 D_801E670D; - extern u8 D_801E670E; - extern u8 D_801E670F; - extern u8 D_801E6710; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E6708; t1 = D_801E6709; t2 = D_801E670A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E670B; t1 = D_801E670C; t2 = D_801E670D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E670E; t1 = D_801E670F; t2 = D_801E6710; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E50C0; -extern s32 D_801E50A8; -extern s32 D_801E50C4; -extern s32 D_801E50B4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E50C0 != 0) { - if (D_801E50C0 != 2) { - if (((D_801E50C0 < 3) && (D_801E50C0 == 1)) && - (D_801E50C4 = D_801E50C4 + 1, 0x23a < D_801E50C4)) { - D_801E50A8 = D_801E50C0; - D_801E50C0 = 2; - } - } else { - D_801E50A8 = D_801E50A8 + -1; - if (D_801E50A8 == 0) { - D_801E50A8 = D_801E50C0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E50B4 == 0) { - D_801E50C0 = D_801E50C0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E50B4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E50B4; -} - - - -extern s32 D_801E50C0; - -void func_8013D164(void) { - D_801E50C0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E681A; -extern u8 D_801E688E; -extern u8 D_801E6712; -extern u8 D_801E67E4; -extern u8 D_801E66E8; -extern u8 D_801E6711; -extern s32 D_801E67E8; - -void func_8013D330(void) { - if ((D_801E681A & 0xff) != D_801E688E) { - D_801E681A = ((D_801E681A & 0xff) < D_801E688E) ? (D_801E681A + 1) : (D_801E681A - 1); - } - if ((D_801E6712 & 0xff) != D_801E67E4) { - D_801E6712 = ((D_801E6712 & 0xff) < D_801E67E4) ? (D_801E6712 + 1) : (D_801E6712 - 1); - } - if ((D_801E66E8 & 0xff) != D_801E6711) { - D_801E66E8 = ((D_801E66E8 & 0xff) < D_801E6711) ? (D_801E66E8 + 1) : (D_801E66E8 - 1); - } - D_801E67E8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E5098; -extern void *D_801E509C; -extern void *D_801E50A0; -extern s32 D_801E50C8; -extern s32 D_801E50CC; -extern s32 D_801E50D0; -extern s32 D_801E675C[]; - -extern u8 D_80187174[]; -extern u8 D_8018721C[]; -extern u8 D_801870CC[]; -extern u8 D_801871C8[]; -extern u8 D_80187248[]; -extern u8 D_80187120[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E50C8 = param_2; - D_801E50CC = (param_2 >> 2) & 3; - D_801E50D0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E5098 = D_80187174; - D_801E509C = D_8018721C; - D_801E50A0 = D_801870CC; - } else { - D_801E5098 = D_801871C8; - D_801E509C = D_80187248; - D_801E50A0 = D_80187120; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E50D0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E50C8 & 2) != 0) { - D_801E675C[0] = 0x140; - D_801E675C[3] = 0x80; - if (p[0x37] == 4) { - D_801E675C[0] = 0x140; - D_801E675C[3] = 0; - } - if (p[0x37] == 0) { - D_801E675C[0] = 0x140; - D_801E675C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E50A0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E50A0; -extern s16 *D_801E50A4; -extern s32 D_801E50B4; -extern s32 D_801E50D4; -extern s32 D_801E50D8; -extern s32 D_801E50DC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E50A4 != 0) { - D_801E50B4 = 0; - p = (int *)(param_1 * 12 + (int)D_801E50A0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E50D4 != x) { - flag = 1; - if (D_801E50D4 < x) { - if (x - D_801E50D4 < 5) { - D_801E50D4 = x; - } else { - D_801E50D4 = D_801E50D4 + 4; - } - } else { - if (D_801E50D4 - x < 5) { - D_801E50D4 = x; - } else { - D_801E50D4 = D_801E50D4 - 4; - } - } - } - if (D_801E50D8 != y) { - flag = 1; - if (D_801E50D8 < y) { - if (y - D_801E50D8 < 5) { - D_801E50D8 = y; - } else { - D_801E50D8 = D_801E50D8 + 4; - } - } else { - if (D_801E50D8 - y < 5) { - D_801E50D8 = y; - } else { - D_801E50D8 = D_801E50D8 - 4; - } - } - } - if (D_801E50DC != z) { - flag = 1; - if (D_801E50DC < z) { - if (z - D_801E50DC < 5) { - D_801E50DC = z; - } else { - D_801E50DC = D_801E50DC + 4; - } - } else { - if (D_801E50DC - z < 5) { - D_801E50DC = z; - } else { - D_801E50DC = D_801E50DC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E50B4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801872D8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E50A4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E50D4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E50D8); - uVar5 = (*(int*)&D_801E50DC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801872D8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E50BC; - -s32 func_8013E054(void) { - return D_801E50BC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187CD4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80187CAC; -extern s16 D_80187CAE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187CD4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80187CAC = 2; - D_80187CAE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80187CAE = 0; - D_80187CAC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E50F0; - extern void * D_801E50F4; - extern unsigned char D_8018794C; - extern unsigned char D_80187964; - extern unsigned char D_801879D8; - extern unsigned char D_801879E0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E50F0 = &D_8018794C; - D_801E50F4 = &D_801879D8; - } else { - D_801E50F0 = &D_80187964; - D_801E50F4 = &D_801879E0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187CD4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187CD4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187CD4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187CB0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187CB0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187CB0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80187CAC; -extern s16 D_80187CAE; -extern unsigned char D_80187CB0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187CAE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80187CAC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80187CAE; - if (*r < 3) { - *r = *r + 1; - } - D_80187CAC = (u16)D_80187CAC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187CB0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187CB0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187CB0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c b/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c new file mode 100644 index 000000000..ae7cb6996 --- /dev/null +++ b/src/ov_SC05_018/ov_SC05_018_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801E3DE4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186BCC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E4FAC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E6820; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801E3DE4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80186908)(); +extern s16 (*D_8018690C)(); +extern M2C_UNK (*D_80186914)(); +extern s32 (*D_80186918)(); +extern s32 D_801E4FA8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801E3DE8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186C60; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018A144; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80186C78; +extern M2C_UNK D_80186C80; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80186C88; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186CA4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186CB0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186CC4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186D14[]; +extern s16 D_80186D44[]; +extern s16 D_80186DA4[]; +extern s16 D_80186DAC[]; +extern s16 D_80186DCC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80186E04[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80186E5C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80186EA4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186EAC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186EB4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186EBC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80186E64; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80186E84; +extern void func_801321B0(int param_1); +extern int D_80186E94; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E5018; +extern s32 D_801E501C[]; +extern int D_801E5020; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186EC8; +extern u8 D_80186EC4; +extern s16 *D_80186ECC; +extern u8 D_80186ED0; +extern int D_801E5018; +extern u16 D_801E5028; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186ECC; /* holds a pointer value (*(u16**)&D_80186ECC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186EE0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186F34; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186F38[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186F38[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80186F7C; +extern u8 D_80186FC0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80186F7C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80186FC0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80187004[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80187040[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80187040; + if (((s16)a1) < 0xC00) { + tbl = D_80187004; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018707C, D_8018707E, D_80187080, D_80187082, D_80187084, D_80187086; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018707E < ang)) goto outer_else; + if (!(ang < D_80187084)) goto inner_else; + if (ang < D_80187080) { *(s16 *)L = D_80187080; goto done; } + if (D_80187082 < ang) { *(s16 *)L = D_80187082; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018707C) { *(s16 *)L = D_8018707C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187086 < ang) { *(s16 *)L = D_80187086; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E5090; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E5090, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E5090; +extern s8 D_801E5094; +extern s8 D_801E5095; + +void func_8013C9C4(void * arg0) +{ + D_801E5090 = arg0; + D_801E5094 = 0; + D_801E5095 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E5090; +extern s8 D_801E5094; +extern s8 D_801E5095; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E5090; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E5095; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E5094)) * 2) + D_801E5090); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E5095 = (unsigned char) p[1]; + D_801E5094 = D_801E5094 + 1; + if (D_801E5095 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E5094 = 0; + *base = 0; + } + } + else + { + D_801E5095 = c - 1; + } + } + return; +} + + + +extern s32 D_801E50B4; +extern s32 D_801E50A8; +extern s32 D_801E50AC; +extern s32 D_801E50B8; + +void func_8013CABC(void) { + D_801E50B4 = 1; + D_801E50A8 = 1; + D_801E50AC = 0; + D_801E50B8 = 1; +} + + + +extern s32 D_801E50A8; +extern s32 D_801E50AC; +extern s32 D_801E50B0; +extern s32 D_801E50B4; +extern s32 D_801E50B8; + +void func_8013CAE8(void) { + D_801E50A8 = 1; + D_801E50B4 = 0; + D_801E50AC = 0; + D_801E50B0 = -1; + D_801E50B8 = 0; +} + + + +extern s32 D_801E50B4; +extern s32 D_801E50B8; +extern s32 D_801E50E0; +extern s32 D_801E50E4; + +void func_8013CB20(void) +{ + D_801E50E0 = D_801E50B8; + D_801E50E4 = D_801E50B4; + D_801E50B8 = 1; + D_801E50B4 = 0; +} + + + +extern s32 D_801E50E0; +extern s32 D_801E50E4; +extern s32 D_801E50B8; +extern s32 D_801E50B4; + +void func_8013CB5C(void) { + D_801E50B8 = D_801E50E0; + D_801E50B4 = D_801E50E4; +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E6708; + extern u8 D_801E6709; + extern u8 D_801E670A; + extern u8 D_801E670B; + extern u8 D_801E670C; + extern u8 D_801E670D; + extern u8 D_801E670E; + extern u8 D_801E670F; + extern u8 D_801E6710; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E6708; t1 = D_801E6709; t2 = D_801E670A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E670B; t1 = D_801E670C; t2 = D_801E670D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E670E; t1 = D_801E670F; t2 = D_801E6710; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E50C0; +extern s32 D_801E50A8; +extern s32 D_801E50C4; +extern s32 D_801E50B4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E50C0 != 0) { + if (D_801E50C0 != 2) { + if (((D_801E50C0 < 3) && (D_801E50C0 == 1)) && + (D_801E50C4 = D_801E50C4 + 1, 0x23a < D_801E50C4)) { + D_801E50A8 = D_801E50C0; + D_801E50C0 = 2; + } + } else { + D_801E50A8 = D_801E50A8 + -1; + if (D_801E50A8 == 0) { + D_801E50A8 = D_801E50C0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E50B4 == 0) { + D_801E50C0 = D_801E50C0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E50B4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E50B4; +} + + + +extern s32 D_801E50C0; + +void func_8013D164(void) { + D_801E50C0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E681A; +extern u8 D_801E688E; +extern u8 D_801E6712; +extern u8 D_801E67E4; +extern u8 D_801E66E8; +extern u8 D_801E6711; +extern s32 D_801E67E8; + +void func_8013D330(void) { + if ((D_801E681A & 0xff) != D_801E688E) { + D_801E681A = ((D_801E681A & 0xff) < D_801E688E) ? (D_801E681A + 1) : (D_801E681A - 1); + } + if ((D_801E6712 & 0xff) != D_801E67E4) { + D_801E6712 = ((D_801E6712 & 0xff) < D_801E67E4) ? (D_801E6712 + 1) : (D_801E6712 - 1); + } + if ((D_801E66E8 & 0xff) != D_801E6711) { + D_801E66E8 = ((D_801E66E8 & 0xff) < D_801E6711) ? (D_801E66E8 + 1) : (D_801E66E8 - 1); + } + D_801E67E8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E5098; +extern void *D_801E509C; +extern void *D_801E50A0; +extern s32 D_801E50C8; +extern s32 D_801E50CC; +extern s32 D_801E50D0; +extern s32 D_801E675C[]; + +extern u8 D_80187174[]; +extern u8 D_8018721C[]; +extern u8 D_801870CC[]; +extern u8 D_801871C8[]; +extern u8 D_80187248[]; +extern u8 D_80187120[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E50C8 = param_2; + D_801E50CC = (param_2 >> 2) & 3; + D_801E50D0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E5098 = D_80187174; + D_801E509C = D_8018721C; + D_801E50A0 = D_801870CC; + } else { + D_801E5098 = D_801871C8; + D_801E509C = D_80187248; + D_801E50A0 = D_80187120; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E50D0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E50C8 & 2) != 0) { + D_801E675C[0] = 0x140; + D_801E675C[3] = 0x80; + if (p[0x37] == 4) { + D_801E675C[0] = 0x140; + D_801E675C[3] = 0; + } + if (p[0x37] == 0) { + D_801E675C[0] = 0x140; + D_801E675C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E50A0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E50A0; +extern s16 *D_801E50A4; +extern s32 D_801E50B4; +extern s32 D_801E50D4; +extern s32 D_801E50D8; +extern s32 D_801E50DC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E50A4 != 0) { + D_801E50B4 = 0; + p = (int *)(param_1 * 12 + (int)D_801E50A0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E50D4 != x) { + flag = 1; + if (D_801E50D4 < x) { + if (x - D_801E50D4 < 5) { + D_801E50D4 = x; + } else { + D_801E50D4 = D_801E50D4 + 4; + } + } else { + if (D_801E50D4 - x < 5) { + D_801E50D4 = x; + } else { + D_801E50D4 = D_801E50D4 - 4; + } + } + } + if (D_801E50D8 != y) { + flag = 1; + if (D_801E50D8 < y) { + if (y - D_801E50D8 < 5) { + D_801E50D8 = y; + } else { + D_801E50D8 = D_801E50D8 + 4; + } + } else { + if (D_801E50D8 - y < 5) { + D_801E50D8 = y; + } else { + D_801E50D8 = D_801E50D8 - 4; + } + } + } + if (D_801E50DC != z) { + flag = 1; + if (D_801E50DC < z) { + if (z - D_801E50DC < 5) { + D_801E50DC = z; + } else { + D_801E50DC = D_801E50DC + 4; + } + } else { + if (D_801E50DC - z < 5) { + D_801E50DC = z; + } else { + D_801E50DC = D_801E50DC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E50B4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801872D8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E50A4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E50D4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E50D8); + uVar5 = (*(int*)&D_801E50DC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801872D8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E50BC; + +s32 func_8013E054(void) { + return D_801E50BC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187CD4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80187CAC; +extern s16 D_80187CAE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187CD4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80187CAC = 2; + D_80187CAE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80187CAE = 0; + D_80187CAC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E50F0; + extern void * D_801E50F4; + extern unsigned char D_8018794C; + extern unsigned char D_80187964; + extern unsigned char D_801879D8; + extern unsigned char D_801879E0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E50F0 = &D_8018794C; + D_801E50F4 = &D_801879D8; + } else { + D_801E50F0 = &D_80187964; + D_801E50F4 = &D_801879E0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187CD4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187CD4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187CD4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187CB0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187CB0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187CB0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80187CAC; +extern s16 D_80187CAE; +extern unsigned char D_80187CB0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187CAE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80187CAC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80187CAE; + if (*r < 3) { + *r = *r + 1; + } + D_80187CAC = (u16)D_80187CAC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187CB0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187CB0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187CB0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC05_019/ov_SC05_019_jr_8012ACE0.c b/src/ov_SC05_019/ov_SC05_019_jr_8012ACE0.c index bf29d9c5f..8ae70e004 100644 --- a/src/ov_SC05_019/ov_SC05_019_jr_8012ACE0.c +++ b/src/ov_SC05_019/ov_SC05_019_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F87C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F87C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F8C0; -extern u8 D_8017F904; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F8C0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F904 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F948[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F984[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F984; - if (((s16)a1) < 0xC00) { - tbl = D_8017F948; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F9C2 < ang)) goto outer_else; - if (!(ang < D_8017F9C8)) goto inner_else; - if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } - if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8018E760; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8018E760, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8018E760; -extern s8 D_8018E764; -extern s8 D_8018E765; - -void func_8013C9C4(void * arg0) -{ - D_8018E760 = arg0; - D_8018E764 = 0; - D_8018E765 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8018E760; -extern s8 D_8018E764; -extern s8 D_8018E765; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8018E760; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8018E765; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E764)) * 2) + D_8018E760); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8018E765 = (unsigned char) p[1]; - D_8018E764 = D_8018E764 + 1; - if (D_8018E765 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8018E764 = 0; - *base = 0; - } - } - else - { - D_8018E765 = c - 1; - } - } - return; -} - - - -extern s32 D_8018E784; -extern s32 D_8018E778; -extern s32 D_8018E77C; -extern s32 D_8018E788; - -void func_8013CABC(void) { - D_8018E784 = 1; - D_8018E778 = 1; - D_8018E77C = 0; - D_8018E788 = 1; -} - - - -extern s32 D_8018E778; -extern s32 D_8018E77C; -extern s32 D_8018E780; -extern s32 D_8018E784; -extern s32 D_8018E788; - -void func_8013CAE8(void) { - D_8018E778 = 1; - D_8018E784 = 0; - D_8018E77C = 0; - D_8018E780 = -1; - D_8018E788 = 0; -} - - - -extern s32 D_8018E784; -extern s32 D_8018E788; -extern s32 D_8018E7B0; -extern s32 D_8018E7B4; - -void func_8013CB20(void) -{ - D_8018E7B0 = D_8018E788; - D_8018E7B4 = D_8018E784; - D_8018E788 = 1; - D_8018E784 = 0; -} - - - -extern s32 D_8018E7B0; -extern s32 D_8018E7B4; -extern s32 D_8018E788; -extern s32 D_8018E784; - -void func_8013CB5C(void) { - D_8018E788 = D_8018E7B0; - D_8018E784 = D_8018E7B4; -} - - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8018F9D0; - extern u8 D_8018F9D1; - extern u8 D_8018F9D2; - extern u8 D_8018F9D3; - extern u8 D_8018F9D4; - extern u8 D_8018F9D5; - extern u8 D_8018F9D6; - extern u8 D_8018F9D7; - extern u8 D_8018F9D8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8018F9D0; t1 = D_8018F9D1; t2 = D_8018F9D2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8018F9D3; t1 = D_8018F9D4; t2 = D_8018F9D5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8018F9D6; t1 = D_8018F9D7; t2 = D_8018F9D8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8018E790; -extern s32 D_8018E778; -extern s32 D_8018E794; -extern s32 D_8018E784; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8018E790 != 0) { - if (D_8018E790 != 2) { - if (((D_8018E790 < 3) && (D_8018E790 == 1)) && - (D_8018E794 = D_8018E794 + 1, 0x23a < D_8018E794)) { - D_8018E778 = D_8018E790; - D_8018E790 = 2; - } - } else { - D_8018E778 = D_8018E778 + -1; - if (D_8018E778 == 0) { - D_8018E778 = D_8018E790; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8018E784 == 0) { - D_8018E790 = D_8018E790 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8018E784; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8018E784; -} - - - -extern s32 D_8018E790; - -void func_8013D164(void) { - D_8018E790 = 1; -} - - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8018FAB2; -extern u8 D_8018FB2C; -extern u8 D_8018F9DA; -extern u8 D_8018FA94; -extern u8 D_8018F9B8; -extern u8 D_8018F9D9; -extern s32 D_8018FA98; - -void func_8013D330(void) { - if ((D_8018FAB2 & 0xff) != D_8018FB2C) { - D_8018FAB2 = ((D_8018FAB2 & 0xff) < D_8018FB2C) ? (D_8018FAB2 + 1) : (D_8018FAB2 - 1); - } - if ((D_8018F9DA & 0xff) != D_8018FA94) { - D_8018F9DA = ((D_8018F9DA & 0xff) < D_8018FA94) ? (D_8018F9DA + 1) : (D_8018F9DA - 1); - } - if ((D_8018F9B8 & 0xff) != D_8018F9D9) { - D_8018F9B8 = ((D_8018F9B8 & 0xff) < D_8018F9D9) ? (D_8018F9B8 + 1) : (D_8018F9B8 - 1); - } - D_8018FA98 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8018E768; -extern void *D_8018E76C; -extern void *D_8018E770; -extern s32 D_8018E798; -extern s32 D_8018E79C; -extern s32 D_8018E7A0; -extern s32 D_8018FA0C[]; - -extern u8 D_8017FAB8[]; -extern u8 D_8017FB60[]; -extern u8 D_8017FA10[]; -extern u8 D_8017FB0C[]; -extern u8 D_8017FB8C[]; -extern u8 D_8017FA64[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8018E798 = param_2; - D_8018E79C = (param_2 >> 2) & 3; - D_8018E7A0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8018E768 = D_8017FAB8; - D_8018E76C = D_8017FB60; - D_8018E770 = D_8017FA10; - } else { - D_8018E768 = D_8017FB0C; - D_8018E76C = D_8017FB8C; - D_8018E770 = D_8017FA64; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8018E7A0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8018E798 & 2) != 0) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0x80; - if (p[0x37] == 4) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0; - } - if (p[0x37] == 0) { - D_8018FA0C[0] = 0x140; - D_8018FA0C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8018E770)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8018E770; -extern s16 *D_8018E774; -extern s32 D_8018E784; -extern s32 D_8018E7A4; -extern s32 D_8018E7A8; -extern s32 D_8018E7AC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8018E774 != 0) { - D_8018E784 = 0; - p = (int *)(param_1 * 12 + (int)D_8018E770); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8018E7A4 != x) { - flag = 1; - if (D_8018E7A4 < x) { - if (x - D_8018E7A4 < 5) { - D_8018E7A4 = x; - } else { - D_8018E7A4 = D_8018E7A4 + 4; - } - } else { - if (D_8018E7A4 - x < 5) { - D_8018E7A4 = x; - } else { - D_8018E7A4 = D_8018E7A4 - 4; - } - } - } - if (D_8018E7A8 != y) { - flag = 1; - if (D_8018E7A8 < y) { - if (y - D_8018E7A8 < 5) { - D_8018E7A8 = y; - } else { - D_8018E7A8 = D_8018E7A8 + 4; - } - } else { - if (D_8018E7A8 - y < 5) { - D_8018E7A8 = y; - } else { - D_8018E7A8 = D_8018E7A8 - 4; - } - } - } - if (D_8018E7AC != z) { - flag = 1; - if (D_8018E7AC < z) { - if (z - D_8018E7AC < 5) { - D_8018E7AC = z; - } else { - D_8018E7AC = D_8018E7AC + 4; - } - } else { - if (D_8018E7AC - z < 5) { - D_8018E7AC = z; - } else { - D_8018E7AC = D_8018E7AC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8018E784 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017FC1C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8018E774); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7A4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7A8); - uVar5 = (*(int*)&D_8018E7AC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017FC1C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8018E78C; - -s32 func_8013E054(void) { - return D_8018E78C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80180618; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801805F0; -extern s16 D_801805F2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80180618; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801805F0 = 2; - D_801805F2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801805F2 = 0; - D_801805F0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8018E7C0; - extern void * D_8018E7C4; - extern unsigned char D_80180290; - extern unsigned char D_801802A8; - extern unsigned char D_8018031C; - extern unsigned char D_80180324; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8018E7C0 = &D_80180290; - D_8018E7C4 = &D_8018031C; - } else { - D_8018E7C0 = &D_801802A8; - D_8018E7C4 = &D_80180324; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80180618/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180618 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80180618)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801805F4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801805F4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801805F4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801805F0; -extern s16 D_801805F2; -extern unsigned char D_801805F4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801805F2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801805F0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801805F2; - if (*r < 3) { - *r = *r + 1; - } - D_801805F0 = (u16)D_801805F0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801805F4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC05_019/ov_SC05_019_jr_801380E0.c b/src/ov_SC05_019/ov_SC05_019_jr_801380E0.c new file mode 100644 index 000000000..70636c51a --- /dev/null +++ b/src/ov_SC05_019/ov_SC05_019_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8018D4F8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017F510[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8018E67C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8018FAB8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8018D4F8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017F24C)(); +extern s16 (*D_8017F250)(); +extern M2C_UNK (*D_8017F258)(); +extern s32 (*D_8017F25C)(); +extern s32 D_8018E678; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8018D4FC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017F5A4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182A88; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017F5BC; +extern M2C_UNK D_8017F5C4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017F5CC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017F5E8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017F5F4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017F608[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017F658[]; +extern s16 D_8017F688[]; +extern s16 D_8017F6E8[]; +extern s16 D_8017F6F0[]; +extern s16 D_8017F710[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F748[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F7A0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F7E8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F7F0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F7F8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F800[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F7A8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F7C8; +extern void func_801321B0(int param_1); +extern int D_8017F7D8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8018E6E8; +extern s32 D_8018E6EC[]; +extern int D_8018E6F0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F80C; +extern u8 D_8017F808; +extern s16 *D_8017F810; +extern u8 D_8017F814; +extern int D_8018E6E8; +extern u16 D_8018E6F8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F810; /* holds a pointer value (*(u16**)&D_8017F810) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F824[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F878; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F87C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F87C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F8C0; +extern u8 D_8017F904; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F8C0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F904 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F948[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F984[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F984; + if (((s16)a1) < 0xC00) { + tbl = D_8017F948; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F9C0, D_8017F9C2, D_8017F9C4, D_8017F9C6, D_8017F9C8, D_8017F9CA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F9C2 < ang)) goto outer_else; + if (!(ang < D_8017F9C8)) goto inner_else; + if (ang < D_8017F9C4) { *(s16 *)L = D_8017F9C4; goto done; } + if (D_8017F9C6 < ang) { *(s16 *)L = D_8017F9C6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F9C0) { *(s16 *)L = D_8017F9C0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F9CA < ang) { *(s16 *)L = D_8017F9CA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8018E760; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8018E760, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8018E760; +extern s8 D_8018E764; +extern s8 D_8018E765; + +void func_8013C9C4(void * arg0) +{ + D_8018E760 = arg0; + D_8018E764 = 0; + D_8018E765 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8018E760; +extern s8 D_8018E764; +extern s8 D_8018E765; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8018E760; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8018E765; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8018E764)) * 2) + D_8018E760); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8018E765 = (unsigned char) p[1]; + D_8018E764 = D_8018E764 + 1; + if (D_8018E765 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8018E764 = 0; + *base = 0; + } + } + else + { + D_8018E765 = c - 1; + } + } + return; +} + + + +extern s32 D_8018E784; +extern s32 D_8018E778; +extern s32 D_8018E77C; +extern s32 D_8018E788; + +void func_8013CABC(void) { + D_8018E784 = 1; + D_8018E778 = 1; + D_8018E77C = 0; + D_8018E788 = 1; +} + + + +extern s32 D_8018E778; +extern s32 D_8018E77C; +extern s32 D_8018E780; +extern s32 D_8018E784; +extern s32 D_8018E788; + +void func_8013CAE8(void) { + D_8018E778 = 1; + D_8018E784 = 0; + D_8018E77C = 0; + D_8018E780 = -1; + D_8018E788 = 0; +} + + + +extern s32 D_8018E784; +extern s32 D_8018E788; +extern s32 D_8018E7B0; +extern s32 D_8018E7B4; + +void func_8013CB20(void) +{ + D_8018E7B0 = D_8018E788; + D_8018E7B4 = D_8018E784; + D_8018E788 = 1; + D_8018E784 = 0; +} + + + +extern s32 D_8018E7B0; +extern s32 D_8018E7B4; +extern s32 D_8018E788; +extern s32 D_8018E784; + +void func_8013CB5C(void) { + D_8018E788 = D_8018E7B0; + D_8018E784 = D_8018E7B4; +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8018F9D0; + extern u8 D_8018F9D1; + extern u8 D_8018F9D2; + extern u8 D_8018F9D3; + extern u8 D_8018F9D4; + extern u8 D_8018F9D5; + extern u8 D_8018F9D6; + extern u8 D_8018F9D7; + extern u8 D_8018F9D8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8018F9D0; t1 = D_8018F9D1; t2 = D_8018F9D2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8018F9D3; t1 = D_8018F9D4; t2 = D_8018F9D5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8018F9D6; t1 = D_8018F9D7; t2 = D_8018F9D8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8018E790; +extern s32 D_8018E778; +extern s32 D_8018E794; +extern s32 D_8018E784; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8018E790 != 0) { + if (D_8018E790 != 2) { + if (((D_8018E790 < 3) && (D_8018E790 == 1)) && + (D_8018E794 = D_8018E794 + 1, 0x23a < D_8018E794)) { + D_8018E778 = D_8018E790; + D_8018E790 = 2; + } + } else { + D_8018E778 = D_8018E778 + -1; + if (D_8018E778 == 0) { + D_8018E778 = D_8018E790; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8018E784 == 0) { + D_8018E790 = D_8018E790 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8018E784; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8018E784; +} + + + +extern s32 D_8018E790; + +void func_8013D164(void) { + D_8018E790 = 1; +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8018FAB2; +extern u8 D_8018FB2C; +extern u8 D_8018F9DA; +extern u8 D_8018FA94; +extern u8 D_8018F9B8; +extern u8 D_8018F9D9; +extern s32 D_8018FA98; + +void func_8013D330(void) { + if ((D_8018FAB2 & 0xff) != D_8018FB2C) { + D_8018FAB2 = ((D_8018FAB2 & 0xff) < D_8018FB2C) ? (D_8018FAB2 + 1) : (D_8018FAB2 - 1); + } + if ((D_8018F9DA & 0xff) != D_8018FA94) { + D_8018F9DA = ((D_8018F9DA & 0xff) < D_8018FA94) ? (D_8018F9DA + 1) : (D_8018F9DA - 1); + } + if ((D_8018F9B8 & 0xff) != D_8018F9D9) { + D_8018F9B8 = ((D_8018F9B8 & 0xff) < D_8018F9D9) ? (D_8018F9B8 + 1) : (D_8018F9B8 - 1); + } + D_8018FA98 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8018E768; +extern void *D_8018E76C; +extern void *D_8018E770; +extern s32 D_8018E798; +extern s32 D_8018E79C; +extern s32 D_8018E7A0; +extern s32 D_8018FA0C[]; + +extern u8 D_8017FAB8[]; +extern u8 D_8017FB60[]; +extern u8 D_8017FA10[]; +extern u8 D_8017FB0C[]; +extern u8 D_8017FB8C[]; +extern u8 D_8017FA64[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8018E798 = param_2; + D_8018E79C = (param_2 >> 2) & 3; + D_8018E7A0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8018E768 = D_8017FAB8; + D_8018E76C = D_8017FB60; + D_8018E770 = D_8017FA10; + } else { + D_8018E768 = D_8017FB0C; + D_8018E76C = D_8017FB8C; + D_8018E770 = D_8017FA64; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8018E7A0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8018E798 & 2) != 0) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0x80; + if (p[0x37] == 4) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0; + } + if (p[0x37] == 0) { + D_8018FA0C[0] = 0x140; + D_8018FA0C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8018E770)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8018E770; +extern s16 *D_8018E774; +extern s32 D_8018E784; +extern s32 D_8018E7A4; +extern s32 D_8018E7A8; +extern s32 D_8018E7AC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8018E774 != 0) { + D_8018E784 = 0; + p = (int *)(param_1 * 12 + (int)D_8018E770); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8018E7A4 != x) { + flag = 1; + if (D_8018E7A4 < x) { + if (x - D_8018E7A4 < 5) { + D_8018E7A4 = x; + } else { + D_8018E7A4 = D_8018E7A4 + 4; + } + } else { + if (D_8018E7A4 - x < 5) { + D_8018E7A4 = x; + } else { + D_8018E7A4 = D_8018E7A4 - 4; + } + } + } + if (D_8018E7A8 != y) { + flag = 1; + if (D_8018E7A8 < y) { + if (y - D_8018E7A8 < 5) { + D_8018E7A8 = y; + } else { + D_8018E7A8 = D_8018E7A8 + 4; + } + } else { + if (D_8018E7A8 - y < 5) { + D_8018E7A8 = y; + } else { + D_8018E7A8 = D_8018E7A8 - 4; + } + } + } + if (D_8018E7AC != z) { + flag = 1; + if (D_8018E7AC < z) { + if (z - D_8018E7AC < 5) { + D_8018E7AC = z; + } else { + D_8018E7AC = D_8018E7AC + 4; + } + } else { + if (D_8018E7AC - z < 5) { + D_8018E7AC = z; + } else { + D_8018E7AC = D_8018E7AC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8018E784 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017FC1C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8018E774); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8018E7A4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8018E7A8); + uVar5 = (*(int*)&D_8018E7AC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017FC1C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8018E78C; + +s32 func_8013E054(void) { + return D_8018E78C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80180618; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801805F0; +extern s16 D_801805F2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80180618; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801805F0 = 2; + D_801805F2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801805F2 = 0; + D_801805F0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8018E7C0; + extern void * D_8018E7C4; + extern unsigned char D_80180290; + extern unsigned char D_801802A8; + extern unsigned char D_8018031C; + extern unsigned char D_80180324; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8018E7C0 = &D_80180290; + D_8018E7C4 = &D_8018031C; + } else { + D_8018E7C0 = &D_801802A8; + D_8018E7C4 = &D_80180324; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80180618/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80180618 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80180618)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801805F4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801805F4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801805F4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801805F0; +extern s16 D_801805F2; +extern unsigned char D_801805F4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801805F2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801805F0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801805F2; + if (*r < 3) { + *r = *r + 1; + } + D_801805F0 = (u16)D_801805F0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801805F4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801805F4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC05_019/nonmatchings/ov_SC05_019_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_000/ov_SC06_000.c b/src/ov_SC06_000/ov_SC06_000.c index 3958588a5..963b1c410 100644 --- a/src/ov_SC06_000/ov_SC06_000.c +++ b/src/ov_SC06_000/ov_SC06_000.c @@ -521,4843 +521,3 @@ void func_8012ACA0(void *arg0) { M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); func_8012AAAC(); } - - - - -// @class: iv-combine -// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). -typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ -typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ - -s32 func_8012ACE0(void *o) { - int i; - for (i = 0; ; i++) { - switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { - case -2: - case -1: - case 0: - return i; - case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ - default: - break; - } - } -} - -DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ - -DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ - - - -void func_8012AD64(s32 *a0, s16 a1) { - *(s16*)((s32)a0 + 0x34) = a1; -} - - -DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ - -DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ - -DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ - -DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ - -DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ - -DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ - -DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ - -DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ - -DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ - -DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ - -DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ - -DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ - -DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ - -DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ - -DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ - -DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ - -DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012B4B8); - -DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ - -DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ - -DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ - -DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012B77C); - -DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ - -DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ - -DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ - -DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ - -DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ - -DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ - -DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ - -DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ - -DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ - -DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ - -DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ - -DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ - -DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ - -DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ - - -void func_8012BF4C(s32 *a0, s32 a1) { - *(s32*)((s32)a0 + 0x1C) = a1; -} - - -DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ - -DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ - -DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ - -DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ - -DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012C098); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012C0EC); - -DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ - -DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ - -DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ - -DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ - -DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ - -DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ - -DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ - -DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ - -DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ - -DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ - -DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012C658); - -DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012C750); - -DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to -// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS -// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via -// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store -// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. -// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). - -extern s32 D_8018BA98; -extern s16 D_801270C4; -extern u16 D_801274E4[]; -extern s32 D_8011DB08; -extern void func_80016714(void *a0, s32 a1); - -s32 func_8012C890(s32 a0, s32 a1, s32 a2) { - u8 *src = (u8 *)a0; - u8 *dst = (u8 *)a1; - u16 *d; - s16 count; - u16 v2, v4; - s32 v10; - void *obj; - - *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); - v2 = *(u16 *)(src + 0x0); - *(u16 *)(dst + 0x6) = v2; - *(u16 *)(dst + 0x88) = v2; - v2 = *(u16 *)(src + 0x2); - *(u16 *)(dst + 0xA) = v2; - *(u16 *)(dst + 0x8A) = v2; - v4 = *(u16 *)(src + 0x4); - *(u16 *)(dst + 0xC) = 0; - *(u16 *)(dst + 0x8) = 0; - *(u16 *)(dst + 0x4) = 0; - *(u16 *)(dst + 0xE) = v4; - *(u16 *)(dst + 0x8C) = v4; - *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); - *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; - *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); - v10 = *(s32 *)(src + 0x10); - *(s32 *)(dst + 0x78) = (s32)&D_8018BA98; - *(s32 *)(dst + 0xDC) = v10; - - { - register u16 *pc __asm__("$3"); - pc = &(*(u16 *)&D_801270C4); - *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; - count = *(volatile u16 *)pc + 1; - *pc = count; - if (count == 0) { - *pc = 1; - } - } - - if (a2 != 0) { - *(s32 *)(dst + 0x64) = a2; - *(s32 *)(dst + 0x68) = 0; - } else { - *(s32 *)(dst + 0x64) = 0; - *(s32 *)(dst + 0x68) = (s32)src; - } - - *(u16 *)(src + 0xA) |= 0x8000; - *(u16 *)(dst + 0x2) = 0; - d = D_801274E4; - *d &= 0xFFFE; - (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); - - if (*d & 1) { - s32 a1v; - obj = *(void **)(dst + 0x20); - if (obj != 0) { - s32 t = *(u16 *)obj; - if (t != 1) { - if (t != 2) { - goto done; - } - a1v = 0x38; - } else { - a1v = 0x84; - } - func_80016714(obj, a1v); - done:; - } - func_80016714(dst, 0x10C); - *(u16 *)(src + 0xA) &= 0x7FFF; - return 0; - } - - if (*(s32 *)(dst + 0x64) == 0) { - void *o = *(void **)(dst + 0x20); - if (o == 0) { - return (s32)dst; - } - if (*(u16 *)o == 1) { - s16 c = *(s16 *)(src + 0xC); - if (c != 0x7FFF) { - *(s16 *)((u8 *)o + 0x12) = c; - } - } - } - if (*(s32 *)(dst + 0x20) != 0) { - *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); - } - return (s32)dst; -} - - -DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ - -DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ - -DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ - -DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ - -DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ - -DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ - -DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ - -DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012CC88); - -DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ - -DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ - -DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ - -DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ - -DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ - -DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ - -DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ - -DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ - -DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ - -DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ - -DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH - - -struct S8012D664_8012D664 { short a, b, c; }; - -int func_8012D664(int arg0, int arg1, int arg2) { - extern int func_8012F568(); - extern int D_801885C4; - - struct S8012D664_8012D664 s; - int ret; - int t; - - s.a = (*(unsigned short*)&D_80126B5E); - s.b = (*(unsigned short*)&D_80126B62) - 0x40; - s.c = (*(unsigned short*)&D_80126B66); - ret = ((int(*)())func_800132BC)(arg0, &s); - t = arg1 + 0x20; - if (ret < t * t) { - func_8012F568(1, 1, 0, arg2, arg0, &D_801885C4); - return 1; - } - return 0; -} - - - -DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ - - - -extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -extern void func_8014C978(void); -extern M2C_UNK D_801885CC; -extern M2C_UNK D_801885D4; - -s32 func_8012DB84(void) -{ - func_8014C978(); - func_8012F568(1, 0xC001, 0, 0x3E8, &D_801885CC, &D_801885D4); -} - - -DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH - - -typedef struct Entry_8012DDA4 { - u16 active; - unsigned char pad[0x10C - 2]; -} Entry_8012DDA4; - - -s32 func_8012DDA4() -{ - extern Entry_8012DDA4 * D_801AD30C; - extern Entry_8012DDA4 * D_801AD308; - - Entry_8012DDA4 *p; - Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); - - while (D_801AD30C != end) { - p = D_801AD30C; - if (p->active != 0 && p != D_801AD308) { - D_801AD30C = p + 1; - return p; - } - D_801AD30C++; - } - D_801AD30C = 0; - return 0; -} - - - -// @class: plumbing -// @stuck: none — MATCH (35/35 ins, relocation-masked) - - -s32 func_8012DE2C(s32 a0) { - extern u8 * D_801AD30C; - extern u8 * D_801AD308; - - u8 *base; - u8 *end; - u8 *p; - - base = D_801202A0; - end = base + 0x6480; - D_801AD30C = base; - D_801AD308 = ((u8 *)a0); - - while (D_801AD30C != end) { - p = D_801AD30C; - if (*(u16 *)p != 0 && p != ((u8 *)a0)) { - D_801AD30C = p + 0x10C; - return p; - } - D_801AD30C += 0x10C; - } - D_801AD30C = 0; - return 0; -} - - - -DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ - -DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ - -DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ - -DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ - -DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012E014); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012E138); - - -s32 func_8012E27C(void) { - return 1; -} - - -DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ - -DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ - -DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012E364); - -DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ - -DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ - -DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ - -DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ - -DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH -extern u8 D_800AF648; -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) -{ - struct { short xy[2]; int sp14; int flag; } f; - register void *p __asm__("$4"); - p = &D_800AF648; - func_8004914C(p); - func_800491AC(&D_800AF648); - RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); - if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { - func_8002D4C8(param_2, param_3); - } -} - - -DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012E778); - -DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ - -DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ - -DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ - -DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ - - - -// @class: other -// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) - -extern void func_8016AA50(int, int); -extern void func_8016B428(int); -extern void func_80019064(void *); -extern int D_801885DC; - -void func_8012E9C0(int param_1) -{ - int iVar1; - - if (*(short *)(param_1 + 0x60) != 0) { - if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { - *(short *)(param_1 + 0x82) = 0; - *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); - *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); - *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); - } - if (*(int *)(param_1 + 0x78) != 0) { - iVar1 = *(short *)(param_1 + 0x60) * - *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; - if (iVar1 < 1) { - iVar1 = 1; - } - } else { - iVar1 = *(short *)(param_1 + 0x60); - } - func_8016AA50(param_1, iVar1); - if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { - func_8016B428(param_1); - func_80019064(&D_801885DC); - } - } - return; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012EA90); - -DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ - -DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ - -DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ - -DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012EFB8); - - -// @class: other -// @stuck: none — MATCH (33 ins, match_one verified) - -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); - -void func_8012F038(int param_1, short *param_2, short *param_3) { - int in[3]; - int out[3]; - - in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); - in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); - in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); - ApplyTransposeMatrixLV((void *)param_1, in, out); - param_3[0] = out[0]; - param_3[1] = out[1]; - param_3[2] = out[2]; -} - - -DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern void RotTransSV(s32 a0, s32 a1, void *a2); - -void func_8012F14C(s32 a0, s32 a1, s32 a2) -{ - s32 buf[2]; - func_8004914C((void *)a0); - func_800491AC((void *)a0); - RotTransSV(a1, a2, buf); -} - - -DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ - -DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012F274); - -DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ - -DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012F40C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8012F49C); - -DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ - -DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ - -DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ - -DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ - -DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) -extern void func_80131170(); -extern void func_80131CA8(); -extern unsigned char D_801885F8[]; - -void func_8012F828(int param_1) -{ - *(unsigned char *)(param_1 + 0xC1) = 4; - if (*(unsigned int *)(param_1 + 0xB4) & 8) { - func_80131170(param_1, D_801885F8, 0xB); - } - func_80131CA8(param_1, 9); -} - - -DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ - - -extern void func_80131170(s32 a0, s32 a1, s32 a2); -extern void func_80131CA8(int a0, int a1); -extern u8 D_80188604[]; - -void func_8012F8C8(u8* arg0) { - *(u8*)(arg0 + 0xC1) = 7; - if (*(u32*)(arg0 + 0xB4) & 0x80) { - ((void (*)(void*, void*, s32))func_80131170)(arg0, D_80188604, 0xB); - } - ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); -} - - -DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ - -DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ - -DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ - -DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ - -DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. -// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for -// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be -// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an -// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). -// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: -// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. -// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which -// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because -// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. -// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out -// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, -// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what -// blocks reorg from sharing a downstream constant into a branch delay slot.) - - -s32 func_8012FCC4(s32 param_1) { - extern int D_80188610; - - int v1 = *(int *)(((int)param_1) + 0xC4); - *(char *)(((int)param_1) + 0xC1) = 8; - if (v1 & 2) { - *(char *)(((int)param_1) + 0xC1) = 1; - func_80131CA8(((int)param_1), 3); - return; - } - if (v1 & 1) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 1); - return; - } - if (*(int *)(((int)param_1) + 0xB4) & 0x100) { - ((void (*)(int))func_80131B14)(((int)param_1)); - if (*(short *)(((int)param_1) + 0x76) <= 0) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); - return; - } - if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { - *(char *)(((int)param_1) + 0xC2) = 0; - } else { - *(short *)(((int)param_1) + 0x98) = 0; - *(char *)(((int)param_1) + 0xC2) = 1; - } - ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_80188610); - *(int *)(((int)param_1) + 0x1C) = 0; - func_80131CA8(((int)param_1), 0x1C); - return; - } - func_80131CA8(((int)param_1), 0x1C); -} - - - -DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ - -DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ - -DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ - -DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ - -DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ - -DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ - -DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ - -DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ - -DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ - -DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ - -DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ - -DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ - -DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ - -DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ - -DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ - -DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ - -DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80130650); - -DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ - -DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ - -DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ - -DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ - -DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ - -DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80130A18); - -DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ - -DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80130C08); - - -extern void (*D_80188618[])(void); - -void func_80130D0C(void *a0) { - D_80188618[*(u8 *)((s32)a0 + 0xC1)](); -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). -extern s32 rand(void); -extern u8 D_80078E78[]; -extern u16 D_80078EB2; -extern u16 D_80078EB4; -extern s16 D_80188668[]; -extern s16 D_80188698[]; -extern s16 D_801886F8[]; -extern s16 D_80188700[]; -extern s16 D_80188720[]; - -void func_80130D48(s32 arg0) -{ - register s16 *tbl __asm__("$16"); - register s32 pa __asm__("$18") = arg0; - register u8 *p __asm__("$19") = D_80078E78; - s32 s1v; - s32 call_a0; - s32 call_a1; - s32 cnt; - s32 r; - void *ret; - - s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); - if (s1v == 0) { - return; - } - - if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - } - - switch (s1v & 0xFFFF0000) { - case 0x10000: { - u32 x = D_80078EB4; - u32 y = D_80078EB2; - u32 b; - u32 a; - - s1v = 0; - if (x == y) { - s1v = 0xC; - } else if ((y >> 1) >= x) { - s1v = 3; - } - - b = *(u16 *)(p + 0x40); - a = *(u16 *)(p + 0x3E); - if (b == a) { - s1v += 0x18; - } else if ((a >> 1) >= b) { - s1v += 6; - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188698; tbl = (s16 *)(bp + v1); } - - r = rand() % 100; - cnt = 0; - loop27: - if (r >= *tbl) { - cnt += 1; - tbl += 1; - if (cnt < 3) { - goto loop27; - } - } - - s1v = 0; - switch (cnt) { - case 0: - tbl = D_801886F8; - s1v = 0x31; - break; - case 1: { - s32 mx = *(u16 *)(p + 0x3A); - s32 cur = *(u16 *)(p + 0x3C); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188700; tbl = (s16 *)(bp + v1); } - s1v = 0x32; - break; - } - case 2: { - s32 mx = *(u16 *)(p + 0x3E); - s32 cur = *(u16 *)(p + 0x40); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188720; tbl = (s16 *)(bp + v1); } - s1v = 0x33; - break; - } - } - - r = rand() % 100; - call_a1 = 0; - loop50: - if (r >= *tbl) { - call_a1 += 1; - tbl += 1; - if (call_a1 < 4) { - goto loop50; - } - } - call_a0 = s1v; - goto do_call; - } - case 0x20000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x30000: - call_a0 = 0x31; - call_a1 = 0; - goto do_call; - case 0x40000: - call_a0 = 0x32; - call_a1 = 0; - goto do_call; - case 0x50000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x60000: { - s32 rr = rand() & 0xFF; - tbl = D_80188668; - if (rr >= *tbl) { - do { - tbl += 3; - } while (rr >= *tbl); - } - call_a0 = tbl[1]; - if (*(u16 *)(p + 0x40) < 4U) { - call_a0 = 0x33; - } - call_a1 = tbl[2]; - goto do_call; - } - case 0x70000: - call_a0 = 0x27B; - call_a1 = 0; - goto do_call; - default: - return; - } - -do_call: - ret = func_8012C658(call_a0, call_a1, pa); - if (ret != 0) { - *(u16 *)((s8 *)ret + 0xA) -= 0x20; - } -} - - -// @class: loop-guard -// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps -// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` -// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); -// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's -// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC -// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). - - -void func_80131170(s32 p, s32 b, s32 c) { - extern u8 D_801885EC[]; - - func_80131B14(); - *(u8 *)(((u8 *)p) + 0xC2) = 0; - *(u8 *)(((u8 *)p) + 0xC3) = 0; - *(s16 *)(((u8 *)p) + 0x98) = 0; - if (((u8 *)b) == 0) { - ((u8 *)b) = D_801885EC; - } - func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); - *(s32 *)(((u8 *)p) + 0x1C) = 0; - if (c != 0) { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } else { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } -tail: - if (*(s16 *)(((u8 *)p) + 0x76) > 0) { - return; - } - if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); - } else { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); - } -} - - - -// @class: struct -// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) - -typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ - - -s32 func_801312D0(s32 param_1, void *param_2) -{ - extern int func_80131CF4(int, int); - extern M8_801312D0 D_80188740; - - int iVar5; - - iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); - if (iVar5 != 0) { - ((short *)param_2)[2] = 0; - ((short *)param_2)[0] = 0; - ((short *)param_2)[1] = (short)iVar5; - } else { - *(M8_801312D0 *)((short *)param_2) = D_80188740; - } -} - - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80131340); - -DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80131A34); - -DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` -// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be -// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a -// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). -// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; -// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the -// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); -// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. - -void func_80131B14() { - extern void func_8002A520(void *); - extern void func_8002A790(void *); - extern u8 D_80188748; - - register u8 *a0v __asm__("$4"); - u8 *p = a0v; - - - s32 e = *(u8 *)(p + 0x5E); - - if (*(s16 *)(p + 0x60) != 0) { - if (e == 0x1D) { - *(s16 *)(p + 0x82) = 0; - *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); - *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); - *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); - } - { - s32 dec; - s32 q = *(s32 *)(p + 0x78); - if (q != 0) { - dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; - if (dec <= 0) dec = 1; - } - *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; - } - ((void (*)(void *))func_8016AA50)(p); - if (*(u16 *)(p + 0x82) & 1) { - ((void (*)(void *))func_8016B428)(p); - ((void(*)(void *))func_80019064)(&D_80188748); - } - } - - *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; - - if (e != 0x1D) { - if (*(u8 *)(p + 0xC8)) func_8002A520(p); - if (*(u8 *)(p + 0xC9)) func_8002A790(p); - } - - if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; - - { - s32 r = *(s32 *)(p + 0x20); - *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; - { - s32 r2 = *(s32 *)(p + 0x20); - *(s16 *)(r2 + 0x14) = 0; - *(s16 *)(r2 + 0x10) = 0; - } - } - - ((void (*)(void *))func_8012B2CC)(p); - ((void (*)(void *))func_8012B23C)(p); -} - - - -DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80131CA8); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80131CF4); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80131D68); - - -extern void (*D_80188758[])(struct S80131E00 *a0); - -void func_80131E00(struct S80131E00 *a0, s32 a1) { - a0->field_B0 = a1; - D_80188758[a1](a0); -} - - -DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ - -DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ - -DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ - - -extern void (*D_801887B0[])(void); - -void func_80131EEC(void *a0) { - D_801887B0[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_801887F8[])(void); - -void func_80131F28(void *a0) { - D_801887F8[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80188800[])(void); - -void func_80131F64(void *a0) { - D_80188800[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80188808[])(void); - -void func_80131FA0(void *a0) { - D_80188808[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80188810[])(void); - -void func_80131FDC(void *a0) { - D_80188810[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80132018); - -DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_801887B8; - -void func_801320D8(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_801887B8; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -s32 func_80132144(s32 param_1) -{ - extern int D_801887C8; - - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(((int)param_1) + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(((int)param_1)); - } else { - ((void(*)(int, int))func_8001C214)(v0, 0); - *(int *)(((int)param_1) + 0x58) = (int)&D_801887C8; - *(short *)(((int)param_1) + 0x5c) = 0x80; - *(unsigned short *)(((int)param_1) + 2) += 1; - } -} - - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_801887D8; - -void func_801321B0(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_801887D8; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_801887E8; - -void func_8013221C(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_801887E8; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - -DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ - -DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801325B8); - -DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ - -DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ - -DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ - -DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ - -DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ - -DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80132F40); - -DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801330E0); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80133298); - -DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ - -DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH - -extern s32 D_801AD358; -extern s32 D_801AD35C[]; -extern int D_801AD360; -extern void func_80136BC4(s32 a0); - -void func_801336E8(void *a0, int a1, int a2) { - if (a0 != 0) { - (*(void * *)&D_801AD358) = a0; - ((void (*)(void))func_80136BC4)(); - } - (*(int *)&D_801AD35C) = a1; - D_801AD360 = a2; -} - - - - -extern s32 D_801AD35C[]; -extern s32 D_801AD358; -extern void func_80136BC4(s32); - -void func_8013373C(s16 arg0) { - s32 temp = D_801AD35C[arg0]; - if (temp != 0) { - D_801AD358 = temp; - func_80136BC4(temp); - } -} - - -// @class: regalloc-order -#include "common.h" - -typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; - - -s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { - extern s32 func_80047D3C(s32); - extern s32 func_80133AB0(s16, s16, s16, s32); - extern Box_80133784 * D_80188818; - extern Box_80133784 * D_8018881C; - extern s16 D_801AD364; - extern u16 D_801AD368; - - register s32 s1 __asm__("$17"); - s32 s2; - register s16 s3 __asm__("$19"); - register s32 s4 __asm__("$20"); - register s16 a0v __asm__("$4"); - register s16 arg0s __asm__("$21"); - s32 dx, dy, dz; - s32 r, ret; - - a0v = ((s16)arg0); - s1 = 0; - s3 = 0; - s4 = 0; - s2 = 0; - arg0s = a0v; - D_80188818->f6 = -0x7FFF; - D_8018881C->f6 = 0x7FFF; - D_80188818->f0 = ((Box_80133784 *)arg1)->f0; - D_80188818->f4 = ((Box_80133784 *)arg1)->f4; - D_8018881C->f0 = ((Box_80133784 *)arg2)->f0; - D_8018881C->f4 = ((Box_80133784 *)arg2)->f4; - D_801AD368 = 0; - D_801AD364 = 0; - - if ((s16)a0v == 0) { - s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; - s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; - s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; - if (sx == 0 && sy == 0) { - s32 zt = (sz == 0); - __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); - } - D_80188818->f2 = ((Box_80133784 *)arg1)->f2 - 4; - r = func_80047D3C(sx * sx + sz * sz); - if (r < 3) { - r = 4; - } else if (r < 5) { - r += 1; - } - D_8018881C->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; - } else { - D_80188818->f2 = ((Box_80133784 *)arg1)->f2; - if ((s16)a0v == 2) { - D_8018881C->f0 = D_80188818->f0; - D_8018881C->f2 = D_80188818->f2 + 6; - s2 = 1; - D_8018881C->f4 = D_80188818->f4; - } else { - D_8018881C->f2 = ((Box_80133784 *)arg2)->f2; - } - } - - while (1) { - s32 ret0; - register s32 retc __asm__("$3"); - __asm__ __volatile__(""); - ret0 = func_80133AB0(arg0s, (s16)D_80188818->f0, (s16)D_80188818->f4, (*(s32*)&D_801AD358)); - __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); - ret = retc; - if (ret == 0) goto after; - s4 |= ret; - if (s2 != 0) goto after; - { - s16 oldc = s3; - s3 = s3 + 1; - if (oldc >= 5) break; - } - } - - D_8018881C->f0 = D_80188818->f0; - D_8018881C->f2 = D_80188818->f2; - s1 = 0x2000; - D_8018881C->f4 = D_80188818->f4; - goto store_out; - -after: - if ((s16)s4 != 0 || D_801AD364 != 0) { - s16 t; - __asm__ __volatile__("" :: "r"(s4)); - t = D_80188818->f6; - if (t >= -0xBCB) { - if (t < -0x578) { - s1 |= 0x4000; - } else { - s1 |= 0x8000; - } - } - if ((s16)D_8018881C->f6 < -0xBCB) { - s1 |= 0x2000; - } - store_out: - ((Box_80133784 *)arg2)->f0 = D_8018881C->f0; - ((Box_80133784 *)arg2)->f2 = D_8018881C->f2; - ((Box_80133784 *)arg2)->f4 = D_8018881C->f4; - ((Box_80133784 *)arg2)->f6 = D_801AD368; - return s1 & 0xFFFF; - } - ((Box_80133784 *)arg2)->f6 = D_801AD368; - return 0; -} - - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80133AB0); - - -s32 func_80133CD4(arg0, cmd, base, arr) - s16 arg0; - s16 *cmd; - s16 *base; - s32 *arr; -{ - typedef struct { s16 e[4]; } ElemK; - - extern u16 *D_8018881C; - extern u16 *D_80188818; - extern s16 *D_80188824; - extern s16 *D_80188820; - extern s32 *D_8018882C; - extern s32 *D_80188830; - extern u16 D_801AD368; - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern u16 D_801152AE; - extern u8 D_801152B0; - extern s32 func_80134310(); - extern s32 func_8013435C(); - - s16 *s3 = ((ElemK *)base)[cmd[1]].e; - s32 s6 = arr[cmd[2]]; - s32 s0var, s1var; - s32 s2a; - s16 y; - - if (func_80134310(s3, D_8018881C, s6) >= 0) - return 0; - - s1var = func_80134310(s3, D_80188818, s6); - if (s1var < 0) - return 0; - - s0var = func_80134310(s3, D_80188824, 0); - { - u16 *pac = D_80188818; - s16 *pb8 = D_80188824; - s16 *pb4 = D_80188820; - s32 neg = -s1var; - pb4[0] = pac[0] + neg * pb8[0] / s0var; - pb4[1] = pac[1] + neg * pb8[1] / s0var; - pb4[2] = pac[2] + neg * pb8[2] / s0var; - if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) - return 0; - } - if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80188820, arr[cmd[6]], s3)) - return 0; - if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80188820, arr[cmd[8]], s3)) - return 0; - if (arg0 < 0) { - if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80188820, arr[cmd[10]], s3)) - return 0; - } - if (arg0 & 0x10) { - if (*(u16 *)cmd & 0x100) - return 0; - } - if (*(u16 *)cmd & 0x200) { - D_801AD368 = *(u16 *)cmd; - return 0; - } - - { - s32 ret = func_80134310(s3, D_8018881C, s6); - s32 *pc0; - s32 *pc4; - u16 *pb0; - s32 t, o2; - s32 q3v; - - { - s32 *pw = D_8018882C; - ((struct { s32 w; } *)pw)->w = s3[0]; - pw[1] = s3[1]; - pw[2] = s3[2]; - } - s1var = -ret; - - __asm__ __volatile__( - "lwc2 $9, 0(%0)\n" - "lwc2 $10, 4(%0)\n" - "lwc2 $11, 8(%0)\n" - "nop\n" - "nop\n" - "sqr 0\n" - : : "r"(D_8018882C) : "$9", "$10", "$11", "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"(D_80188830) : "memory"); - - pc0 = D_8018882C; - pc4 = D_80188830; - s0var = pc4[0] + pc4[1] + pc4[2]; - pb0 = D_8018881C; - pb0[0] += s1var * pc0[0] / s0var; - pb0[1] += s1var * pc0[1] / s0var; - q3v = s1var * pc0[2] / s0var; - - { - s32 h; - h = ((s16 *)pb0)[0]; - s1var = h << 16; - __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); - s0var = h << 16; - } - pb0[2] += q3v; - s2a = (s16)pb0[2] << 16; - - t = pc0[0] << 4; - pc0[0] = t; - if (t < 0) s1var |= 0xFFFF; - t = pc0[1] << 4; - pc0[1] = t; - if (t < 0) s0var |= 0xFFFF; - o2 = pc0[2]; - t = o2 << 4; - pc0[2] = t; - if (t < 0) s2a |= 0xFFFF; - s2a += o2 << 5; - s1var += pc0[0] << 1; - s0var += pc0[1] << 1; - - do { - s32 *pl = D_8018882C; - u16 *pb; - s1var += pl[0]; - s0var += pl[1]; - s2a += pl[2]; - pb = D_8018881C; - pb[0] = s1var >> 16; - pb[1] = s0var >> 16; - pb[2] = s2a >> 16; - ret = func_80134310(s3, pb, s6); - } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); - } - - y = s3[1]; - if (y >= -0xBCB) { - D_80188818[3] = y; - { - typedef struct { s8 c[8]; } Blk8; - *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; - } - if (*(u8 *)cmd != 0) - goto ret1; - return -1; - } - { - typedef struct { u16 h; } H16; - u16 *s3u = (u16 *)s3; - u16 *bp = D_8018881C; - u16 w; - ((H16 *)D_801152A8)->h = s3u[0]; - w = s3u[1]; - bp[3] = w; - ((H16 *)&D_801152AA)->h = w; - ((H16 *)&D_801152AC)->h = s3u[2]; - ((H16 *)&D_801152AE)->h = s3u[3]; - } -ret1: - return 1; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80134310); - -DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (83 ins, relocation-masked) - - - -s32 func_801343C4(s32 angle, s32 p1, s32 p2) -{ - extern int func_80133AB0(int, s16, s16, int); - extern s16 * D_80188818; - extern s16 * D_8018881C; - extern u16 D_801AD368; - extern u16 D_801AD364; - - s16 *pac; - s16 *pb0; - s16 *pacs, *pb0s; - u16 *pb0u; - int a1v, a2v, d94, b0; - int sangle = ((s16)angle); - - pac = D_80188818; - d94 = D_801AD358; - pb0 = D_8018881C; - pac[0] = ((u16 *)p1)[0]; - pac[1] = ((u16 *)p1)[1]; - pac[2] = ((u16 *)p1)[2]; - pb0[0] = ((u16 *)p2)[0]; - pb0[1] = ((u16 *)p2)[1]; - pb0[2] = ((u16 *)p2)[2]; - - a1v = pac[0]; a2v = pac[2]; - __asm__ __volatile__("" ::: "memory"); - D_801AD368 = 0; - D_801AD364 = 0; - if (func_80133AB0(sangle, a1v, a2v, d94)) { - setdst: - pb0u = (u16 *)D_8018881C; - ((u16 *)p2)[0] = pb0u[0]; - ((u16 *)p2)[1] = pb0u[1]; - ((u16 *)p2)[2] = pb0u[2]; - ((u16 *)p2)[3] = D_801AD368; - return 1; - } - - pacs = D_80188818; - pb0s = D_8018881C; - b0 = pb0s[0]; - if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && - (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { - return 0; - } - if (func_80133AB0(sangle, b0, pb0s[2], D_801AD358)) { - goto setdst; - } - return 0; -} - - - -// @class: schedule -typedef struct { - u16 f0; /* 0x0 */ - u16 f2; /* 0x2 */ - u16 f4; /* 0x4 */ - s16 f6; /* 0x6 */ -} Foo_80134510_80134510; - - -s32 func_80134510(s32 param) { - extern s32 func_801345F8(s32); - extern Foo_80134510_80134510 * D_80188818; - extern Foo_80134510_80134510 * D_8018881C; - extern Foo_80134510_80134510 * D_80188820; - extern u16 D_801AD368; - - - s32 ret = 0; - Foo_80134510_80134510 *b0 = D_8018881C; - Foo_80134510_80134510 *ac = D_80188818; - u16 t0 = ((Foo_80134510_80134510 *)param)->f0; - u16 t2, t4; - - ((Foo_80134510_80134510 *)param)->f6 = 0; - ac->f0 = t0; - b0->f0 = t0; - t2 = ((Foo_80134510_80134510 *)param)->f2; - ac->f2 = t2 - 4; - b0->f2 = t2 + 0x2FC; - t4 = ((Foo_80134510_80134510 *)param)->f4; - ac->f4 = t4; - b0->f4 = t4; - - if (func_801345F8((*(s32*)&D_801AD358)) != 0) { - s16 x; - ((Foo_80134510_80134510 *)param)->f2 = D_80188820->f2 - 2; - x = D_80188818->f6; - if (x >= -3019) { - if (x < -1400) { - ret = 0x4000; - } else { - ret = 0x8000; - } - } else { - ret = 0x2000; - } - D_80188818->f6 = D_801AD368; - } - return ret; -} - - - -// @class: regalloc-order -// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. - - -s32 func_801345F8(s32 arg) -{ - extern int func_801347A0(short, u16 *, int, int); - extern u16 * D_80188818; - extern u16 D_801AD368; - - register u16 *param_1 __asm__("$5") = ((u16 *)arg); - register u16 *cc __asm__("$4") = D_80188818; - int c8000 = 0x8000; - register int zr __asm__("$0"); - u32 c1, c2, uVar6, uVar2, cnt, v14; - u16 *ptmp, *puVar4, *puVar7, uVar1; - int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; - - c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; - uVar6 = c1 + zr; - if ((c1 & 0xffff) < (u32)param_1[2]) { - c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; - uVar2 = c2 + zr; - if ((c2 & 0xffff) < (u32)param_1[3]) - goto do_mult; - return 0; - found: - D_801AD368 = *puVar7; - return 1; - do_mult: - tbl = *(int *)(param_1 + 4); - uVar10 = *(int *)(param_1 + 6); - uVar3 = *(int *)(param_1 + 8); - iVar9 = *(int *)(param_1 + 0xc); - iVar8 = *(int *)(param_1 + 0xe); - ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); - cnt = (u32)ptmp[1]; - v14 = *(int *)(param_1 + 10); - puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; - while (((cnt-- + zr) & 0xffff) != 0) { - uVar1 = *puVar4; - hi = uVar1 & 0x8000; - harg = hi + zr; - if (hi == 0) - puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); - else - puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); - if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) - goto found; - puVar4 = puVar4 - 1; - } - } - return 0; -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. -#include "common.h" - -typedef struct { - /* 0x00 */ u16 f0; - /* 0x02 */ s16 f2; - /* 0x04 */ s16 f4; - /* 0x06 */ s16 f6; - /* 0x08 */ s16 f8; - /* 0x0A */ s16 fa; - /* 0x0C */ s16 fc; - /* 0x0E */ s16 fe; - /* 0x10 */ s16 f10; - /* 0x12 */ s16 f12; - /* 0x14 */ s16 f14; -} S0_801347A0; - -typedef struct { - /* 0x0 */ s16 f0; - /* 0x2 */ s16 f2; - /* 0x4 */ s16 f4; - /* 0x6 */ s16 f6; -} Elem_801347A0; - -typedef struct { - /* 0x0 */ u16 f0; - /* 0x2 */ u16 f2; - /* 0x4 */ u16 f4; - /* 0x6 */ u16 f6; -} SVec_801347A0; - - - -s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); - extern s16 * D_8018881C; - extern SVec_801347A0 * D_80188818; - extern SVec_801347A0 * D_80188820; - - Elem_801347A0 *pElem; - s32 val; - register s32 iv __asm__("$4"); - s32 q; - s32 dvsr; - - pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; - val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; - if (func_80134A28((s32)pElem, (s32)D_8018881C, val) >= 0) { - return 0; - } - iv = func_80134A28((s32)pElem, (s32)D_80188818, val); - if (iv < 0) { - return 0; - } - iv = -iv; - dvsr = pElem->f2 * 48; - q = (iv * 48) / dvsr; - D_80188820->f0 = D_80188818->f0; - D_80188820->f2 = D_80188818->f2 + q; - D_80188820->f4 = D_80188818->f4; - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { - return 0; - } - if ((s16)arg0) { - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { - return 0; - } - } - if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { - return 0; - } - D_80188820->f0 = D_80188818->f0; - D_80188820->f4 = D_80188818->f4; - (*(Elem_801347A0*)D_801152A8) = *pElem; - D_80188818->f6 = pElem->f2; - return 1; -} - - - -DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80134A74); - -// @class: regalloc-order -// @try: variant B — direct pins m=$s5($21), c=$s6($22) - - -s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); - extern void * D_80188818; - extern void * D_8018881C; - extern void * D_80188820; - extern void * D_80188824; - extern u16 D_801AD368; - - s32 temp_a3; - s32 temp_s1; - s32 temp_v0; - s32 temp_v0_2; - s32 var_v0; - u16 temp_a1; - s32 temp_s4; - s32 c = arg0; - __asm__ __volatile__("" : "=r"(c) : "0"(c)); - __asm__ __volatile__("" : : "r"(arg0)); - - temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); - temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); - var_v0 = 0; - if (func_80134FB8(temp_s4, (s32) D_8018881C, temp_s1) >= 0) { - return var_v0; - } - temp_v0 = func_80134FB8(temp_s4, (s32) D_80188818, temp_s1); - if (temp_v0 < 0) { - goto block_13; - } - temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80188824, 0); - temp_a3 = -temp_v0; - { - u16 *pB4 = (u16 *)D_80188820; - u16 *pAC = (u16 *)D_80188818; - s16 *pB8 = (s16 *)D_80188824; - pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; - pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; - pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { - return var_v0; - } - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80188820, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { - return var_v0; - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80188820, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { - return var_v0; - } - if ((arg0 << 16) < 0) { - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80188820, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { - return var_v0; - } - } - if (c & 1) { - if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { - goto block_14; - } - return 0; - } - temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); - if (!(temp_a1 & 0x200)) { - goto block_14; - } - D_801AD368 = temp_a1; -block_13: - return 0; -block_14: - __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); - VectorNormalSS(D_80188824, D_80188824); - { - u16 *pB8 = (u16 *)D_80188824; - u16 *pB4b = (u16 *)D_80188820; - pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); - var_v0 = 1; - pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); - pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); - } - return var_v0; -} - - - -DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ - -// @class: plumbing -// @stuck: MATCH (89 ins). To BANK: retype D_8018881C + D_80188818 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). - - - - -s32 func_80135004(s32 arg0, s32 p1, s32 p2) -{ - extern int func_80134A74(int, s16, s16, int); - extern s16 * D_8018881C; - extern s16 * D_80188818; - extern u8 D_80188824; - extern s16 *D_80188820; - extern u16 D_801AD368; - - register s16 *pb0 __asm__("$9"); /* D_8018881C -> $t1 */ - register s16 *pac __asm__("$6"); /* D_80188818 -> $a2 */ - register s16 *pb8 __asm__("$8"); /* D_80188824 -> $t0 */ - u16 *pb4; - u16 a, b; - int id; - int a1v, a2v, d94; - - pb0 = D_8018881C; - __asm__ __volatile__("" : : "r"(pb0)); - - a = ((u16 *)p2)[0]; pac = D_80188818; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80188824); pac[0] = b; pb8[0] = a - b; - a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; - a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; - - id = ((int)arg0) & 0xFFFF; - a1v = pac[0]; a2v = pac[2]; d94 = D_801AD358; - __asm__ __volatile__("" ::: "memory"); - D_801AD368 = 0; - - if (func_80134A74(id, a1v, a2v, d94)) { - found: - pb4 = (*(u16 * *)&D_80188820); - ((u16 *)p2)[0] = pb4[0]; - ((u16 *)p2)[1] = pb4[1]; - ((u16 *)p2)[2] = pb4[2]; - ((u16 *)p2)[3] = D_801AD368; - return 1; - } - { - register u16 *qb __asm__("$4"); /* D_80188818 -> $a0 (reloaded) */ - register int qa0 __asm__("$5"); /* D_8018881C[0], kept in $a1 for the 2nd-call arg */ - register u16 *qa __asm__("$6"); /* D_8018881C -> $a2 (reloaded) */ - qb = (u16 *)D_80188818; - qa = (u16 *)D_8018881C; - qa0 = qa[0]; - if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && - ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) - return 0; - if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801AD358)) - goto found; - return 0; - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (62 ins, relocation-masked) - - -extern u8 D_8018881C; -extern u8 D_80188818; -extern s16 *D_80188820; -extern u8 D_80188824; -extern int D_801AD358; -extern u16 D_801AD368; - -extern int func_80134A74(int, s16, s16, int); - -int func_80135168(u16 arg0, u16 *p1, u16 *p2) -{ - register s16 *pb0 __asm__("$8"); - register s16 *pac __asm__("$6"); - register s16 *pb8 __asm__("$7"); - u16 *pb4; - u16 a, b; - int a1v, a2v, d94; - - pb0 = (*(s16 * *)&D_8018881C); - __asm__ __volatile__("" : : "r"(pb0)); - - a = p2[0]; pac = (*(s16 * *)&D_80188818); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80188824); pac[0] = b; pb8[0] = a - b; - a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; - a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; - - a1v = pac[0]; a2v = pac[2]; d94 = D_801AD358; - __asm__ __volatile__("" ::: "memory"); - D_801AD368 = 0; - if (func_80134A74(arg0, a1v, a2v, d94)) { - pb4 = (*(u16 * *)&D_80188820); - p2[0] = pb4[0]; - p2[1] = pb4[1]; - p2[2] = pb4[2]; - p2[3] = D_801AD368; - return 1; - } - return 0; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80135260); - - -/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). - * - * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 - * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does - * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in - * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). - * - * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): - * the two output buffers D_80188818 / D_8018881C are written through a pointer in each of the two - * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a - * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also - * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each - * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks - * the lowest-free scratch over its OWN window: - * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) - * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) - * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail - * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. - * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades - * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the - * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. - * - * Zero file-scope footprint (block-scoped typedefs + externs; D_80188818/B0 read via the ambient - * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for - * family_sweep --edit-remap with no cc1 crash. - * - * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. - */ -s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) -{ - typedef struct { s32 vx, vy, vz, pad; } Vec32; - typedef struct { s16 vx, vy, vz, pad; } Vec16; - typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; - extern void func_80048EAC(void *m0, void *m1); - extern void func_8004914C(void *m); - extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); - extern void ApplyRotMatrixLV(void *in, void *out); - extern void ApplyRotMatrix(void *in, void *out); - extern s32 D_801AD36C, D_801AD370, D_801AD374, D_801AD378; - extern s16 D_801AD37C; - extern s32 D_801AD38C; - extern s16 D_801AD390, D_801AD392, D_801AD394, D_801AD396, D_801AD398, D_801AD39A; - - Vec32 in0, in1, rotout; - Mat32 mat2; - Vec16 vecin; - s32 result; - s32 mode; - s32 q1, q2; - s32 p; - s32 t18, t1A, t1C; - s32 *m; - - in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); - in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); - if ((param_2 & 0x10000000) == 0) { - if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { - return 0; - } - } - mode = param_2 & 0x60000000; - if (mode != 0) { - result = 1; - if (param_2 >= 0) { - mode &= 0x40000000; - } - in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); - in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); - switch (mode) { - case 0x60000000: - m = &D_801AD36C; - *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); - q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); - q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); - D_801AD370 = 0; - D_801AD378 = 0; - D_801AD374 = q1; - D_801AD37C = q2; - func_80048EAC((void *)((s32)param_1 + 0x34), m); - ApplyTransposeMatrixLV(m, &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - /* fallthrough */ - case 0x20000000: - p = (param_2 & 0xFFFFFFF) | 0x80000000; - t18 = *(s16 *)((s32)param_1 + 0x18); - t1A = *(s16 *)((s32)param_1 + 0x1A); - t1C = *(u16 *)((s32)param_1 + 0x1C); - mat2.w4 = 0; - mat2.wC = 0; - mat2.w0 = t18; - mat2.w8 = t1A; - mat2.h10 = t1C; - func_8004914C(&mat2); - vecin.vx = *(u16 *)(p + 4); - vecin.vy = *(u16 *)(p + 8); - vecin.vz = *(u16 *)(p + 0xC); - ApplyRotMatrix(&vecin, &rotout); - D_801AD390 = rotout.vx; - D_801AD394 = rotout.vy; - D_801AD398 = rotout.vz; - vecin.vx = *(u16 *)(p + 6); - vecin.vy = *(u16 *)(p + 0xA); - vecin.vz = *(u16 *)(p + 0xE); - ApplyRotMatrix(&vecin, &rotout); - D_801AD38C = 0; - D_801AD392 = rotout.vx; - D_801AD396 = rotout.vy; - D_801AD39A = rotout.vz; - result += 2; - break; - case 0x40000000: - ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - break; - } - { - s16 *p = *(s16 **)&D_80188818; - p[0] = in0.vx; - p[1] = in0.vy; - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_8018881C; - p[0] = in1.vx; - p[1] = in1.vy; - p[2] = in1.vz; - } - return result; - } - { - s16 *p = *(s16 **)&D_80188818; - p[0] = in0.vx; - p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_8018881C; - p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); - p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); - } - return 1; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80135888); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80135A4C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80135D20); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80135EB0); - - -s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - register s32 a1v __asm__("$11"); - register s32 a2v __asm__("$12"); - register s32 n __asm__("$5"); - register s16 *b4 __asm__("$7"); - s32 d; - s32 dx; - s32 denom; - s32 result; - s32 frame_pad[2]; - (void)&frame_pad; - __asm__("" : "=r"(a1v) : "0"(arg1)); - a2v = arg2; - - if (!(arg1 & 1)) { - dx = (s16) arg2 - (*(s16 **)&D_80188818)[2]; - d = dx; - denom = -(*(s16 **)&D_80188824)[2]; - } else { - denom = (*(s16 **)&D_80188824)[2]; - d = (*(s16 **)&D_80188818)[2] - (s16) arg2; - dx = -d; - } - n = -d; - { - register s16 *b8 __asm__("$6") = *(s16 **)&D_80188824; - u16 *ac = *(u16 **)&D_80188818; - b4 = D_80188820; - b4[0] = ac[0] + n * b8[0] / denom; - b4[1] = ac[1] + n * b8[1] / denom; - b4[2] = ac[2] + dx; - } - - if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; - if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; - if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; - if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; - if (a1v & 0x8000) { - u16 *b0 = *(u16 **)&D_8018881C; - b4[0] = b0[0]; - b4[1] = b0[1]; - } - D_801152AA = 0; - (*(s16 *)D_801152A8) = 0; - if (a1v & 1) { - D_80188820[2] = a2v + 2; - __asm__ __volatile__(""); - D_801152AC = 0xFFF; - } else { - D_801152AC = -0xFFF; - D_80188820[2] = a2v - 2; - } - __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); - (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; - D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; - result = 1; - D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; - return result; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801365B8); - - -// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) -// D_80188818/B0/B8 are file-scope `extern u8`, D_80188820 is `extern s32 []`; each HOLDS a -// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. -// D_80188820 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the -// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar -// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the -// siblings read it once via *(u16**)&sym == direct lw either way). - -s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - - register u16 *ac __asm__("$4"); - register s16 *b8 __asm__("$6"); - register s16 *b4 __asm__("$9"); - register s32 r __asm__("$3"); - register s32 pos __asm__("$12"); - register s32 a1v __asm__("$5"); - s16 temp_v0; - s16 temp_v1; - s32 var_a3; - s16 var_v0_3; - s32 temp_a1; - s32 var_t0; - s32 var_v1; - s16 *b4b; - u16 *p; - - __asm__ ("" : "=r"(a1v) : "0"(arg1)); - pos = arg2; - if (!(a1v & 1)) { - var_t0 = (s16) arg2 - (*(s16 **)&D_80188818)[1]; - var_v1 = var_t0; - var_a3 = -(*(s16 **)&D_80188824)[1]; - } else { - var_a3 = (*(s16 **)&D_80188824)[1]; - var_v1 = (*(s16 **)&D_80188818)[1] - (s16) arg2; - var_t0 = -var_v1; - } - b8 = (*(s16 **)&D_80188824); - ac = (*(u16 **)&D_80188818); - b4 = D_80188820; - temp_a1 = -var_v1; - r = (temp_a1 * b8[0]) / var_a3; - b4[0] = ac[0] + r; - b4[1] = ac[1] + var_t0; - r = (temp_a1 * b8[2]) / var_a3; - temp_v0 = ac[2] + r; - b4[2] = temp_v0; - temp_v1 = b4[0]; - if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { - return 0; - } - if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { - return 0; - } - if (arg1 & 0x8000) { - p = (*(u16 **)&D_8018881C); - b4[0] = (s16) p[0]; - b4[2] = (s16) p[2]; - } - D_801152AC = 0; - (*(s16 *)D_801152A8) = 0; - if (arg1 & 1) { - b4b = D_80188820; - D_801152AA = 0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos + 2; - } else { - b4b = D_80188820; - D_801152AA = -0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos - 2; - } - b4b[1] = var_v0_3; - __asm__ __volatile__("" :: "r"(pos)); - (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); - D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); - D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); - return 1; -} - - -// @class: schedule -// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a -// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE -// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses -// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] -// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the -// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; -// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits -// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the -// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). - - -extern s16 *D_80188820; /* holds a pointer value (*(u16**)&D_80188820) */ - -s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { - extern void ApplyMatrixSV(void *m, void *v0, void *v1); - extern void ApplyRotMatrix(void *v0, void *v1); - extern u16 D_80126722; - extern s16 D_80126724; - extern s16 D_801152AA; - extern s16 D_801152AC; - - s32 out[4]; - u16 *pb4; - - if (a0) { - ApplyMatrixSV((void *)a3, *(void **)&D_80188820, *(void **)&D_80188820); - ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); - ApplyRotMatrix((void *)D_801152A8, (void *)out); - *(s16 *)D_801152A8 = out[0]; - D_801152AA = out[1]; - D_801152AC = out[2]; - } - - pb4 = *(u16 **)&D_80188820; - *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); - *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); - *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); - - *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); - D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); - D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); -} - - - -DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ - -DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ - -DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ - -DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ - -DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ - - -extern unsigned short D_800B99F0; -extern void (*D_80188834[])(void); - -void func_80136C54(void) -{ - D_80188834[D_800B99F0](); -} - - -// @class: struct -// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801AC3C4 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). - -typedef struct { char s[10]; } S10_80136C90; - -s32 func_80136C90() -{ - extern void func_8001534C(int, void *, int, int, int, int); - extern S10_80136C90 D_801AC3C4; - - S10_80136C90 buf = D_801AC3C4; - func_8001534C(0, &buf, 0x78, 0x10, 0, 0); -} - - - -DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ - -DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80136DFC); - -DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ - -DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80136F3C); - -DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80137178); - -DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ - -DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80137614); - -DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ - -DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801376E8); - -DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ - -DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801378F0); - -DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ - -DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801379FC); - - -// @class: remat -// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer -extern s32 D_80127548[]; -extern int D_80188888; -extern int D_801269F0; -extern void func_80138BE0(int p); - -void func_80137B80(void) { - int *p = &D_801269F0; - (*(int *)&D_80127548) = 0x24; - if (*p != 0) { - ((void (*)(int *))func_80138BE0)(p); - } - D_80188888 += 1; -} - - -DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. - -extern unsigned char D_80126A0E; -extern short D_80126A0A; -extern s16 D_801269F4; -extern int D_800A5E60; -extern int D_80188888; -extern int D_801269F0; - -extern void func_801392FC(); -extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); -extern void func_80139680(s32 a0, u8 *a1); - -int func_80137D08(int arg0, int arg1, short arg2) -{ - unsigned char buf[3]; - - D_800A5E60 = arg0; - D_80126A0A = arg2; - ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); - if ((*(short *)&D_801269F4) == 7) { - buf[0] = 0x39; - buf[1] = 0xFF; - buf[2] = 0x71; - ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); - } else if ((*(short *)&D_801269F4) == 3) { - if (D_80188888 & 4) { - ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); - } - } - return D_800A5E60; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80137DD4); - -DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018888C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018888C[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801888D0; -extern u8 D_80188914; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801888D0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80188914 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80188958[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80188994[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80188994; - if (((s16)a1) < 0xC00) { - tbl = D_80188958; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801889D0, D_801889D2, D_801889D4, D_801889D6, D_801889D8, D_801889DA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801889D2 < ang)) goto outer_else; - if (!(ang < D_801889D8)) goto inner_else; - if (ang < D_801889D4) { *(s16 *)L = D_801889D4; goto done; } - if (D_801889D6 < ang) { *(s16 *)L = D_801889D6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801889D0) { *(s16 *)L = D_801889D0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801889DA < ang) { *(s16 *)L = D_801889DA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801AD3D0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801AD3D0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801AD3D0; -extern s8 D_801AD3D4; -extern s8 D_801AD3D5; - -void func_8013C9C4(void * arg0) -{ - D_801AD3D0 = arg0; - D_801AD3D4 = 0; - D_801AD3D5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801AD3D0; -extern s8 D_801AD3D4; -extern s8 D_801AD3D5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801AD3D0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801AD3D5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801AD3D4)) * 2) + D_801AD3D0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801AD3D5 = (unsigned char) p[1]; - D_801AD3D4 = D_801AD3D4 + 1; - if (D_801AD3D5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801AD3D4 = 0; - *base = 0; - } - } - else - { - D_801AD3D5 = c - 1; - } - } - return; -} - - - -extern s32 D_801AD3F4; -extern s32 D_801AD3E8; -extern s32 D_801AD3EC; -extern s32 D_801AD3F8; - -void func_8013CABC(void) { - D_801AD3F4 = 1; - D_801AD3E8 = 1; - D_801AD3EC = 0; - D_801AD3F8 = 1; -} - - - -extern s32 D_801AD3E8; -extern s32 D_801AD3EC; -extern s32 D_801AD3F0; -extern s32 D_801AD3F4; -extern s32 D_801AD3F8; - -void func_8013CAE8(void) { - D_801AD3E8 = 1; - D_801AD3F4 = 0; - D_801AD3EC = 0; - D_801AD3F0 = -1; - D_801AD3F8 = 0; -} - - - -extern s32 D_801AD3F4; -extern s32 D_801AD3F8; -extern s32 D_801AD420; -extern s32 D_801AD424; - -void func_8013CB20(void) -{ - D_801AD420 = D_801AD3F8; - D_801AD424 = D_801AD3F4; - D_801AD3F8 = 1; - D_801AD3F4 = 0; -} - - - -extern s32 D_801AD420; -extern s32 D_801AD424; -extern s32 D_801AD3F8; -extern s32 D_801AD3F4; - -void func_8013CB5C(void) { - D_801AD3F8 = D_801AD420; - D_801AD3F4 = D_801AD424; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B1FF8; - extern u8 D_801B1FF9; - extern u8 D_801B1FFA; - extern u8 D_801B1FFB; - extern u8 D_801B1FFC; - extern u8 D_801B1FFD; - extern u8 D_801B1FFE; - extern u8 D_801B1FFF; - extern u8 D_801B2000; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B1FF8; t1 = D_801B1FF9; t2 = D_801B1FFA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B1FFB; t1 = D_801B1FFC; t2 = D_801B1FFD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B1FFE; t1 = D_801B1FFF; t2 = D_801B2000; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801AD400; -extern s32 D_801AD3E8; -extern s32 D_801AD404; -extern s32 D_801AD3F4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801AD400 != 0) { - if (D_801AD400 != 2) { - if (((D_801AD400 < 3) && (D_801AD400 == 1)) && - (D_801AD404 = D_801AD404 + 1, 0x23a < D_801AD404)) { - D_801AD3E8 = D_801AD400; - D_801AD400 = 2; - } - } else { - D_801AD3E8 = D_801AD3E8 + -1; - if (D_801AD3E8 == 0) { - D_801AD3E8 = D_801AD400; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801AD3F4 == 0) { - D_801AD400 = D_801AD400 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801AD3F4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801AD3F4; -} - - - -extern s32 D_801AD400; - -void func_8013D164(void) { - D_801AD400 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B20DA; -extern u8 D_801B2186; -extern u8 D_801B2002; -extern u8 D_801B20BC; -extern u8 D_801B1FE0; -extern u8 D_801B2001; -extern s32 D_801B20C0; - -void func_8013D330(void) { - if ((D_801B20DA & 0xff) != D_801B2186) { - D_801B20DA = ((D_801B20DA & 0xff) < D_801B2186) ? (D_801B20DA + 1) : (D_801B20DA - 1); - } - if ((D_801B2002 & 0xff) != D_801B20BC) { - D_801B2002 = ((D_801B2002 & 0xff) < D_801B20BC) ? (D_801B2002 + 1) : (D_801B2002 - 1); - } - if ((D_801B1FE0 & 0xff) != D_801B2001) { - D_801B1FE0 = ((D_801B1FE0 & 0xff) < D_801B2001) ? (D_801B1FE0 + 1) : (D_801B1FE0 - 1); - } - D_801B20C0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801AD3D8; -extern void *D_801AD3DC; -extern void *D_801AD3E0; -extern s32 D_801AD408; -extern s32 D_801AD40C; -extern s32 D_801AD410; -extern s32 D_801B2034[]; - -extern u8 D_80188AC8[]; -extern u8 D_80188B70[]; -extern u8 D_80188A20[]; -extern u8 D_80188B1C[]; -extern u8 D_80188B9C[]; -extern u8 D_80188A74[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801AD408 = param_2; - D_801AD40C = (param_2 >> 2) & 3; - D_801AD410 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801AD3D8 = D_80188AC8; - D_801AD3DC = D_80188B70; - D_801AD3E0 = D_80188A20; - } else { - D_801AD3D8 = D_80188B1C; - D_801AD3DC = D_80188B9C; - D_801AD3E0 = D_80188A74; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801AD410 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801AD408 & 2) != 0) { - D_801B2034[0] = 0x140; - D_801B2034[3] = 0x80; - if (p[0x37] == 4) { - D_801B2034[0] = 0x140; - D_801B2034[3] = 0; - } - if (p[0x37] == 0) { - D_801B2034[0] = 0x140; - D_801B2034[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801AD3E0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801AD3E0; -extern s16 *D_801AD3E4; -extern s32 D_801AD3F4; -extern s32 D_801AD414; -extern s32 D_801AD418; -extern s32 D_801AD41C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801AD3E4 != 0) { - D_801AD3F4 = 0; - p = (int *)(param_1 * 12 + (int)D_801AD3E0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801AD414 != x) { - flag = 1; - if (D_801AD414 < x) { - if (x - D_801AD414 < 5) { - D_801AD414 = x; - } else { - D_801AD414 = D_801AD414 + 4; - } - } else { - if (D_801AD414 - x < 5) { - D_801AD414 = x; - } else { - D_801AD414 = D_801AD414 - 4; - } - } - } - if (D_801AD418 != y) { - flag = 1; - if (D_801AD418 < y) { - if (y - D_801AD418 < 5) { - D_801AD418 = y; - } else { - D_801AD418 = D_801AD418 + 4; - } - } else { - if (D_801AD418 - y < 5) { - D_801AD418 = y; - } else { - D_801AD418 = D_801AD418 - 4; - } - } - } - if (D_801AD41C != z) { - flag = 1; - if (D_801AD41C < z) { - if (z - D_801AD41C < 5) { - D_801AD41C = z; - } else { - D_801AD41C = D_801AD41C + 4; - } - } else { - if (D_801AD41C - z < 5) { - D_801AD41C = z; - } else { - D_801AD41C = D_801AD41C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801AD3F4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80188C2C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801AD3E4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AD414); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AD418); - uVar5 = (*(int*)&D_801AD41C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80188C2C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801AD3FC; - -s32 func_8013E054(void) { - return D_801AD3FC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80189628; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80189600; -extern s16 D_80189602; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80189628; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80189600 = 2; - D_80189602 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80189602 = 0; - D_80189600 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801AD430; - extern void * D_801AD434; - extern unsigned char D_801892A0; - extern unsigned char D_801892B8; - extern unsigned char D_8018932C; - extern unsigned char D_80189334; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801AD430 = &D_801892A0; - D_801AD434 = &D_8018932C; - } else { - D_801AD430 = &D_801892B8; - D_801AD434 = &D_80189334; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80189628/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80189628 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80189628)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80189604; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80189604)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80189604)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80189600; -extern s16 D_80189602; -extern unsigned char D_80189604; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80189602` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80189600` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80189602; - if (*r < 3) { - *r = *r + 1; - } - D_80189600 = (u16)D_80189600 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189604); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80189604; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189604); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013FAF8); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8013FFD8); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8014032C); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80140608); - - -// @class: iv-combine -// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source -// pointer compile to fixed offsets when written base[0..n]; the target advances -// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead -// final increment, yielding the "increment N-2 then offset 0/2" tail). - -extern u8 *D_801892E0; -extern u8 *D_801892E4; -extern u8 *D_801892E8; -extern u8 *D_801892EC; -extern u8 *D_801892F0; -extern u16 *D_801892F4[]; -extern u16 *D_801892FC[]; -extern u16 *D_8018931C[]; - -extern s32 func_80028D58(void); -extern s32 func_80028DE0(void); -extern s32 func_80028FBC(void); -extern s32 func_80029000(void); -extern s32 func_80028D9C(void); - -void func_801407F4(void) -{ - u8 *puVar1; - s32 iVar2; - u16 *puVar3; - - puVar1 = D_801892E0; - iVar2 = func_80028D58(); - puVar3 = D_801892F4[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - puVar1 = D_801892E4; - iVar2 = func_80028DE0(); - puVar3 = D_801892F4[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - iVar2 = func_80028FBC(); - *(s16 *)(D_801892E8 + 0x18) = *D_801892FC[iVar2]; - iVar2 = func_80029000(); - *(s16 *)(D_801892EC + 0x18) = *D_801892FC[iVar2]; - - puVar1 = D_801892F0; - iVar2 = func_80028D9C(); - puVar3 = D_8018931C[iVar2]; - *(s16 *)(puVar1 + 0x12) = *puVar3++; - *(s16 *)(puVar1 + 0x14) = *puVar3++; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - *(s16 *)(puVar1 + 0x1c) = *puVar3++; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80140958); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80140D68); - - -// @class: struct -// @stuck: none — MATCH - -extern unsigned char D_80078E7F; -extern unsigned char D_80078E7E; -extern unsigned char D_80078E7D; -extern M2C_UNK D_8018921C; - -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); - -void func_80140E6C(void) { - void *puVar1; - unsigned int uVar2; - unsigned int uVar3; - unsigned int uVar4; - - puVar1 = (*(void * *)&D_8018921C); - uVar2 = func_800D2CA8(D_80078E7F, 0x18); - uVar3 = func_800D2CA8(D_80078E7E, 0xc); - uVar4 = func_800D2CA8(D_80078E7D, 0); - func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); -} - - - - -// @class: plumbing -// @stuck: none — MATCH (128/128 ins, match_one confirmed) - -extern short D_80115128; -extern u8 D_8018922C; -extern char *D_8018924C; -extern char *D_80189250; -extern char *D_80189254; -extern char *D_80189258; -extern char *D_8018925C; - -extern int func_80029FE4(void); -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); -extern char *func_8002AAB4(void); -extern char *strcpy(char *, const char *); -extern int func_8002A26C(void); -extern int func_8002A2B0(void); -extern int func_8002A4B8(void); -extern s32 func_8002A4FC(s32 a0); -extern int func_8002A998(void); -extern int func_8002A9DC(void); -extern int func_8002A728(void); -extern int func_8002A76C(void); -extern int func_80029FD4(void); - -void func_80140F00(void) { - char *p; - int r; - - if (D_80115128 == 0) { - p = (*(char * *)&D_8018922C); - r = func_800D2CA8(func_80029FE4() + 1, 0x18); - func_800D2D10(r, 2, p + 4, 1); - strcpy(p + 0xA, func_8002AAB4()); - - p = D_8018924C; - r = func_800D2CA8(func_8002A26C() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A2B0(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80189250; - r = func_800D2CA8(func_8002A4B8() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80189254; - r = func_800D2CA8(func_8002A998() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A9DC(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_80189258; - r = func_800D2CA8(func_8002A728() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A76C(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_8018925C; - r = func_800D2CA8(func_80029FD4(), 4); - func_800D2D10(r, 7, p + 0x18, -1); - } -} - - - -// @class: other -// @stuck: none — MATCH - -extern short D_80115128; -extern unsigned short D_80115172; -extern unsigned short D_801890E6; -extern unsigned short D_801890EA; -extern unsigned short D_801890EE; -extern unsigned short D_801890F2; - -extern s32 func_8002A1B4(void); -extern short func_8002A28C(void); -extern short func_8002A27C(void); -extern s32 func_8002A400(void); -extern short func_8002A4D8(void); -extern short func_8002A4C8(void); -extern s32 func_8002A8E0(void); -extern short func_8002A9B8(void); -extern short func_8002A9A8(void); -extern s32 func_8002A670(void); -extern short func_8002A748(void); -extern short func_8002A738(void); -extern int func_801412A8(int, int, int, int, int, int); - -int func_80141100(int param_1) -{ - short sVar1; - int iVar7; - - if (D_80115128 == 0) { - iVar7 = D_80115172 + 0x31; - sVar1 = D_801890E6; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); - sVar1 = D_801890EA; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); - sVar1 = D_801890EE; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); - sVar1 = D_801890F2; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); - } - return param_1; -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801412A8); - -DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ - -DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ - -DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ - - -extern unsigned short D_80115112; -extern void (*D_8018967C[])(void); - -void func_80141788(void) -{ - D_8018967C[D_80115112](); -} - - -DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ - -DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80141874); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801418F8); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80141A60); - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80141B90); - -DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) - -extern u16 D_80115110; -extern u8 D_801895DC; -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80141C0C(s32 param_1) -{ - func_8002D4C8(*(u16 *)(&D_801895DC + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); -} - - -DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ - -DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ - -DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ - -DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_801424E4); - - -extern void (*D_801896BC[])(void); - -void func_801425CC(void *a0) { - D_801896BC[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: schedule -// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail - -extern void func_8012C1B8(void); -extern s32 func_8012C1DC(s32 a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012CAE4(void *a0); -extern s32 func_8012AD50(void *a0); -extern s32 D_801896A0; - -void func_80142608(s32 param_1) -{ - register s32 iVar1 __asm__("$16"); - - if (*(short *)(param_1 + 0x70) != 0) { - iVar1 = ((s32 (*)(void))func_8012C1B8)(); - } else { - iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); - } - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CA1C(iVar1, (s32)&D_801896A0); - *(short *)(iVar1 + 0x1a) = 0x200; - *(short *)(iVar1 + 0x18) = 0x200; - *(short *)(param_1 + 0xfc) = 0x40; - if (*(short *)(param_1 + 0x70) != 0) { - goto ad50; - } - if (*(s32 *)(param_1 + 100) != 0) { - *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); - goto ad50; - } - } - ((void (*)(s32))func_8012CAE4)(param_1); - return; -ad50: - *(short *)(param_1 + 0x98) = 0; - *(s32 *)(param_1 + 0x90) = 0; - ((void (*)(s32))func_8012AD50)(param_1); -} - - -DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ - -DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ - -DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ - -DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ - -DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801896D0[])(); - -void func_801427EC(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801896D0[*(u16 *)(param_1 + 2)](); - } -} - - -DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ - -DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801896EC[])(); - -void func_8014292C(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801896EC[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801898BC[])(); - -void func_80142978(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801898BC[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80189974[])(); - -void func_801429C4(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80189974[*(u16 *)(param_1 + 2)](); - } -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80142A10); - - -// @class: struct -// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) - -extern u16 D_800B99D8; -extern struct packed_word D_801ACB00; -extern u8 D_801AD438; -extern u8 D_801AD439; -extern u8 D_801AD43A; - -void func_80142A80(void) -{ - u16 flags; - union word_bytes local; - s32 mul; - - flags = D_800B99D8; - local.pw = D_801ACB00; - - if (flags & 0x10) { - mul = (s8)((flags & 0xf) >> 1) + 9; - } else { - mul = 0x10 - (s8)((flags & 0xf) >> 1); - } - - D_801AD438 = mul * (local.b[0] >> 4); - D_801AD439 = mul * (local.b[1] >> 4); - D_801AD43A = mul * (local.b[2] >> 4); -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80142B2C); - -DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ - -DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ - -DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ - -DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ - -DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ - -DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern int D_801896C4; - -void func_80142DC4(int param_1) -{ - int v0; - - *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_801896C4); - *(short *)(v0 + 0x1a) = 0x1800; - *(short *)(v0 + 0x18) = 0x1800; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_801896E0[]; - -void func_80142E38(int param_1) -{ - short sVar1; - int iVar2; - - *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_801896E0); - sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; - *(short *)(iVar2 + 0x1a) = sVar1; - *(short *)(iVar2 + 0x18) = sVar1; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80142EC0); - -DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ - -DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result -// survives across func_8001CA1C while $v0 serves the pre-call store/test; -// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_801898CC[]; -extern unsigned char D_8018992C[]; - -void func_8014305C(int param_1) -{ - register int s0_param __asm__("$16") = param_1; - register int s1_copy __asm__("$17"); - int iVar2; - short sVar1; - - iVar2 = ((int (*)(void))func_8012C1B8)(); - *(int *)(s0_param + 0x20) = iVar2; - s1_copy = iVar2; - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(s0_param); - } else { - ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_801898CC); - sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; - *(short *)(s1_copy + 0x1a) = sVar1; - *(short *)(s1_copy + 0x18) = sVar1; - *(short *)(s0_param + 0xfc) = 0; - func_8012A828(s0_param, D_8018992C); - ((void (*)(int))func_80142B2C)(s0_param); - } -} - - -DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ - -DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) - - -extern void *memcpy(void *, const void *, u32); - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern int func_8001CA88(int, void *); -extern s32 func_8012E504(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80142B2C(void *arg0); - -extern u8 D_801ACAFC; -extern u8 D_801AD438; -extern u8 D_801AD43C; - -void func_801431E8(s32 param_1) { - u8 buf[8]; - s32 iVar5; - u16 uVar2; - s16 sVar4; - - register s32 d __asm__("$16"); - memcpy(buf, &D_801ACAFC, 4); - iVar5 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = iVar5; - d = iVar5; - if (iVar5 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, void *))func_8001CA88)(d, &D_801AD438); - uVar2 = *(u16 *)(param_1 + 0x70); - *(s16 *)(d + 0x76) = -0x10; - sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; - *(s16 *)(d + 0x1a) = sVar4; - *(s16 *)(d + 0x18) = sVar4; - *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; - if (func_8012E504(param_1, 0x33) == 0) { - *(s16 *)(param_1 + 0xfc) = 1; - func_800233CC(&D_801AD438, 0x10); - memcpy(&D_801AD43C, buf, 4); - } else { - *(s16 *)(param_1 + 0xfc) = 0; - } - ((void (*)(s32))func_80142B2C)(param_1); - } -} - - -DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ - -DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ - -DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) - -extern u8 D_800D387C[]; -extern u32 D_80189A84[]; - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80143458(s32 param_1) -{ - s32 p; - u16 v; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - p = *(s32 *)(param_1 + 0x20); - if (*(s32 *)(p + 4) == 0) { - *(s32 *)(p + 4) = 0x50000000; - } - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - v = *(u16 *)(param_1 + 0x34) & 0x7fff; - if (v != 0) { - p = *(s32 *)(param_1 + 0x20); - *(u16 *)(p + 0x1a) = v; - *(u16 *)(p + 0x18) = v; - } - - func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, - D_80189A84[*(u16 *)(param_1 + 0x34) & 3]); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - -DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_8014358C); - -DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ - -DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ - -DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ - -DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ - -DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ - -DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ - - -extern void (*D_80189BAC[])(void); - -void func_80143B30(void *a0) { - D_80189BAC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ - -DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ - - -extern void (*D_80189BB8[])(void); - -void func_80143C38(void *a0) { - D_80189BB8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ - - -extern void (*D_80189BC0[])(void); - -void func_80143C98(void *a0) { - D_80189BC0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80143D28); - - -extern void (*D_80189C08[])(void); - -void func_80143E68(void *a0) { - D_80189C08[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ - -DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ - -DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ - -DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ - - -extern void (*D_80189C1C[])(void); - -void func_80144054(void *a0) { - D_80189C1C[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80144090); - -extern void func_8012C218(void *a0); - -// @class: struct -// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) - -extern void (*D_80189C24[])(); - -void func_801442F8(int param_1) -{ - int iVar1; - - D_80189C24[*(u16 *)(param_1 + 2)](); - iVar1 = *(int *)(param_1 + 0x1c) + 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (0x1d < iVar1) { - func_8012C218(param_1); - } -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); -extern u8 D_80189BA0; - -void func_80144364(int param_1) { - int iVar3; - u16 uVar2; - s16 sVar1; - - iVar3 = ((s32 (*)(void))func_8012C194)(); - if (iVar3 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); - *(int *)(param_1 + 0xCC) = iVar3; - *(u16 *)(param_1 + 0xFC) = uVar2; - func_8001CB6C((u8 *)iVar3, (s32)&D_80189BA0, 0x250, 0x1A0); - *(s32 *)(iVar3 + 4) = 0x60000000; - *(u8 *)(iVar3 + 0x27) = 0x14; - *(u16 *)(iVar3 + 0x10) = 0x400; - *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); - *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); - *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); - sVar1 = *(s16 *)(param_1 + 0x70); - if (sVar1 != 0) { - *(s16 *)(iVar3 + 0x1A) = sVar1; - *(s16 *)(iVar3 + 0x18) = sVar1; - } else { - *(u16 *)(iVar3 + 0x1A) = 0x2000; - *(u16 *)(iVar3 + 0x18) = 0x2000; - } - *(u16 *)(param_1 + 2) = 1; - } -} - - - - -extern void func_80016714(void *a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_8012AD80(s32 a0); -extern void func_8012C218(void *a0); -extern s32 D_80189BB4; - -void func_80144458(void *arg0) { - s32 temp_s0; - void *temp_s2; - void *temp_v0; - - temp_s2 = M2C_FIELD(arg0, void **, 0xCC); - if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { - temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); - if (temp_v0 != NULL) { - temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; - M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80189BB4 * 0x10); - M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80189BB4 * 0x10); - func_8012AD80(arg0); - } - } - M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); - M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); - M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); - if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { - func_80016714(temp_s2, 0x38); - func_8012C218(arg0); - } -} - - -DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ - -DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ - -DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern u8 D_80189BC8; -extern u8 D_80189BD4; - -void func_8014477C(void *param_1) { - s32 v0; - s32 v1; - register s32 uVar2 __asm__("$2"); - register s32 addr __asm__("$3"); - s32 gv; - s32 fv; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)((s32)param_1 + 0x20) = v0; - if (v0 == 0) { - func_8012CAE4(param_1); - return; - } - ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80189BC8); - if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { - *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); - uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); - if (uVar2 != 0) { - addr = uVar2 & 0xFFFFFFF; - gv = *(u16 *)((addr | 0x80000000) + 8); - fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; - *(u16 *)((s32)param_1 + 0xA) = gv + fv; - } else { - *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; - } - } - ((void (*)(void *, void *))func_8012A828)(param_1, &D_80189BD4); - v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; - *(s16 *)((s32)param_1 + 0x2) = 1; - *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; - *(s32 *)((s32)param_1 + 0x1C) = 0x78; -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); - -extern u8 D_80189BA0; -extern u8 D_80189C10; - -void func_80144880(s32 param_1) -{ - register s32 obj __asm__("$16"); /* $s0 */ - register s32 self __asm__("$17") = param_1; /* $s1 */ - register s32 b __asm__("$2"); /* $v0 */ - s32 e; - - obj = ((s32 (*)(void))func_8012C194)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(self); - } else { - *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); - *(s32 *)(self + 0xCC) = obj; - if (*(s16 *)(self + 0x70) == 1) { - func_8001CB6C((u8 *)obj, (s32)&D_80189BA0, 0x250, 0x1A0); - b = 0x14; - } else { - func_8001CB6C((u8 *)obj, (s32)&D_80189C10, 0x300, 0x1D0); - b = 0x6A; - } - *(u8 *)(obj + 0x27) = (u8)b; - *(s32 *)(obj + 4) = 0x60000000; - *(u16 *)(obj + 0x10) = 0x400; - *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); - *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); - e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); - *(u16 *)(obj + 0x1A) = 0x4000; - *(u16 *)(obj + 0x18) = 0x4000; - *(u16 *)(obj + 0xC) = (u16)e; - *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; - } -} - - -DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ - - -extern void (*D_80189C2C[])(void); - -void func_801449C8(void *a0) { - D_80189C2C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ - - -extern void (*D_80189C34[])(void); - -void func_80144A2C(void *a0) { - D_80189C34[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ - -DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ - -DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ - -DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000", func_80144B14); diff --git a/src/ov_SC06_000/ov_SC06_000_jr_8012ACE0.c b/src/ov_SC06_000/ov_SC06_000_jr_8012ACE0.c new file mode 100644 index 000000000..a9cddb920 --- /dev/null +++ b/src/ov_SC06_000/ov_SC06_000_jr_8012ACE0.c @@ -0,0 +1,2829 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AC170; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80188520[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801AD2EC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B20E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AC170; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018825C)(); +extern s16 (*D_80188260)(); +extern M2C_UNK (*D_80188268)(); +extern s32 (*D_8018826C)(); +extern s32 D_801AD2E8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AC174; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801885B4; +extern void func_8012ACA0(void *arg0); +/* ==== end §8b carried decl layer ==== */ + + + + +// @class: iv-combine +// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ + +s32 func_8012ACE0(void *o) { + int i; + for (i = 0; ; i++) { + switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { + case -2: + case -1: + case 0: + return i; + case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ + default: + break; + } + } +} + +DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ + +DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ + + + +void func_8012AD64(s32 *a0, s16 a1) { + *(s16*)((s32)a0 + 0x34) = a1; +} + + +DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ + +DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ + +DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ + +DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ + +DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ + +DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ + +DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ + +DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ + +DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ + +DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ + +DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ + +DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ + +DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ + +DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ + +DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ + +DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ + +DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012B4B8); + +DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ + +DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ + +DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ + +DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012B77C); + +DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ + +DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ + +DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ + +DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ + +DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ + +DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ + +DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ + +DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ + +DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ + +DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ + +DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ + +DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ + +DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ + +DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ + + +void func_8012BF4C(s32 *a0, s32 a1) { + *(s32*)((s32)a0 + 0x1C) = a1; +} + + +DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ + +DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ + +DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ + +DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ + +DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012C098); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012C0EC); + +DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ + +DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ + +DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ + +DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ + +DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ + +DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ + +DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ + +DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ + +DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ + +DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ + +DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012C658); + +DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012C750); + +DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to +// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS +// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via +// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store +// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. +// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). + +extern s32 D_8018BA98; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern void func_80016714(void *a0, s32 a1); + +s32 func_8012C890(s32 a0, s32 a1, s32 a2) { + u8 *src = (u8 *)a0; + u8 *dst = (u8 *)a1; + u16 *d; + s16 count; + u16 v2, v4; + s32 v10; + void *obj; + + *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); + v2 = *(u16 *)(src + 0x0); + *(u16 *)(dst + 0x6) = v2; + *(u16 *)(dst + 0x88) = v2; + v2 = *(u16 *)(src + 0x2); + *(u16 *)(dst + 0xA) = v2; + *(u16 *)(dst + 0x8A) = v2; + v4 = *(u16 *)(src + 0x4); + *(u16 *)(dst + 0xC) = 0; + *(u16 *)(dst + 0x8) = 0; + *(u16 *)(dst + 0x4) = 0; + *(u16 *)(dst + 0xE) = v4; + *(u16 *)(dst + 0x8C) = v4; + *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); + *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; + *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); + v10 = *(s32 *)(src + 0x10); + *(s32 *)(dst + 0x78) = (s32)&D_8018BA98; + *(s32 *)(dst + 0xDC) = v10; + + { + register u16 *pc __asm__("$3"); + pc = &(*(u16 *)&D_801270C4); + *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; + count = *(volatile u16 *)pc + 1; + *pc = count; + if (count == 0) { + *pc = 1; + } + } + + if (a2 != 0) { + *(s32 *)(dst + 0x64) = a2; + *(s32 *)(dst + 0x68) = 0; + } else { + *(s32 *)(dst + 0x64) = 0; + *(s32 *)(dst + 0x68) = (s32)src; + } + + *(u16 *)(src + 0xA) |= 0x8000; + *(u16 *)(dst + 0x2) = 0; + d = D_801274E4; + *d &= 0xFFFE; + (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); + + if (*d & 1) { + s32 a1v; + obj = *(void **)(dst + 0x20); + if (obj != 0) { + s32 t = *(u16 *)obj; + if (t != 1) { + if (t != 2) { + goto done; + } + a1v = 0x38; + } else { + a1v = 0x84; + } + func_80016714(obj, a1v); + done:; + } + func_80016714(dst, 0x10C); + *(u16 *)(src + 0xA) &= 0x7FFF; + return 0; + } + + if (*(s32 *)(dst + 0x64) == 0) { + void *o = *(void **)(dst + 0x20); + if (o == 0) { + return (s32)dst; + } + if (*(u16 *)o == 1) { + s16 c = *(s16 *)(src + 0xC); + if (c != 0x7FFF) { + *(s16 *)((u8 *)o + 0x12) = c; + } + } + } + if (*(s32 *)(dst + 0x20) != 0) { + *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); + } + return (s32)dst; +} + + +DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ + +DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ + +DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ + +DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ + +DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ + +DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ + +DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ + +DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012CC88); + +DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ + +DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ + +DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ + +DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ + +DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ + +DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ + +DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ + +DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ + +DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ + +DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ + +DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH + + +struct S8012D664_8012D664 { short a, b, c; }; + +int func_8012D664(int arg0, int arg1, int arg2) { + extern int func_8012F568(); + extern int D_801885C4; + + struct S8012D664_8012D664 s; + int ret; + int t; + + s.a = (*(unsigned short*)&D_80126B5E); + s.b = (*(unsigned short*)&D_80126B62) - 0x40; + s.c = (*(unsigned short*)&D_80126B66); + ret = ((int(*)())func_800132BC)(arg0, &s); + t = arg1 + 0x20; + if (ret < t * t) { + func_8012F568(1, 1, 0, arg2, arg0, &D_801885C4); + return 1; + } + return 0; +} + + + +DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ + + + +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801885CC; +extern M2C_UNK D_801885D4; + +s32 func_8012DB84(void) +{ + func_8014C978(); + func_8012F568(1, 0xC001, 0, 0x3E8, &D_801885CC, &D_801885D4); +} + + +DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH + + +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; + + +s32 func_8012DDA4() +{ + extern Entry_8012DDA4 * D_801AD30C; + extern Entry_8012DDA4 * D_801AD308; + + Entry_8012DDA4 *p; + Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); + + while (D_801AD30C != end) { + p = D_801AD30C; + if (p->active != 0 && p != D_801AD308) { + D_801AD30C = p + 1; + return p; + } + D_801AD30C++; + } + D_801AD30C = 0; + return 0; +} + + + +// @class: plumbing +// @stuck: none — MATCH (35/35 ins, relocation-masked) + + +s32 func_8012DE2C(s32 a0) { + extern u8 * D_801AD30C; + extern u8 * D_801AD308; + + u8 *base; + u8 *end; + u8 *p; + + base = D_801202A0; + end = base + 0x6480; + D_801AD30C = base; + D_801AD308 = ((u8 *)a0); + + while (D_801AD30C != end) { + p = D_801AD30C; + if (*(u16 *)p != 0 && p != ((u8 *)a0)) { + D_801AD30C = p + 0x10C; + return p; + } + D_801AD30C += 0x10C; + } + D_801AD30C = 0; + return 0; +} + + + +DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ + +DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ + +DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ + +DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ + +DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012E014); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012E138); + + +s32 func_8012E27C(void) { + return 1; +} + + +DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ + +DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ + +DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012E364); + +DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ + +DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ + +DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ + +DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ + +DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH +extern u8 D_800AF648; +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) +{ + struct { short xy[2]; int sp14; int flag; } f; + register void *p __asm__("$4"); + p = &D_800AF648; + func_8004914C(p); + func_800491AC(&D_800AF648); + RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); + if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { + func_8002D4C8(param_2, param_3); + } +} + + +DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012E778); + +DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ + +DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ + +DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ + +DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ + + + +// @class: other +// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) + +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801885DC; + +void func_8012E9C0(int param_1) +{ + int iVar1; + + if (*(short *)(param_1 + 0x60) != 0) { + if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { + *(short *)(param_1 + 0x82) = 0; + *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); + *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); + *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); + } + if (*(int *)(param_1 + 0x78) != 0) { + iVar1 = *(short *)(param_1 + 0x60) * + *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; + if (iVar1 < 1) { + iVar1 = 1; + } + } else { + iVar1 = *(short *)(param_1 + 0x60); + } + func_8016AA50(param_1, iVar1); + if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { + func_8016B428(param_1); + func_80019064(&D_801885DC); + } + } + return; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012EA90); + +DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ + +DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ + +DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ + +DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012EFB8); + + +// @class: other +// @stuck: none — MATCH (33 ins, match_one verified) + +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); + +void func_8012F038(int param_1, short *param_2, short *param_3) { + int in[3]; + int out[3]; + + in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); + in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); + in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); + ApplyTransposeMatrixLV((void *)param_1, in, out); + param_3[0] = out[0]; + param_3[1] = out[1]; + param_3[2] = out[2]; +} + + +DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(s32 a0, s32 a1, void *a2); + +void func_8012F14C(s32 a0, s32 a1, s32 a2) +{ + s32 buf[2]; + func_8004914C((void *)a0); + func_800491AC((void *)a0); + RotTransSV(a1, a2, buf); +} + + +DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ + +DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012F274); + +DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ + +DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012F40C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_8012F49C); + +DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ + +DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ + +DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ + +DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ + +DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801885F8[]; + +void func_8012F828(int param_1) +{ + *(unsigned char *)(param_1 + 0xC1) = 4; + if (*(unsigned int *)(param_1 + 0xB4) & 8) { + func_80131170(param_1, D_801885F8, 0xB); + } + func_80131CA8(param_1, 9); +} + + +DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ + + +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern void func_80131CA8(int a0, int a1); +extern u8 D_80188604[]; + +void func_8012F8C8(u8* arg0) { + *(u8*)(arg0 + 0xC1) = 7; + if (*(u32*)(arg0 + 0xB4) & 0x80) { + ((void (*)(void*, void*, s32))func_80131170)(arg0, D_80188604, 0xB); + } + ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); +} + + +DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ + +DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ + +DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ + +DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ + +DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. +// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for +// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be +// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an +// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). +// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: +// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. +// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which +// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because +// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. +// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out +// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, +// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what +// blocks reorg from sharing a downstream constant into a branch delay slot.) + + +s32 func_8012FCC4(s32 param_1) { + extern int D_80188610; + + int v1 = *(int *)(((int)param_1) + 0xC4); + *(char *)(((int)param_1) + 0xC1) = 8; + if (v1 & 2) { + *(char *)(((int)param_1) + 0xC1) = 1; + func_80131CA8(((int)param_1), 3); + return; + } + if (v1 & 1) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 1); + return; + } + if (*(int *)(((int)param_1) + 0xB4) & 0x100) { + ((void (*)(int))func_80131B14)(((int)param_1)); + if (*(short *)(((int)param_1) + 0x76) <= 0) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); + return; + } + if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { + *(char *)(((int)param_1) + 0xC2) = 0; + } else { + *(short *)(((int)param_1) + 0x98) = 0; + *(char *)(((int)param_1) + 0xC2) = 1; + } + ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_80188610); + *(int *)(((int)param_1) + 0x1C) = 0; + func_80131CA8(((int)param_1), 0x1C); + return; + } + func_80131CA8(((int)param_1), 0x1C); +} + + + +DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ + +DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ + +DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ + +DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ + +DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ + +DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ + +DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ + +DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ + +DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ + +DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ + +DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ + +DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ + +DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ + +DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ + +DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ + +DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ + +DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80130650); + +DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ + +DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ + +DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ + +DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ + +DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ + +DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80130A18); + +DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ + +DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80130C08); + + +extern void (*D_80188618[])(void); + +void func_80130D0C(void *a0) { + D_80188618[*(u8 *)((s32)a0 + 0xC1)](); +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80188668[]; +extern s16 D_80188698[]; +extern s16 D_801886F8[]; +extern s16 D_80188700[]; +extern s16 D_80188720[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188698; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_801886F8; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188700; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80188720; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80188668; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + + +// @class: loop-guard +// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps +// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` +// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); +// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's +// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC +// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). + + +void func_80131170(s32 p, s32 b, s32 c) { + extern u8 D_801885EC[]; + + func_80131B14(); + *(u8 *)(((u8 *)p) + 0xC2) = 0; + *(u8 *)(((u8 *)p) + 0xC3) = 0; + *(s16 *)(((u8 *)p) + 0x98) = 0; + if (((u8 *)b) == 0) { + ((u8 *)b) = D_801885EC; + } + func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); + *(s32 *)(((u8 *)p) + 0x1C) = 0; + if (c != 0) { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } else { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } +tail: + if (*(s16 *)(((u8 *)p) + 0x76) > 0) { + return; + } + if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); + } else { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); + } +} + + + +// @class: struct +// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) + +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ + + +s32 func_801312D0(s32 param_1, void *param_2) +{ + extern int func_80131CF4(int, int); + extern M8_801312D0 D_80188740; + + int iVar5; + + iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); + if (iVar5 != 0) { + ((short *)param_2)[2] = 0; + ((short *)param_2)[0] = 0; + ((short *)param_2)[1] = (short)iVar5; + } else { + *(M8_801312D0 *)((short *)param_2) = D_80188740; + } +} + + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80131340); + +DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80131A34); + +DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` +// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be +// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a +// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). +// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; +// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the +// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); +// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. + +void func_80131B14() { + extern void func_8002A520(void *); + extern void func_8002A790(void *); + extern u8 D_80188748; + + register u8 *a0v __asm__("$4"); + u8 *p = a0v; + + + s32 e = *(u8 *)(p + 0x5E); + + if (*(s16 *)(p + 0x60) != 0) { + if (e == 0x1D) { + *(s16 *)(p + 0x82) = 0; + *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); + *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); + *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); + } + { + s32 dec; + s32 q = *(s32 *)(p + 0x78); + if (q != 0) { + dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; + if (dec <= 0) dec = 1; + } + *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; + } + ((void (*)(void *))func_8016AA50)(p); + if (*(u16 *)(p + 0x82) & 1) { + ((void (*)(void *))func_8016B428)(p); + ((void(*)(void *))func_80019064)(&D_80188748); + } + } + + *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; + + if (e != 0x1D) { + if (*(u8 *)(p + 0xC8)) func_8002A520(p); + if (*(u8 *)(p + 0xC9)) func_8002A790(p); + } + + if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; + + { + s32 r = *(s32 *)(p + 0x20); + *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; + { + s32 r2 = *(s32 *)(p + 0x20); + *(s16 *)(r2 + 0x14) = 0; + *(s16 *)(r2 + 0x10) = 0; + } + } + + ((void (*)(void *))func_8012B2CC)(p); + ((void (*)(void *))func_8012B23C)(p); +} + + + +DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80131CA8); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80131CF4); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80131D68); + + +extern void (*D_80188758[])(struct S80131E00 *a0); + +void func_80131E00(struct S80131E00 *a0, s32 a1) { + a0->field_B0 = a1; + D_80188758[a1](a0); +} + + +DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ + +DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ + +DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ + + +extern void (*D_801887B0[])(void); + +void func_80131EEC(void *a0) { + D_801887B0[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_801887F8[])(void); + +void func_80131F28(void *a0) { + D_801887F8[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80188800[])(void); + +void func_80131F64(void *a0) { + D_80188800[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80188808[])(void); + +void func_80131FA0(void *a0) { + D_80188808[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80188810[])(void); + +void func_80131FDC(void *a0) { + D_80188810[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80132018); + +DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_801887B8; + +void func_801320D8(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_801887B8; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +s32 func_80132144(s32 param_1) +{ + extern int D_801887C8; + + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(((int)param_1) + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(((int)param_1)); + } else { + ((void(*)(int, int))func_8001C214)(v0, 0); + *(int *)(((int)param_1) + 0x58) = (int)&D_801887C8; + *(short *)(((int)param_1) + 0x5c) = 0x80; + *(unsigned short *)(((int)param_1) + 2) += 1; + } +} + + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_801887D8; + +void func_801321B0(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_801887D8; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_801887E8; + +void func_8013221C(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_801887E8; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + +DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ + +DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_801325B8); + +DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ + +DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ + +DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ + +DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ + +DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ + +DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80132F40); + +DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_801330E0); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80133298); + +DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ + +DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH + +extern s32 D_801AD358; +extern s32 D_801AD35C[]; +extern int D_801AD360; +extern void func_80136BC4(s32 a0); + +void func_801336E8(void *a0, int a1, int a2) { + if (a0 != 0) { + (*(void * *)&D_801AD358) = a0; + ((void (*)(void))func_80136BC4)(); + } + (*(int *)&D_801AD35C) = a1; + D_801AD360 = a2; +} + + + + +extern s32 D_801AD35C[]; +extern s32 D_801AD358; +extern void func_80136BC4(s32); + +void func_8013373C(s16 arg0) { + s32 temp = D_801AD35C[arg0]; + if (temp != 0) { + D_801AD358 = temp; + func_80136BC4(temp); + } +} + + +// @class: regalloc-order +#include "common.h" + +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; + + +s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { + extern s32 func_80047D3C(s32); + extern s32 func_80133AB0(s16, s16, s16, s32); + extern Box_80133784 * D_80188818; + extern Box_80133784 * D_8018881C; + extern s16 D_801AD364; + extern u16 D_801AD368; + + register s32 s1 __asm__("$17"); + s32 s2; + register s16 s3 __asm__("$19"); + register s32 s4 __asm__("$20"); + register s16 a0v __asm__("$4"); + register s16 arg0s __asm__("$21"); + s32 dx, dy, dz; + s32 r, ret; + + a0v = ((s16)arg0); + s1 = 0; + s3 = 0; + s4 = 0; + s2 = 0; + arg0s = a0v; + D_80188818->f6 = -0x7FFF; + D_8018881C->f6 = 0x7FFF; + D_80188818->f0 = ((Box_80133784 *)arg1)->f0; + D_80188818->f4 = ((Box_80133784 *)arg1)->f4; + D_8018881C->f0 = ((Box_80133784 *)arg2)->f0; + D_8018881C->f4 = ((Box_80133784 *)arg2)->f4; + D_801AD368 = 0; + D_801AD364 = 0; + + if ((s16)a0v == 0) { + s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; + s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; + s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; + if (sx == 0 && sy == 0) { + s32 zt = (sz == 0); + __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); + } + D_80188818->f2 = ((Box_80133784 *)arg1)->f2 - 4; + r = func_80047D3C(sx * sx + sz * sz); + if (r < 3) { + r = 4; + } else if (r < 5) { + r += 1; + } + D_8018881C->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; + } else { + D_80188818->f2 = ((Box_80133784 *)arg1)->f2; + if ((s16)a0v == 2) { + D_8018881C->f0 = D_80188818->f0; + D_8018881C->f2 = D_80188818->f2 + 6; + s2 = 1; + D_8018881C->f4 = D_80188818->f4; + } else { + D_8018881C->f2 = ((Box_80133784 *)arg2)->f2; + } + } + + while (1) { + s32 ret0; + register s32 retc __asm__("$3"); + __asm__ __volatile__(""); + ret0 = func_80133AB0(arg0s, (s16)D_80188818->f0, (s16)D_80188818->f4, (*(s32*)&D_801AD358)); + __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); + ret = retc; + if (ret == 0) goto after; + s4 |= ret; + if (s2 != 0) goto after; + { + s16 oldc = s3; + s3 = s3 + 1; + if (oldc >= 5) break; + } + } + + D_8018881C->f0 = D_80188818->f0; + D_8018881C->f2 = D_80188818->f2; + s1 = 0x2000; + D_8018881C->f4 = D_80188818->f4; + goto store_out; + +after: + if ((s16)s4 != 0 || D_801AD364 != 0) { + s16 t; + __asm__ __volatile__("" :: "r"(s4)); + t = D_80188818->f6; + if (t >= -0xBCB) { + if (t < -0x578) { + s1 |= 0x4000; + } else { + s1 |= 0x8000; + } + } + if ((s16)D_8018881C->f6 < -0xBCB) { + s1 |= 0x2000; + } + store_out: + ((Box_80133784 *)arg2)->f0 = D_8018881C->f0; + ((Box_80133784 *)arg2)->f2 = D_8018881C->f2; + ((Box_80133784 *)arg2)->f4 = D_8018881C->f4; + ((Box_80133784 *)arg2)->f6 = D_801AD368; + return s1 & 0xFFFF; + } + ((Box_80133784 *)arg2)->f6 = D_801AD368; + return 0; +} + + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80133AB0); + + +s32 func_80133CD4(arg0, cmd, base, arr) + s16 arg0; + s16 *cmd; + s16 *base; + s32 *arr; +{ + typedef struct { s16 e[4]; } ElemK; + + extern u16 *D_8018881C; + extern u16 *D_80188818; + extern s16 *D_80188824; + extern s16 *D_80188820; + extern s32 *D_8018882C; + extern s32 *D_80188830; + extern u16 D_801AD368; + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern u16 D_801152AE; + extern u8 D_801152B0; + extern s32 func_80134310(); + extern s32 func_8013435C(); + + s16 *s3 = ((ElemK *)base)[cmd[1]].e; + s32 s6 = arr[cmd[2]]; + s32 s0var, s1var; + s32 s2a; + s16 y; + + if (func_80134310(s3, D_8018881C, s6) >= 0) + return 0; + + s1var = func_80134310(s3, D_80188818, s6); + if (s1var < 0) + return 0; + + s0var = func_80134310(s3, D_80188824, 0); + { + u16 *pac = D_80188818; + s16 *pb8 = D_80188824; + s16 *pb4 = D_80188820; + s32 neg = -s1var; + pb4[0] = pac[0] + neg * pb8[0] / s0var; + pb4[1] = pac[1] + neg * pb8[1] / s0var; + pb4[2] = pac[2] + neg * pb8[2] / s0var; + if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) + return 0; + } + if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80188820, arr[cmd[6]], s3)) + return 0; + if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80188820, arr[cmd[8]], s3)) + return 0; + if (arg0 < 0) { + if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80188820, arr[cmd[10]], s3)) + return 0; + } + if (arg0 & 0x10) { + if (*(u16 *)cmd & 0x100) + return 0; + } + if (*(u16 *)cmd & 0x200) { + D_801AD368 = *(u16 *)cmd; + return 0; + } + + { + s32 ret = func_80134310(s3, D_8018881C, s6); + s32 *pc0; + s32 *pc4; + u16 *pb0; + s32 t, o2; + s32 q3v; + + { + s32 *pw = D_8018882C; + ((struct { s32 w; } *)pw)->w = s3[0]; + pw[1] = s3[1]; + pw[2] = s3[2]; + } + s1var = -ret; + + __asm__ __volatile__( + "lwc2 $9, 0(%0)\n" + "lwc2 $10, 4(%0)\n" + "lwc2 $11, 8(%0)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : "r"(D_8018882C) : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"(D_80188830) : "memory"); + + pc0 = D_8018882C; + pc4 = D_80188830; + s0var = pc4[0] + pc4[1] + pc4[2]; + pb0 = D_8018881C; + pb0[0] += s1var * pc0[0] / s0var; + pb0[1] += s1var * pc0[1] / s0var; + q3v = s1var * pc0[2] / s0var; + + { + s32 h; + h = ((s16 *)pb0)[0]; + s1var = h << 16; + __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); + s0var = h << 16; + } + pb0[2] += q3v; + s2a = (s16)pb0[2] << 16; + + t = pc0[0] << 4; + pc0[0] = t; + if (t < 0) s1var |= 0xFFFF; + t = pc0[1] << 4; + pc0[1] = t; + if (t < 0) s0var |= 0xFFFF; + o2 = pc0[2]; + t = o2 << 4; + pc0[2] = t; + if (t < 0) s2a |= 0xFFFF; + s2a += o2 << 5; + s1var += pc0[0] << 1; + s0var += pc0[1] << 1; + + do { + s32 *pl = D_8018882C; + u16 *pb; + s1var += pl[0]; + s0var += pl[1]; + s2a += pl[2]; + pb = D_8018881C; + pb[0] = s1var >> 16; + pb[1] = s0var >> 16; + pb[2] = s2a >> 16; + ret = func_80134310(s3, pb, s6); + } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); + } + + y = s3[1]; + if (y >= -0xBCB) { + D_80188818[3] = y; + { + typedef struct { s8 c[8]; } Blk8; + *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; + } + if (*(u8 *)cmd != 0) + goto ret1; + return -1; + } + { + typedef struct { u16 h; } H16; + u16 *s3u = (u16 *)s3; + u16 *bp = D_8018881C; + u16 w; + ((H16 *)D_801152A8)->h = s3u[0]; + w = s3u[1]; + bp[3] = w; + ((H16 *)&D_801152AA)->h = w; + ((H16 *)&D_801152AC)->h = s3u[2]; + ((H16 *)&D_801152AE)->h = s3u[3]; + } +ret1: + return 1; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80134310); + +DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (83 ins, relocation-masked) + + + +s32 func_801343C4(s32 angle, s32 p1, s32 p2) +{ + extern int func_80133AB0(int, s16, s16, int); + extern s16 * D_80188818; + extern s16 * D_8018881C; + extern u16 D_801AD368; + extern u16 D_801AD364; + + s16 *pac; + s16 *pb0; + s16 *pacs, *pb0s; + u16 *pb0u; + int a1v, a2v, d94, b0; + int sangle = ((s16)angle); + + pac = D_80188818; + d94 = D_801AD358; + pb0 = D_8018881C; + pac[0] = ((u16 *)p1)[0]; + pac[1] = ((u16 *)p1)[1]; + pac[2] = ((u16 *)p1)[2]; + pb0[0] = ((u16 *)p2)[0]; + pb0[1] = ((u16 *)p2)[1]; + pb0[2] = ((u16 *)p2)[2]; + + a1v = pac[0]; a2v = pac[2]; + __asm__ __volatile__("" ::: "memory"); + D_801AD368 = 0; + D_801AD364 = 0; + if (func_80133AB0(sangle, a1v, a2v, d94)) { + setdst: + pb0u = (u16 *)D_8018881C; + ((u16 *)p2)[0] = pb0u[0]; + ((u16 *)p2)[1] = pb0u[1]; + ((u16 *)p2)[2] = pb0u[2]; + ((u16 *)p2)[3] = D_801AD368; + return 1; + } + + pacs = D_80188818; + pb0s = D_8018881C; + b0 = pb0s[0]; + if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && + (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { + return 0; + } + if (func_80133AB0(sangle, b0, pb0s[2], D_801AD358)) { + goto setdst; + } + return 0; +} + + + +// @class: schedule +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; + + +s32 func_80134510(s32 param) { + extern s32 func_801345F8(s32); + extern Foo_80134510_80134510 * D_80188818; + extern Foo_80134510_80134510 * D_8018881C; + extern Foo_80134510_80134510 * D_80188820; + extern u16 D_801AD368; + + + s32 ret = 0; + Foo_80134510_80134510 *b0 = D_8018881C; + Foo_80134510_80134510 *ac = D_80188818; + u16 t0 = ((Foo_80134510_80134510 *)param)->f0; + u16 t2, t4; + + ((Foo_80134510_80134510 *)param)->f6 = 0; + ac->f0 = t0; + b0->f0 = t0; + t2 = ((Foo_80134510_80134510 *)param)->f2; + ac->f2 = t2 - 4; + b0->f2 = t2 + 0x2FC; + t4 = ((Foo_80134510_80134510 *)param)->f4; + ac->f4 = t4; + b0->f4 = t4; + + if (func_801345F8((*(s32*)&D_801AD358)) != 0) { + s16 x; + ((Foo_80134510_80134510 *)param)->f2 = D_80188820->f2 - 2; + x = D_80188818->f6; + if (x >= -3019) { + if (x < -1400) { + ret = 0x4000; + } else { + ret = 0x8000; + } + } else { + ret = 0x2000; + } + D_80188818->f6 = D_801AD368; + } + return ret; +} + + + +// @class: regalloc-order +// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. + + +s32 func_801345F8(s32 arg) +{ + extern int func_801347A0(short, u16 *, int, int); + extern u16 * D_80188818; + extern u16 D_801AD368; + + register u16 *param_1 __asm__("$5") = ((u16 *)arg); + register u16 *cc __asm__("$4") = D_80188818; + int c8000 = 0x8000; + register int zr __asm__("$0"); + u32 c1, c2, uVar6, uVar2, cnt, v14; + u16 *ptmp, *puVar4, *puVar7, uVar1; + int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; + + c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; + uVar6 = c1 + zr; + if ((c1 & 0xffff) < (u32)param_1[2]) { + c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; + uVar2 = c2 + zr; + if ((c2 & 0xffff) < (u32)param_1[3]) + goto do_mult; + return 0; + found: + D_801AD368 = *puVar7; + return 1; + do_mult: + tbl = *(int *)(param_1 + 4); + uVar10 = *(int *)(param_1 + 6); + uVar3 = *(int *)(param_1 + 8); + iVar9 = *(int *)(param_1 + 0xc); + iVar8 = *(int *)(param_1 + 0xe); + ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); + cnt = (u32)ptmp[1]; + v14 = *(int *)(param_1 + 10); + puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; + while (((cnt-- + zr) & 0xffff) != 0) { + uVar1 = *puVar4; + hi = uVar1 & 0x8000; + harg = hi + zr; + if (hi == 0) + puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); + else + puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); + if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) + goto found; + puVar4 = puVar4 - 1; + } + } + return 0; +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. +#include "common.h" + +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; + +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; + +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; + + + +s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); + extern s16 * D_8018881C; + extern SVec_801347A0 * D_80188818; + extern SVec_801347A0 * D_80188820; + + Elem_801347A0 *pElem; + s32 val; + register s32 iv __asm__("$4"); + s32 q; + s32 dvsr; + + pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; + val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; + if (func_80134A28((s32)pElem, (s32)D_8018881C, val) >= 0) { + return 0; + } + iv = func_80134A28((s32)pElem, (s32)D_80188818, val); + if (iv < 0) { + return 0; + } + iv = -iv; + dvsr = pElem->f2 * 48; + q = (iv * 48) / dvsr; + D_80188820->f0 = D_80188818->f0; + D_80188820->f2 = D_80188818->f2 + q; + D_80188820->f4 = D_80188818->f4; + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { + return 0; + } + if ((s16)arg0) { + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80188820, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { + return 0; + } + } + if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { + return 0; + } + D_80188820->f0 = D_80188818->f0; + D_80188820->f4 = D_80188818->f4; + (*(Elem_801347A0*)D_801152A8) = *pElem; + D_80188818->f6 = pElem->f2; + return 1; +} + + + +DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80134A74); + +// @class: regalloc-order +// @try: variant B — direct pins m=$s5($21), c=$s6($22) + + +s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); + extern void * D_80188818; + extern void * D_8018881C; + extern void * D_80188820; + extern void * D_80188824; + extern u16 D_801AD368; + + s32 temp_a3; + s32 temp_s1; + s32 temp_v0; + s32 temp_v0_2; + s32 var_v0; + u16 temp_a1; + s32 temp_s4; + s32 c = arg0; + __asm__ __volatile__("" : "=r"(c) : "0"(c)); + __asm__ __volatile__("" : : "r"(arg0)); + + temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); + temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); + var_v0 = 0; + if (func_80134FB8(temp_s4, (s32) D_8018881C, temp_s1) >= 0) { + return var_v0; + } + temp_v0 = func_80134FB8(temp_s4, (s32) D_80188818, temp_s1); + if (temp_v0 < 0) { + goto block_13; + } + temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80188824, 0); + temp_a3 = -temp_v0; + { + u16 *pB4 = (u16 *)D_80188820; + u16 *pAC = (u16 *)D_80188818; + s16 *pB8 = (s16 *)D_80188824; + pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; + pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; + pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { + return var_v0; + } + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80188820, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { + return var_v0; + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80188820, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { + return var_v0; + } + if ((arg0 << 16) < 0) { + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80188820, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { + return var_v0; + } + } + if (c & 1) { + if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { + goto block_14; + } + return 0; + } + temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); + if (!(temp_a1 & 0x200)) { + goto block_14; + } + D_801AD368 = temp_a1; +block_13: + return 0; +block_14: + __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); + VectorNormalSS(D_80188824, D_80188824); + { + u16 *pB8 = (u16 *)D_80188824; + u16 *pB4b = (u16 *)D_80188820; + pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); + var_v0 = 1; + pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); + pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); + } + return var_v0; +} + + + +DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype D_8018881C + D_80188818 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + extern int func_80134A74(int, s16, s16, int); + extern s16 * D_8018881C; + extern s16 * D_80188818; + extern u8 D_80188824; + extern s16 *D_80188820; + extern u16 D_801AD368; + + register s16 *pb0 __asm__("$9"); /* D_8018881C -> $t1 */ + register s16 *pac __asm__("$6"); /* D_80188818 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_80188824 -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = D_8018881C; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = D_80188818; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80188824); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_801AD358; + __asm__ __volatile__("" ::: "memory"); + D_801AD368 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_80188820); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_801AD368; + return 1; + } + { + register u16 *qb __asm__("$4"); /* D_80188818 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* D_8018881C[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* D_8018881C -> $a2 (reloaded) */ + qb = (u16 *)D_80188818; + qa = (u16 *)D_8018881C; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801AD358)) + goto found; + return 0; + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (62 ins, relocation-masked) + + +extern u8 D_8018881C; +extern u8 D_80188818; +extern s16 *D_80188820; +extern u8 D_80188824; +extern int D_801AD358; +extern u16 D_801AD368; + +extern int func_80134A74(int, s16, s16, int); + +int func_80135168(u16 arg0, u16 *p1, u16 *p2) +{ + register s16 *pb0 __asm__("$8"); + register s16 *pac __asm__("$6"); + register s16 *pb8 __asm__("$7"); + u16 *pb4; + u16 a, b; + int a1v, a2v, d94; + + pb0 = (*(s16 * *)&D_8018881C); + __asm__ __volatile__("" : : "r"(pb0)); + + a = p2[0]; pac = (*(s16 * *)&D_80188818); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80188824); pac[0] = b; pb8[0] = a - b; + a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; + a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; + + a1v = pac[0]; a2v = pac[2]; d94 = D_801AD358; + __asm__ __volatile__("" ::: "memory"); + D_801AD368 = 0; + if (func_80134A74(arg0, a1v, a2v, d94)) { + pb4 = (*(u16 * *)&D_80188820); + p2[0] = pb4[0]; + p2[1] = pb4[1]; + p2[2] = pb4[2]; + p2[3] = D_801AD368; + return 1; + } + return 0; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80135260); + + +/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). + * + * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 + * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does + * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in + * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). + * + * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): + * the two output buffers D_80188818 / D_8018881C are written through a pointer in each of the two + * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a + * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also + * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each + * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks + * the lowest-free scratch over its OWN window: + * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) + * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) + * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail + * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. + * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades + * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the + * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. + * + * Zero file-scope footprint (block-scoped typedefs + externs; D_80188818/B0 read via the ambient + * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for + * family_sweep --edit-remap with no cc1 crash. + * + * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. + */ +s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) +{ + typedef struct { s32 vx, vy, vz, pad; } Vec32; + typedef struct { s16 vx, vy, vz, pad; } Vec16; + typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; + extern void func_80048EAC(void *m0, void *m1); + extern void func_8004914C(void *m); + extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); + extern void ApplyRotMatrixLV(void *in, void *out); + extern void ApplyRotMatrix(void *in, void *out); + extern s32 D_801AD36C, D_801AD370, D_801AD374, D_801AD378; + extern s16 D_801AD37C; + extern s32 D_801AD38C; + extern s16 D_801AD390, D_801AD392, D_801AD394, D_801AD396, D_801AD398, D_801AD39A; + + Vec32 in0, in1, rotout; + Mat32 mat2; + Vec16 vecin; + s32 result; + s32 mode; + s32 q1, q2; + s32 p; + s32 t18, t1A, t1C; + s32 *m; + + in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); + in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); + if ((param_2 & 0x10000000) == 0) { + if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { + return 0; + } + } + mode = param_2 & 0x60000000; + if (mode != 0) { + result = 1; + if (param_2 >= 0) { + mode &= 0x40000000; + } + in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); + in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); + switch (mode) { + case 0x60000000: + m = &D_801AD36C; + *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); + q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); + q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); + D_801AD370 = 0; + D_801AD378 = 0; + D_801AD374 = q1; + D_801AD37C = q2; + func_80048EAC((void *)((s32)param_1 + 0x34), m); + ApplyTransposeMatrixLV(m, &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + /* fallthrough */ + case 0x20000000: + p = (param_2 & 0xFFFFFFF) | 0x80000000; + t18 = *(s16 *)((s32)param_1 + 0x18); + t1A = *(s16 *)((s32)param_1 + 0x1A); + t1C = *(u16 *)((s32)param_1 + 0x1C); + mat2.w4 = 0; + mat2.wC = 0; + mat2.w0 = t18; + mat2.w8 = t1A; + mat2.h10 = t1C; + func_8004914C(&mat2); + vecin.vx = *(u16 *)(p + 4); + vecin.vy = *(u16 *)(p + 8); + vecin.vz = *(u16 *)(p + 0xC); + ApplyRotMatrix(&vecin, &rotout); + D_801AD390 = rotout.vx; + D_801AD394 = rotout.vy; + D_801AD398 = rotout.vz; + vecin.vx = *(u16 *)(p + 6); + vecin.vy = *(u16 *)(p + 0xA); + vecin.vz = *(u16 *)(p + 0xE); + ApplyRotMatrix(&vecin, &rotout); + D_801AD38C = 0; + D_801AD392 = rotout.vx; + D_801AD396 = rotout.vy; + D_801AD39A = rotout.vz; + result += 2; + break; + case 0x40000000: + ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + break; + } + { + s16 *p = *(s16 **)&D_80188818; + p[0] = in0.vx; + p[1] = in0.vy; + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_8018881C; + p[0] = in1.vx; + p[1] = in1.vy; + p[2] = in1.vz; + } + return result; + } + { + s16 *p = *(s16 **)&D_80188818; + p[0] = in0.vx; + p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_8018881C; + p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); + p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); + } + return 1; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80135888); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80135A4C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80135D20); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80135EB0); + + +s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + register s32 a1v __asm__("$11"); + register s32 a2v __asm__("$12"); + register s32 n __asm__("$5"); + register s16 *b4 __asm__("$7"); + s32 d; + s32 dx; + s32 denom; + s32 result; + s32 frame_pad[2]; + (void)&frame_pad; + __asm__("" : "=r"(a1v) : "0"(arg1)); + a2v = arg2; + + if (!(arg1 & 1)) { + dx = (s16) arg2 - (*(s16 **)&D_80188818)[2]; + d = dx; + denom = -(*(s16 **)&D_80188824)[2]; + } else { + denom = (*(s16 **)&D_80188824)[2]; + d = (*(s16 **)&D_80188818)[2] - (s16) arg2; + dx = -d; + } + n = -d; + { + register s16 *b8 __asm__("$6") = *(s16 **)&D_80188824; + u16 *ac = *(u16 **)&D_80188818; + b4 = D_80188820; + b4[0] = ac[0] + n * b8[0] / denom; + b4[1] = ac[1] + n * b8[1] / denom; + b4[2] = ac[2] + dx; + } + + if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; + if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; + if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; + if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; + if (a1v & 0x8000) { + u16 *b0 = *(u16 **)&D_8018881C; + b4[0] = b0[0]; + b4[1] = b0[1]; + } + D_801152AA = 0; + (*(s16 *)D_801152A8) = 0; + if (a1v & 1) { + D_80188820[2] = a2v + 2; + __asm__ __volatile__(""); + D_801152AC = 0xFFF; + } else { + D_801152AC = -0xFFF; + D_80188820[2] = a2v - 2; + } + __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); + (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; + D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; + result = 1; + D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; + return result; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_801365B8); + + +// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) +// D_80188818/B0/B8 are file-scope `extern u8`, D_80188820 is `extern s32 []`; each HOLDS a +// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. +// D_80188820 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the +// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar +// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the +// siblings read it once via *(u16**)&sym == direct lw either way). + +s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + + register u16 *ac __asm__("$4"); + register s16 *b8 __asm__("$6"); + register s16 *b4 __asm__("$9"); + register s32 r __asm__("$3"); + register s32 pos __asm__("$12"); + register s32 a1v __asm__("$5"); + s16 temp_v0; + s16 temp_v1; + s32 var_a3; + s16 var_v0_3; + s32 temp_a1; + s32 var_t0; + s32 var_v1; + s16 *b4b; + u16 *p; + + __asm__ ("" : "=r"(a1v) : "0"(arg1)); + pos = arg2; + if (!(a1v & 1)) { + var_t0 = (s16) arg2 - (*(s16 **)&D_80188818)[1]; + var_v1 = var_t0; + var_a3 = -(*(s16 **)&D_80188824)[1]; + } else { + var_a3 = (*(s16 **)&D_80188824)[1]; + var_v1 = (*(s16 **)&D_80188818)[1] - (s16) arg2; + var_t0 = -var_v1; + } + b8 = (*(s16 **)&D_80188824); + ac = (*(u16 **)&D_80188818); + b4 = D_80188820; + temp_a1 = -var_v1; + r = (temp_a1 * b8[0]) / var_a3; + b4[0] = ac[0] + r; + b4[1] = ac[1] + var_t0; + r = (temp_a1 * b8[2]) / var_a3; + temp_v0 = ac[2] + r; + b4[2] = temp_v0; + temp_v1 = b4[0]; + if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { + return 0; + } + if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { + return 0; + } + if (arg1 & 0x8000) { + p = (*(u16 **)&D_8018881C); + b4[0] = (s16) p[0]; + b4[2] = (s16) p[2]; + } + D_801152AC = 0; + (*(s16 *)D_801152A8) = 0; + if (arg1 & 1) { + b4b = D_80188820; + D_801152AA = 0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos + 2; + } else { + b4b = D_80188820; + D_801152AA = -0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos - 2; + } + b4b[1] = var_v0_3; + __asm__ __volatile__("" :: "r"(pos)); + (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); + D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); + D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); + return 1; +} + + +// @class: schedule +// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a +// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE +// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses +// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] +// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the +// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; +// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits +// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the +// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). + + +extern s16 *D_80188820; /* holds a pointer value (*(u16**)&D_80188820) */ + +s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { + extern void ApplyMatrixSV(void *m, void *v0, void *v1); + extern void ApplyRotMatrix(void *v0, void *v1); + extern u16 D_80126722; + extern s16 D_80126724; + extern s16 D_801152AA; + extern s16 D_801152AC; + + s32 out[4]; + u16 *pb4; + + if (a0) { + ApplyMatrixSV((void *)a3, *(void **)&D_80188820, *(void **)&D_80188820); + ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); + ApplyRotMatrix((void *)D_801152A8, (void *)out); + *(s16 *)D_801152A8 = out[0]; + D_801152AA = out[1]; + D_801152AC = out[2]; + } + + pb4 = *(u16 **)&D_80188820; + *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); + *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); + *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); + + *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); + D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); + D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); +} + + + +DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ + +DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ + +DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ + +DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ + +DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ + + +extern unsigned short D_800B99F0; +extern void (*D_80188834[])(void); + +void func_80136C54(void) +{ + D_80188834[D_800B99F0](); +} + + +// @class: struct +// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801AC3C4 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). + +typedef struct { char s[10]; } S10_80136C90; + +s32 func_80136C90() +{ + extern void func_8001534C(int, void *, int, int, int, int); + extern S10_80136C90 D_801AC3C4; + + S10_80136C90 buf = D_801AC3C4; + func_8001534C(0, &buf, 0x78, 0x10, 0, 0); +} + + + +DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ + +DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80136DFC); + +DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ + +DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80136F3C); + +DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80137178); + +DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ + +DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80137614); + +DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ + +DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_801376E8); + +DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ + +DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_801378F0); + +DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ + +DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_801379FC); + + +// @class: remat +// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer +extern s32 D_80127548[]; +extern int D_80188888; +extern int D_801269F0; +extern void func_80138BE0(int p); + +void func_80137B80(void) { + int *p = &D_801269F0; + (*(int *)&D_80127548) = 0x24; + if (*p != 0) { + ((void (*)(int *))func_80138BE0)(p); + } + D_80188888 += 1; +} + + +DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. + +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int D_80188888; +extern int D_801269F0; + +extern void func_801392FC(); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); + +int func_80137D08(int arg0, int arg1, short arg2) +{ + unsigned char buf[3]; + + D_800A5E60 = arg0; + D_80126A0A = arg2; + ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); + if ((*(short *)&D_801269F4) == 7) { + buf[0] = 0x39; + buf[1] = 0xFF; + buf[2] = 0x71; + ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); + } else if ((*(short *)&D_801269F4) == 3) { + if (D_80188888 & 4) { + ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); + } + } + return D_800A5E60; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_8012ACE0", func_80137DD4); + +DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ diff --git a/src/ov_SC06_000/ov_SC06_000_jr_801380E0.c b/src/ov_SC06_000/ov_SC06_000_jr_801380E0.c new file mode 100644 index 000000000..cc92138b0 --- /dev/null +++ b/src/ov_SC06_000/ov_SC06_000_jr_801380E0.c @@ -0,0 +1,3322 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AC170; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80188520[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801AD2EC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B20E0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AC170; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018825C)(); +extern s16 (*D_80188260)(); +extern M2C_UNK (*D_80188268)(); +extern s32 (*D_8018826C)(); +extern s32 D_801AD2E8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AC174; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801885B4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018BA98; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801885CC; +extern M2C_UNK D_801885D4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801885DC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801885F8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80188604[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80188618[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80188668[]; +extern s16 D_80188698[]; +extern s16 D_801886F8[]; +extern s16 D_80188700[]; +extern s16 D_80188720[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80188758[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801887B0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801887F8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80188800[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80188808[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80188810[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801887B8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801887D8; +extern void func_801321B0(int param_1); +extern int D_801887E8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801AD358; +extern s32 D_801AD35C[]; +extern int D_801AD360; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018881C; +extern u8 D_80188818; +extern s16 *D_80188820; +extern u8 D_80188824; +extern int D_801AD358; +extern u16 D_801AD368; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80188820; /* holds a pointer value (*(u16**)&D_80188820) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80188834[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80188888; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018888C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018888C[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801888D0; +extern u8 D_80188914; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801888D0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80188914 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80188958[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80188994[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80188994; + if (((s16)a1) < 0xC00) { + tbl = D_80188958; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801889D0, D_801889D2, D_801889D4, D_801889D6, D_801889D8, D_801889DA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801889D2 < ang)) goto outer_else; + if (!(ang < D_801889D8)) goto inner_else; + if (ang < D_801889D4) { *(s16 *)L = D_801889D4; goto done; } + if (D_801889D6 < ang) { *(s16 *)L = D_801889D6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801889D0) { *(s16 *)L = D_801889D0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801889DA < ang) { *(s16 *)L = D_801889DA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801AD3D0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801AD3D0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801AD3D0; +extern s8 D_801AD3D4; +extern s8 D_801AD3D5; + +void func_8013C9C4(void * arg0) +{ + D_801AD3D0 = arg0; + D_801AD3D4 = 0; + D_801AD3D5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801AD3D0; +extern s8 D_801AD3D4; +extern s8 D_801AD3D5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801AD3D0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801AD3D5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801AD3D4)) * 2) + D_801AD3D0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801AD3D5 = (unsigned char) p[1]; + D_801AD3D4 = D_801AD3D4 + 1; + if (D_801AD3D5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801AD3D4 = 0; + *base = 0; + } + } + else + { + D_801AD3D5 = c - 1; + } + } + return; +} + + + +extern s32 D_801AD3F4; +extern s32 D_801AD3E8; +extern s32 D_801AD3EC; +extern s32 D_801AD3F8; + +void func_8013CABC(void) { + D_801AD3F4 = 1; + D_801AD3E8 = 1; + D_801AD3EC = 0; + D_801AD3F8 = 1; +} + + + +extern s32 D_801AD3E8; +extern s32 D_801AD3EC; +extern s32 D_801AD3F0; +extern s32 D_801AD3F4; +extern s32 D_801AD3F8; + +void func_8013CAE8(void) { + D_801AD3E8 = 1; + D_801AD3F4 = 0; + D_801AD3EC = 0; + D_801AD3F0 = -1; + D_801AD3F8 = 0; +} + + + +extern s32 D_801AD3F4; +extern s32 D_801AD3F8; +extern s32 D_801AD420; +extern s32 D_801AD424; + +void func_8013CB20(void) +{ + D_801AD420 = D_801AD3F8; + D_801AD424 = D_801AD3F4; + D_801AD3F8 = 1; + D_801AD3F4 = 0; +} + + + +extern s32 D_801AD420; +extern s32 D_801AD424; +extern s32 D_801AD3F8; +extern s32 D_801AD3F4; + +void func_8013CB5C(void) { + D_801AD3F8 = D_801AD420; + D_801AD3F4 = D_801AD424; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B1FF8; + extern u8 D_801B1FF9; + extern u8 D_801B1FFA; + extern u8 D_801B1FFB; + extern u8 D_801B1FFC; + extern u8 D_801B1FFD; + extern u8 D_801B1FFE; + extern u8 D_801B1FFF; + extern u8 D_801B2000; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B1FF8; t1 = D_801B1FF9; t2 = D_801B1FFA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B1FFB; t1 = D_801B1FFC; t2 = D_801B1FFD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B1FFE; t1 = D_801B1FFF; t2 = D_801B2000; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801AD400; +extern s32 D_801AD3E8; +extern s32 D_801AD404; +extern s32 D_801AD3F4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801AD400 != 0) { + if (D_801AD400 != 2) { + if (((D_801AD400 < 3) && (D_801AD400 == 1)) && + (D_801AD404 = D_801AD404 + 1, 0x23a < D_801AD404)) { + D_801AD3E8 = D_801AD400; + D_801AD400 = 2; + } + } else { + D_801AD3E8 = D_801AD3E8 + -1; + if (D_801AD3E8 == 0) { + D_801AD3E8 = D_801AD400; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801AD3F4 == 0) { + D_801AD400 = D_801AD400 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801AD3F4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801AD3F4; +} + + + +extern s32 D_801AD400; + +void func_8013D164(void) { + D_801AD400 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B20DA; +extern u8 D_801B2186; +extern u8 D_801B2002; +extern u8 D_801B20BC; +extern u8 D_801B1FE0; +extern u8 D_801B2001; +extern s32 D_801B20C0; + +void func_8013D330(void) { + if ((D_801B20DA & 0xff) != D_801B2186) { + D_801B20DA = ((D_801B20DA & 0xff) < D_801B2186) ? (D_801B20DA + 1) : (D_801B20DA - 1); + } + if ((D_801B2002 & 0xff) != D_801B20BC) { + D_801B2002 = ((D_801B2002 & 0xff) < D_801B20BC) ? (D_801B2002 + 1) : (D_801B2002 - 1); + } + if ((D_801B1FE0 & 0xff) != D_801B2001) { + D_801B1FE0 = ((D_801B1FE0 & 0xff) < D_801B2001) ? (D_801B1FE0 + 1) : (D_801B1FE0 - 1); + } + D_801B20C0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801AD3D8; +extern void *D_801AD3DC; +extern void *D_801AD3E0; +extern s32 D_801AD408; +extern s32 D_801AD40C; +extern s32 D_801AD410; +extern s32 D_801B2034[]; + +extern u8 D_80188AC8[]; +extern u8 D_80188B70[]; +extern u8 D_80188A20[]; +extern u8 D_80188B1C[]; +extern u8 D_80188B9C[]; +extern u8 D_80188A74[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801AD408 = param_2; + D_801AD40C = (param_2 >> 2) & 3; + D_801AD410 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801AD3D8 = D_80188AC8; + D_801AD3DC = D_80188B70; + D_801AD3E0 = D_80188A20; + } else { + D_801AD3D8 = D_80188B1C; + D_801AD3DC = D_80188B9C; + D_801AD3E0 = D_80188A74; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801AD410 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801AD408 & 2) != 0) { + D_801B2034[0] = 0x140; + D_801B2034[3] = 0x80; + if (p[0x37] == 4) { + D_801B2034[0] = 0x140; + D_801B2034[3] = 0; + } + if (p[0x37] == 0) { + D_801B2034[0] = 0x140; + D_801B2034[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801AD3E0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801AD3E0; +extern s16 *D_801AD3E4; +extern s32 D_801AD3F4; +extern s32 D_801AD414; +extern s32 D_801AD418; +extern s32 D_801AD41C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801AD3E4 != 0) { + D_801AD3F4 = 0; + p = (int *)(param_1 * 12 + (int)D_801AD3E0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801AD414 != x) { + flag = 1; + if (D_801AD414 < x) { + if (x - D_801AD414 < 5) { + D_801AD414 = x; + } else { + D_801AD414 = D_801AD414 + 4; + } + } else { + if (D_801AD414 - x < 5) { + D_801AD414 = x; + } else { + D_801AD414 = D_801AD414 - 4; + } + } + } + if (D_801AD418 != y) { + flag = 1; + if (D_801AD418 < y) { + if (y - D_801AD418 < 5) { + D_801AD418 = y; + } else { + D_801AD418 = D_801AD418 + 4; + } + } else { + if (D_801AD418 - y < 5) { + D_801AD418 = y; + } else { + D_801AD418 = D_801AD418 - 4; + } + } + } + if (D_801AD41C != z) { + flag = 1; + if (D_801AD41C < z) { + if (z - D_801AD41C < 5) { + D_801AD41C = z; + } else { + D_801AD41C = D_801AD41C + 4; + } + } else { + if (D_801AD41C - z < 5) { + D_801AD41C = z; + } else { + D_801AD41C = D_801AD41C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801AD3F4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80188C2C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801AD3E4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AD414); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AD418); + uVar5 = (*(int*)&D_801AD41C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80188C2C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801AD3FC; + +s32 func_8013E054(void) { + return D_801AD3FC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80189628; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80189600; +extern s16 D_80189602; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80189628; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80189600 = 2; + D_80189602 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80189602 = 0; + D_80189600 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801AD430; + extern void * D_801AD434; + extern unsigned char D_801892A0; + extern unsigned char D_801892B8; + extern unsigned char D_8018932C; + extern unsigned char D_80189334; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801AD430 = &D_801892A0; + D_801AD434 = &D_8018932C; + } else { + D_801AD430 = &D_801892B8; + D_801AD434 = &D_80189334; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80189628/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80189628 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80189628)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80189604; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80189604)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80189604)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80189600; +extern s16 D_80189602; +extern unsigned char D_80189604; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80189602` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80189600` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80189602; + if (*r < 3) { + *r = *r + 1; + } + D_80189600 = (u16)D_80189600 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189604); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80189604; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80189604); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013FAF8); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8013FFD8); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8014032C); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80140608); + + +// @class: iv-combine +// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source +// pointer compile to fixed offsets when written base[0..n]; the target advances +// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead +// final increment, yielding the "increment N-2 then offset 0/2" tail). + +extern u8 *D_801892E0; +extern u8 *D_801892E4; +extern u8 *D_801892E8; +extern u8 *D_801892EC; +extern u8 *D_801892F0; +extern u16 *D_801892F4[]; +extern u16 *D_801892FC[]; +extern u16 *D_8018931C[]; + +extern s32 func_80028D58(void); +extern s32 func_80028DE0(void); +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); + +void func_801407F4(void) +{ + u8 *puVar1; + s32 iVar2; + u16 *puVar3; + + puVar1 = D_801892E0; + iVar2 = func_80028D58(); + puVar3 = D_801892F4[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + puVar1 = D_801892E4; + iVar2 = func_80028DE0(); + puVar3 = D_801892F4[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + iVar2 = func_80028FBC(); + *(s16 *)(D_801892E8 + 0x18) = *D_801892FC[iVar2]; + iVar2 = func_80029000(); + *(s16 *)(D_801892EC + 0x18) = *D_801892FC[iVar2]; + + puVar1 = D_801892F0; + iVar2 = func_80028D9C(); + puVar3 = D_8018931C[iVar2]; + *(s16 *)(puVar1 + 0x12) = *puVar3++; + *(s16 *)(puVar1 + 0x14) = *puVar3++; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + *(s16 *)(puVar1 + 0x1c) = *puVar3++; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80140958); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80140D68); + + +// @class: struct +// @stuck: none — MATCH + +extern unsigned char D_80078E7F; +extern unsigned char D_80078E7E; +extern unsigned char D_80078E7D; +extern M2C_UNK D_8018921C; + +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); + +void func_80140E6C(void) { + void *puVar1; + unsigned int uVar2; + unsigned int uVar3; + unsigned int uVar4; + + puVar1 = (*(void * *)&D_8018921C); + uVar2 = func_800D2CA8(D_80078E7F, 0x18); + uVar3 = func_800D2CA8(D_80078E7E, 0xc); + uVar4 = func_800D2CA8(D_80078E7D, 0); + func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); +} + + + + +// @class: plumbing +// @stuck: none — MATCH (128/128 ins, match_one confirmed) + +extern short D_80115128; +extern u8 D_8018922C; +extern char *D_8018924C; +extern char *D_80189250; +extern char *D_80189254; +extern char *D_80189258; +extern char *D_8018925C; + +extern int func_80029FE4(void); +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); +extern char *func_8002AAB4(void); +extern char *strcpy(char *, const char *); +extern int func_8002A26C(void); +extern int func_8002A2B0(void); +extern int func_8002A4B8(void); +extern s32 func_8002A4FC(s32 a0); +extern int func_8002A998(void); +extern int func_8002A9DC(void); +extern int func_8002A728(void); +extern int func_8002A76C(void); +extern int func_80029FD4(void); + +void func_80140F00(void) { + char *p; + int r; + + if (D_80115128 == 0) { + p = (*(char * *)&D_8018922C); + r = func_800D2CA8(func_80029FE4() + 1, 0x18); + func_800D2D10(r, 2, p + 4, 1); + strcpy(p + 0xA, func_8002AAB4()); + + p = D_8018924C; + r = func_800D2CA8(func_8002A26C() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A2B0(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80189250; + r = func_800D2CA8(func_8002A4B8() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80189254; + r = func_800D2CA8(func_8002A998() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A9DC(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_80189258; + r = func_800D2CA8(func_8002A728() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A76C(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_8018925C; + r = func_800D2CA8(func_80029FD4(), 4); + func_800D2D10(r, 7, p + 0x18, -1); + } +} + + + +// @class: other +// @stuck: none — MATCH + +extern short D_80115128; +extern unsigned short D_80115172; +extern unsigned short D_801890E6; +extern unsigned short D_801890EA; +extern unsigned short D_801890EE; +extern unsigned short D_801890F2; + +extern s32 func_8002A1B4(void); +extern short func_8002A28C(void); +extern short func_8002A27C(void); +extern s32 func_8002A400(void); +extern short func_8002A4D8(void); +extern short func_8002A4C8(void); +extern s32 func_8002A8E0(void); +extern short func_8002A9B8(void); +extern short func_8002A9A8(void); +extern s32 func_8002A670(void); +extern short func_8002A748(void); +extern short func_8002A738(void); +extern int func_801412A8(int, int, int, int, int, int); + +int func_80141100(int param_1) +{ + short sVar1; + int iVar7; + + if (D_80115128 == 0) { + iVar7 = D_80115172 + 0x31; + sVar1 = D_801890E6; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); + sVar1 = D_801890EA; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); + sVar1 = D_801890EE; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); + sVar1 = D_801890F2; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); + } + return param_1; +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_801412A8); + +DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ + +DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ + +DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ + + +extern unsigned short D_80115112; +extern void (*D_8018967C[])(void); + +void func_80141788(void) +{ + D_8018967C[D_80115112](); +} + + +DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ + +DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80141874); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_801418F8); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80141A60); + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80141B90); + +DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) + +extern u16 D_80115110; +extern u8 D_801895DC; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80141C0C(s32 param_1) +{ + func_8002D4C8(*(u16 *)(&D_801895DC + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); +} + + +DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ + +DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ + +DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ + +DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_801424E4); + + +extern void (*D_801896BC[])(void); + +void func_801425CC(void *a0) { + D_801896BC[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: schedule +// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail + +extern void func_8012C1B8(void); +extern s32 func_8012C1DC(s32 a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern s32 func_8012AD50(void *a0); +extern s32 D_801896A0; + +void func_80142608(s32 param_1) +{ + register s32 iVar1 __asm__("$16"); + + if (*(short *)(param_1 + 0x70) != 0) { + iVar1 = ((s32 (*)(void))func_8012C1B8)(); + } else { + iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); + } + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CA1C(iVar1, (s32)&D_801896A0); + *(short *)(iVar1 + 0x1a) = 0x200; + *(short *)(iVar1 + 0x18) = 0x200; + *(short *)(param_1 + 0xfc) = 0x40; + if (*(short *)(param_1 + 0x70) != 0) { + goto ad50; + } + if (*(s32 *)(param_1 + 100) != 0) { + *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); + goto ad50; + } + } + ((void (*)(s32))func_8012CAE4)(param_1); + return; +ad50: + *(short *)(param_1 + 0x98) = 0; + *(s32 *)(param_1 + 0x90) = 0; + ((void (*)(s32))func_8012AD50)(param_1); +} + + +DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ + +DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ + +DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ + +DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ + +DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801896D0[])(); + +void func_801427EC(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801896D0[*(u16 *)(param_1 + 2)](); + } +} + + +DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ + +DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801896EC[])(); + +void func_8014292C(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801896EC[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801898BC[])(); + +void func_80142978(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801898BC[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80189974[])(); + +void func_801429C4(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80189974[*(u16 *)(param_1 + 2)](); + } +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80142A10); + + +// @class: struct +// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) + +extern u16 D_800B99D8; +extern struct packed_word D_801ACB00; +extern u8 D_801AD438; +extern u8 D_801AD439; +extern u8 D_801AD43A; + +void func_80142A80(void) +{ + u16 flags; + union word_bytes local; + s32 mul; + + flags = D_800B99D8; + local.pw = D_801ACB00; + + if (flags & 0x10) { + mul = (s8)((flags & 0xf) >> 1) + 9; + } else { + mul = 0x10 - (s8)((flags & 0xf) >> 1); + } + + D_801AD438 = mul * (local.b[0] >> 4); + D_801AD439 = mul * (local.b[1] >> 4); + D_801AD43A = mul * (local.b[2] >> 4); +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80142B2C); + +DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ + +DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ + +DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ + +DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ + +DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ + +DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern int D_801896C4; + +void func_80142DC4(int param_1) +{ + int v0; + + *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_801896C4); + *(short *)(v0 + 0x1a) = 0x1800; + *(short *)(v0 + 0x18) = 0x1800; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_801896E0[]; + +void func_80142E38(int param_1) +{ + short sVar1; + int iVar2; + + *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_801896E0); + sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; + *(short *)(iVar2 + 0x1a) = sVar1; + *(short *)(iVar2 + 0x18) = sVar1; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80142EC0); + +DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ + +DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result +// survives across func_8001CA1C while $v0 serves the pre-call store/test; +// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_801898CC[]; +extern unsigned char D_8018992C[]; + +void func_8014305C(int param_1) +{ + register int s0_param __asm__("$16") = param_1; + register int s1_copy __asm__("$17"); + int iVar2; + short sVar1; + + iVar2 = ((int (*)(void))func_8012C1B8)(); + *(int *)(s0_param + 0x20) = iVar2; + s1_copy = iVar2; + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(s0_param); + } else { + ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_801898CC); + sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; + *(short *)(s1_copy + 0x1a) = sVar1; + *(short *)(s1_copy + 0x18) = sVar1; + *(short *)(s0_param + 0xfc) = 0; + func_8012A828(s0_param, D_8018992C); + ((void (*)(int))func_80142B2C)(s0_param); + } +} + + +DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ + +DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) + + +extern void *memcpy(void *, const void *, u32); + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern int func_8001CA88(int, void *); +extern s32 func_8012E504(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80142B2C(void *arg0); + +extern u8 D_801ACAFC; +extern u8 D_801AD438; +extern u8 D_801AD43C; + +void func_801431E8(s32 param_1) { + u8 buf[8]; + s32 iVar5; + u16 uVar2; + s16 sVar4; + + register s32 d __asm__("$16"); + memcpy(buf, &D_801ACAFC, 4); + iVar5 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = iVar5; + d = iVar5; + if (iVar5 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, void *))func_8001CA88)(d, &D_801AD438); + uVar2 = *(u16 *)(param_1 + 0x70); + *(s16 *)(d + 0x76) = -0x10; + sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; + *(s16 *)(d + 0x1a) = sVar4; + *(s16 *)(d + 0x18) = sVar4; + *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; + if (func_8012E504(param_1, 0x33) == 0) { + *(s16 *)(param_1 + 0xfc) = 1; + func_800233CC(&D_801AD438, 0x10); + memcpy(&D_801AD43C, buf, 4); + } else { + *(s16 *)(param_1 + 0xfc) = 0; + } + ((void (*)(s32))func_80142B2C)(param_1); + } +} + + +DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ + +DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ + +DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) + +extern u8 D_800D387C[]; +extern u32 D_80189A84[]; + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80143458(s32 param_1) +{ + s32 p; + u16 v; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + p = *(s32 *)(param_1 + 0x20); + if (*(s32 *)(p + 4) == 0) { + *(s32 *)(p + 4) = 0x50000000; + } + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + v = *(u16 *)(param_1 + 0x34) & 0x7fff; + if (v != 0) { + p = *(s32 *)(param_1 + 0x20); + *(u16 *)(p + 0x1a) = v; + *(u16 *)(p + 0x18) = v; + } + + func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, + D_80189A84[*(u16 *)(param_1 + 0x34) & 3]); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + +DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_8014358C); + +DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ + +DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ + +DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ + +DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ + +DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ + +DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ + + +extern void (*D_80189BAC[])(void); + +void func_80143B30(void *a0) { + D_80189BAC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ + +DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ + + +extern void (*D_80189BB8[])(void); + +void func_80143C38(void *a0) { + D_80189BB8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ + + +extern void (*D_80189BC0[])(void); + +void func_80143C98(void *a0) { + D_80189BC0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80143D28); + + +extern void (*D_80189C08[])(void); + +void func_80143E68(void *a0) { + D_80189C08[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ + +DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ + +DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ + +DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ + + +extern void (*D_80189C1C[])(void); + +void func_80144054(void *a0) { + D_80189C1C[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80144090); + +extern void func_8012C218(void *a0); + +// @class: struct +// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) + +extern void (*D_80189C24[])(); + +void func_801442F8(int param_1) +{ + int iVar1; + + D_80189C24[*(u16 *)(param_1 + 2)](); + iVar1 = *(int *)(param_1 + 0x1c) + 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (0x1d < iVar1) { + func_8012C218(param_1); + } +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern u8 D_80189BA0; + +void func_80144364(int param_1) { + int iVar3; + u16 uVar2; + s16 sVar1; + + iVar3 = ((s32 (*)(void))func_8012C194)(); + if (iVar3 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); + *(int *)(param_1 + 0xCC) = iVar3; + *(u16 *)(param_1 + 0xFC) = uVar2; + func_8001CB6C((u8 *)iVar3, (s32)&D_80189BA0, 0x250, 0x1A0); + *(s32 *)(iVar3 + 4) = 0x60000000; + *(u8 *)(iVar3 + 0x27) = 0x14; + *(u16 *)(iVar3 + 0x10) = 0x400; + *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); + *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); + *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); + sVar1 = *(s16 *)(param_1 + 0x70); + if (sVar1 != 0) { + *(s16 *)(iVar3 + 0x1A) = sVar1; + *(s16 *)(iVar3 + 0x18) = sVar1; + } else { + *(u16 *)(iVar3 + 0x1A) = 0x2000; + *(u16 *)(iVar3 + 0x18) = 0x2000; + } + *(u16 *)(param_1 + 2) = 1; + } +} + + + + +extern void func_80016714(void *a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *a0); +extern s32 D_80189BB4; + +void func_80144458(void *arg0) { + s32 temp_s0; + void *temp_s2; + void *temp_v0; + + temp_s2 = M2C_FIELD(arg0, void **, 0xCC); + if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { + temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); + if (temp_v0 != NULL) { + temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; + M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_80189BB4 * 0x10); + M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_80189BB4 * 0x10); + func_8012AD80(arg0); + } + } + M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); + M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); + M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); + if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { + func_80016714(temp_s2, 0x38); + func_8012C218(arg0); + } +} + + +DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ + +DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ + +DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_80189BC8; +extern u8 D_80189BD4; + +void func_8014477C(void *param_1) { + s32 v0; + s32 v1; + register s32 uVar2 __asm__("$2"); + register s32 addr __asm__("$3"); + s32 gv; + s32 fv; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)param_1 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(param_1); + return; + } + ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80189BC8); + if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { + *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); + uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); + if (uVar2 != 0) { + addr = uVar2 & 0xFFFFFFF; + gv = *(u16 *)((addr | 0x80000000) + 8); + fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; + *(u16 *)((s32)param_1 + 0xA) = gv + fv; + } else { + *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; + } + } + ((void (*)(void *, void *))func_8012A828)(param_1, &D_80189BD4); + v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; + *(s16 *)((s32)param_1 + 0x2) = 1; + *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; + *(s32 *)((s32)param_1 + 0x1C) = 0x78; +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); + +extern u8 D_80189BA0; +extern u8 D_80189C10; + +void func_80144880(s32 param_1) +{ + register s32 obj __asm__("$16"); /* $s0 */ + register s32 self __asm__("$17") = param_1; /* $s1 */ + register s32 b __asm__("$2"); /* $v0 */ + s32 e; + + obj = ((s32 (*)(void))func_8012C194)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(self); + } else { + *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); + *(s32 *)(self + 0xCC) = obj; + if (*(s16 *)(self + 0x70) == 1) { + func_8001CB6C((u8 *)obj, (s32)&D_80189BA0, 0x250, 0x1A0); + b = 0x14; + } else { + func_8001CB6C((u8 *)obj, (s32)&D_80189C10, 0x300, 0x1D0); + b = 0x6A; + } + *(u8 *)(obj + 0x27) = (u8)b; + *(s32 *)(obj + 4) = 0x60000000; + *(u16 *)(obj + 0x10) = 0x400; + *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); + *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); + e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); + *(u16 *)(obj + 0x1A) = 0x4000; + *(u16 *)(obj + 0x18) = 0x4000; + *(u16 *)(obj + 0xC) = (u16)e; + *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; + } +} + + +DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ + + +extern void (*D_80189C2C[])(void); + +void func_801449C8(void *a0) { + D_80189C2C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ + + +extern void (*D_80189C34[])(void); + +void func_80144A2C(void *a0) { + D_80189C34[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ + +DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ + +DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ + +DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_000/nonmatchings/ov_SC06_000_jr_801380E0", func_80144B14); + diff --git a/src/ov_SC06_006/ov_SC06_006_jr_8012ACE0.c b/src/ov_SC06_006/ov_SC06_006_jr_8012ACE0.c index 2d1f09ba6..cfd6e30f6 100644 --- a/src/ov_SC06_006/ov_SC06_006_jr_8012ACE0.c +++ b/src/ov_SC06_006/ov_SC06_006_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_801823B0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_801823B0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801823F4; -extern u8 D_80182438; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801823F4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182438 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018247C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801824B8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801824B8; - if (((s16)a1) < 0xC00) { - tbl = D_8018247C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801824F4, D_801824F6, D_801824F8, D_801824FA, D_801824FC, D_801824FE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801824F6 < ang)) goto outer_else; - if (!(ang < D_801824FC)) goto inner_else; - if (ang < D_801824F8) { *(s16 *)L = D_801824F8; goto done; } - if (D_801824FA < ang) { *(s16 *)L = D_801824FA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801824F4) { *(s16 *)L = D_801824F4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801824FE < ang) { *(s16 *)L = D_801824FE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801F6E18; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801F6E18, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801F6E18; -extern s8 D_801F6E1C; -extern s8 D_801F6E1D; - -void func_8013C9C4(void * arg0) -{ - D_801F6E18 = arg0; - D_801F6E1C = 0; - D_801F6E1D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801F6E18; -extern s8 D_801F6E1C; -extern s8 D_801F6E1D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801F6E18; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801F6E1D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801F6E1C)) * 2) + D_801F6E18); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801F6E1D = (unsigned char) p[1]; - D_801F6E1C = D_801F6E1C + 1; - if (D_801F6E1D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801F6E1C = 0; - *base = 0; - } - } - else - { - D_801F6E1D = c - 1; - } - } - return; -} - - - -extern s32 D_801F6E3C; -extern s32 D_801F6E30; -extern s32 D_801F6E34; -extern s32 D_801F6E40; - -void func_8013CABC(void) { - D_801F6E3C = 1; - D_801F6E30 = 1; - D_801F6E34 = 0; - D_801F6E40 = 1; -} - - - -extern s32 D_801F6E30; -extern s32 D_801F6E34; -extern s32 D_801F6E38; -extern s32 D_801F6E3C; -extern s32 D_801F6E40; - -void func_8013CAE8(void) { - D_801F6E30 = 1; - D_801F6E3C = 0; - D_801F6E34 = 0; - D_801F6E38 = -1; - D_801F6E40 = 0; -} - - - -extern s32 D_801F6E3C; -extern s32 D_801F6E40; -extern s32 D_801F6E68; -extern s32 D_801F6E6C; - -void func_8013CB20(void) -{ - D_801F6E68 = D_801F6E40; - D_801F6E6C = D_801F6E3C; - D_801F6E40 = 1; - D_801F6E3C = 0; -} - - - -extern s32 D_801F6E68; -extern s32 D_801F6E6C; -extern s32 D_801F6E40; -extern s32 D_801F6E3C; - -void func_8013CB5C(void) { - D_801F6E40 = D_801F6E68; - D_801F6E3C = D_801F6E6C; -} - - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801F8A00; - extern u8 D_801F8A01; - extern u8 D_801F8A02; - extern u8 D_801F8A03; - extern u8 D_801F8A04; - extern u8 D_801F8A05; - extern u8 D_801F8A06; - extern u8 D_801F8A07; - extern u8 D_801F8A08; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801F8A00; t1 = D_801F8A01; t2 = D_801F8A02; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801F8A03; t1 = D_801F8A04; t2 = D_801F8A05; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801F8A06; t1 = D_801F8A07; t2 = D_801F8A08; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801F6E48; -extern s32 D_801F6E30; -extern s32 D_801F6E4C; -extern s32 D_801F6E3C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801F6E48 != 0) { - if (D_801F6E48 != 2) { - if (((D_801F6E48 < 3) && (D_801F6E48 == 1)) && - (D_801F6E4C = D_801F6E4C + 1, 0x23a < D_801F6E4C)) { - D_801F6E30 = D_801F6E48; - D_801F6E48 = 2; - } - } else { - D_801F6E30 = D_801F6E30 + -1; - if (D_801F6E30 == 0) { - D_801F6E30 = D_801F6E48; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801F6E3C == 0) { - D_801F6E48 = D_801F6E48 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801F6E3C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801F6E3C; -} - - - -extern s32 D_801F6E48; - -void func_8013D164(void) { - D_801F6E48 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801F8AF6; -extern u8 D_801F8B66; -extern u8 D_801F8A18; -extern u8 D_801F8AD4; -extern u8 D_801F89E8; -extern u8 D_801F8A09; -extern s32 D_801F8AD8; - -void func_8013D330(void) { - if ((D_801F8AF6 & 0xff) != D_801F8B66) { - D_801F8AF6 = ((D_801F8AF6 & 0xff) < D_801F8B66) ? (D_801F8AF6 + 1) : (D_801F8AF6 - 1); - } - if ((D_801F8A18 & 0xff) != D_801F8AD4) { - D_801F8A18 = ((D_801F8A18 & 0xff) < D_801F8AD4) ? (D_801F8A18 + 1) : (D_801F8A18 - 1); - } - if ((D_801F89E8 & 0xff) != D_801F8A09) { - D_801F89E8 = ((D_801F89E8 & 0xff) < D_801F8A09) ? (D_801F89E8 + 1) : (D_801F89E8 - 1); - } - D_801F8AD8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801F6E20; -extern void *D_801F6E24; -extern void *D_801F6E28; -extern s32 D_801F6E50; -extern s32 D_801F6E54; -extern s32 D_801F6E58; -extern s32 D_801F8A4C[]; - -extern u8 D_801825EC[]; -extern u8 D_80182694[]; -extern u8 D_80182544[]; -extern u8 D_80182640[]; -extern u8 D_801826C0[]; -extern u8 D_80182598[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801F6E50 = param_2; - D_801F6E54 = (param_2 >> 2) & 3; - D_801F6E58 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801F6E20 = D_801825EC; - D_801F6E24 = D_80182694; - D_801F6E28 = D_80182544; - } else { - D_801F6E20 = D_80182640; - D_801F6E24 = D_801826C0; - D_801F6E28 = D_80182598; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801F6E58 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801F6E50 & 2) != 0) { - D_801F8A4C[0] = 0x140; - D_801F8A4C[3] = 0x80; - if (p[0x37] == 4) { - D_801F8A4C[0] = 0x140; - D_801F8A4C[3] = 0; - } - if (p[0x37] == 0) { - D_801F8A4C[0] = 0x140; - D_801F8A4C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801F6E28)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801F6E28; -extern s16 *D_801F6E2C; -extern s32 D_801F6E3C; -extern s32 D_801F6E5C; -extern s32 D_801F6E60; -extern s32 D_801F6E64; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801F6E2C != 0) { - D_801F6E3C = 0; - p = (int *)(param_1 * 12 + (int)D_801F6E28); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801F6E5C != x) { - flag = 1; - if (D_801F6E5C < x) { - if (x - D_801F6E5C < 5) { - D_801F6E5C = x; - } else { - D_801F6E5C = D_801F6E5C + 4; - } - } else { - if (D_801F6E5C - x < 5) { - D_801F6E5C = x; - } else { - D_801F6E5C = D_801F6E5C - 4; - } - } - } - if (D_801F6E60 != y) { - flag = 1; - if (D_801F6E60 < y) { - if (y - D_801F6E60 < 5) { - D_801F6E60 = y; - } else { - D_801F6E60 = D_801F6E60 + 4; - } - } else { - if (D_801F6E60 - y < 5) { - D_801F6E60 = y; - } else { - D_801F6E60 = D_801F6E60 - 4; - } - } - } - if (D_801F6E64 != z) { - flag = 1; - if (D_801F6E64 < z) { - if (z - D_801F6E64 < 5) { - D_801F6E64 = z; - } else { - D_801F6E64 = D_801F6E64 + 4; - } - } else { - if (D_801F6E64 - z < 5) { - D_801F6E64 = z; - } else { - D_801F6E64 = D_801F6E64 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801F6E3C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80182750[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801F6E2C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801F6E5C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801F6E60); - uVar5 = (*(int*)&D_801F6E64); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80182750); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801F6E44; - -s32 func_8013E054(void) { - return D_801F6E44; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018314C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80183124; -extern s16 D_80183126; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018314C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80183124 = 2; - D_80183126 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80183126 = 0; - D_80183124 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801F6E78; - extern void * D_801F6E7C; - extern unsigned char D_80182DC4; - extern unsigned char D_80182DDC; - extern unsigned char D_80182E50; - extern unsigned char D_80182E58; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801F6E78 = &D_80182DC4; - D_801F6E7C = &D_80182E50; - } else { - D_801F6E78 = &D_80182DDC; - D_801F6E7C = &D_80182E58; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018314C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018314C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018314C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80183128; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183128)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183128)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80183124; -extern s16 D_80183126; -extern unsigned char D_80183128; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183126` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80183124` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80183126; - if (*r < 3) { - *r = *r + 1; - } - D_80183124 = (u16)D_80183124 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183128); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80183128; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183128); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_006/ov_SC06_006_jr_801380E0.c b/src/ov_SC06_006/ov_SC06_006_jr_801380E0.c new file mode 100644 index 000000000..da1b2c24d --- /dev/null +++ b/src/ov_SC06_006/ov_SC06_006_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801F5A78; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182044[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801F6D34; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801F8AF8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801F5A78; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181D80)(); +extern s16 (*D_80181D84)(); +extern M2C_UNK (*D_80181D8C)(); +extern s32 (*D_80181D90)(); +extern s32 D_801F6D30; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801F5A7C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801820D8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801855BC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801820F0; +extern M2C_UNK D_801820F8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80182100; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018211C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80182128[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018213C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018218C[]; +extern s16 D_801821BC[]; +extern s16 D_8018221C[]; +extern s16 D_80182224[]; +extern s16 D_80182244[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018227C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801822D4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018231C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182324[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018232C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182334[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801822DC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801822FC; +extern void func_801321B0(int param_1); +extern int D_8018230C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801F6DA0; +extern s32 D_801F6DA4[]; +extern int D_801F6DA8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182340; +extern u8 D_8018233C; +extern s16 *D_80182344; +extern u8 D_80182348; +extern int D_801F6DA0; +extern u16 D_801F6DB0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182344; /* holds a pointer value (*(u16**)&D_80182344) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182358[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_801823AC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_801823B0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_801823B0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801823F4; +extern u8 D_80182438; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801823F4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182438 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018247C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801824B8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801824B8; + if (((s16)a1) < 0xC00) { + tbl = D_8018247C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801824F4, D_801824F6, D_801824F8, D_801824FA, D_801824FC, D_801824FE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801824F6 < ang)) goto outer_else; + if (!(ang < D_801824FC)) goto inner_else; + if (ang < D_801824F8) { *(s16 *)L = D_801824F8; goto done; } + if (D_801824FA < ang) { *(s16 *)L = D_801824FA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801824F4) { *(s16 *)L = D_801824F4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801824FE < ang) { *(s16 *)L = D_801824FE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801F6E18; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801F6E18, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801F6E18; +extern s8 D_801F6E1C; +extern s8 D_801F6E1D; + +void func_8013C9C4(void * arg0) +{ + D_801F6E18 = arg0; + D_801F6E1C = 0; + D_801F6E1D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801F6E18; +extern s8 D_801F6E1C; +extern s8 D_801F6E1D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801F6E18; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801F6E1D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801F6E1C)) * 2) + D_801F6E18); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801F6E1D = (unsigned char) p[1]; + D_801F6E1C = D_801F6E1C + 1; + if (D_801F6E1D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801F6E1C = 0; + *base = 0; + } + } + else + { + D_801F6E1D = c - 1; + } + } + return; +} + + + +extern s32 D_801F6E3C; +extern s32 D_801F6E30; +extern s32 D_801F6E34; +extern s32 D_801F6E40; + +void func_8013CABC(void) { + D_801F6E3C = 1; + D_801F6E30 = 1; + D_801F6E34 = 0; + D_801F6E40 = 1; +} + + + +extern s32 D_801F6E30; +extern s32 D_801F6E34; +extern s32 D_801F6E38; +extern s32 D_801F6E3C; +extern s32 D_801F6E40; + +void func_8013CAE8(void) { + D_801F6E30 = 1; + D_801F6E3C = 0; + D_801F6E34 = 0; + D_801F6E38 = -1; + D_801F6E40 = 0; +} + + + +extern s32 D_801F6E3C; +extern s32 D_801F6E40; +extern s32 D_801F6E68; +extern s32 D_801F6E6C; + +void func_8013CB20(void) +{ + D_801F6E68 = D_801F6E40; + D_801F6E6C = D_801F6E3C; + D_801F6E40 = 1; + D_801F6E3C = 0; +} + + + +extern s32 D_801F6E68; +extern s32 D_801F6E6C; +extern s32 D_801F6E40; +extern s32 D_801F6E3C; + +void func_8013CB5C(void) { + D_801F6E40 = D_801F6E68; + D_801F6E3C = D_801F6E6C; +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801F8A00; + extern u8 D_801F8A01; + extern u8 D_801F8A02; + extern u8 D_801F8A03; + extern u8 D_801F8A04; + extern u8 D_801F8A05; + extern u8 D_801F8A06; + extern u8 D_801F8A07; + extern u8 D_801F8A08; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801F8A00; t1 = D_801F8A01; t2 = D_801F8A02; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801F8A03; t1 = D_801F8A04; t2 = D_801F8A05; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801F8A06; t1 = D_801F8A07; t2 = D_801F8A08; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801F6E48; +extern s32 D_801F6E30; +extern s32 D_801F6E4C; +extern s32 D_801F6E3C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801F6E48 != 0) { + if (D_801F6E48 != 2) { + if (((D_801F6E48 < 3) && (D_801F6E48 == 1)) && + (D_801F6E4C = D_801F6E4C + 1, 0x23a < D_801F6E4C)) { + D_801F6E30 = D_801F6E48; + D_801F6E48 = 2; + } + } else { + D_801F6E30 = D_801F6E30 + -1; + if (D_801F6E30 == 0) { + D_801F6E30 = D_801F6E48; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801F6E3C == 0) { + D_801F6E48 = D_801F6E48 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801F6E3C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801F6E3C; +} + + + +extern s32 D_801F6E48; + +void func_8013D164(void) { + D_801F6E48 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801F8AF6; +extern u8 D_801F8B66; +extern u8 D_801F8A18; +extern u8 D_801F8AD4; +extern u8 D_801F89E8; +extern u8 D_801F8A09; +extern s32 D_801F8AD8; + +void func_8013D330(void) { + if ((D_801F8AF6 & 0xff) != D_801F8B66) { + D_801F8AF6 = ((D_801F8AF6 & 0xff) < D_801F8B66) ? (D_801F8AF6 + 1) : (D_801F8AF6 - 1); + } + if ((D_801F8A18 & 0xff) != D_801F8AD4) { + D_801F8A18 = ((D_801F8A18 & 0xff) < D_801F8AD4) ? (D_801F8A18 + 1) : (D_801F8A18 - 1); + } + if ((D_801F89E8 & 0xff) != D_801F8A09) { + D_801F89E8 = ((D_801F89E8 & 0xff) < D_801F8A09) ? (D_801F89E8 + 1) : (D_801F89E8 - 1); + } + D_801F8AD8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801F6E20; +extern void *D_801F6E24; +extern void *D_801F6E28; +extern s32 D_801F6E50; +extern s32 D_801F6E54; +extern s32 D_801F6E58; +extern s32 D_801F8A4C[]; + +extern u8 D_801825EC[]; +extern u8 D_80182694[]; +extern u8 D_80182544[]; +extern u8 D_80182640[]; +extern u8 D_801826C0[]; +extern u8 D_80182598[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801F6E50 = param_2; + D_801F6E54 = (param_2 >> 2) & 3; + D_801F6E58 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801F6E20 = D_801825EC; + D_801F6E24 = D_80182694; + D_801F6E28 = D_80182544; + } else { + D_801F6E20 = D_80182640; + D_801F6E24 = D_801826C0; + D_801F6E28 = D_80182598; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801F6E58 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801F6E50 & 2) != 0) { + D_801F8A4C[0] = 0x140; + D_801F8A4C[3] = 0x80; + if (p[0x37] == 4) { + D_801F8A4C[0] = 0x140; + D_801F8A4C[3] = 0; + } + if (p[0x37] == 0) { + D_801F8A4C[0] = 0x140; + D_801F8A4C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801F6E28)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801F6E28; +extern s16 *D_801F6E2C; +extern s32 D_801F6E3C; +extern s32 D_801F6E5C; +extern s32 D_801F6E60; +extern s32 D_801F6E64; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801F6E2C != 0) { + D_801F6E3C = 0; + p = (int *)(param_1 * 12 + (int)D_801F6E28); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801F6E5C != x) { + flag = 1; + if (D_801F6E5C < x) { + if (x - D_801F6E5C < 5) { + D_801F6E5C = x; + } else { + D_801F6E5C = D_801F6E5C + 4; + } + } else { + if (D_801F6E5C - x < 5) { + D_801F6E5C = x; + } else { + D_801F6E5C = D_801F6E5C - 4; + } + } + } + if (D_801F6E60 != y) { + flag = 1; + if (D_801F6E60 < y) { + if (y - D_801F6E60 < 5) { + D_801F6E60 = y; + } else { + D_801F6E60 = D_801F6E60 + 4; + } + } else { + if (D_801F6E60 - y < 5) { + D_801F6E60 = y; + } else { + D_801F6E60 = D_801F6E60 - 4; + } + } + } + if (D_801F6E64 != z) { + flag = 1; + if (D_801F6E64 < z) { + if (z - D_801F6E64 < 5) { + D_801F6E64 = z; + } else { + D_801F6E64 = D_801F6E64 + 4; + } + } else { + if (D_801F6E64 - z < 5) { + D_801F6E64 = z; + } else { + D_801F6E64 = D_801F6E64 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801F6E3C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80182750[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801F6E2C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801F6E5C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801F6E60); + uVar5 = (*(int*)&D_801F6E64); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80182750); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801F6E44; + +s32 func_8013E054(void) { + return D_801F6E44; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018314C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80183124; +extern s16 D_80183126; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018314C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80183124 = 2; + D_80183126 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80183126 = 0; + D_80183124 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801F6E78; + extern void * D_801F6E7C; + extern unsigned char D_80182DC4; + extern unsigned char D_80182DDC; + extern unsigned char D_80182E50; + extern unsigned char D_80182E58; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801F6E78 = &D_80182DC4; + D_801F6E7C = &D_80182E50; + } else { + D_801F6E78 = &D_80182DDC; + D_801F6E7C = &D_80182E58; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018314C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018314C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018314C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80183128; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80183128)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80183128)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80183124; +extern s16 D_80183126; +extern unsigned char D_80183128; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80183126` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80183124` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80183126; + if (*r < 3) { + *r = *r + 1; + } + D_80183124 = (u16)D_80183124 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183128); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80183128; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80183128); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_006/nonmatchings/ov_SC06_006_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_008/ov_SC06_008_jr_8012ACE0.c b/src/ov_SC06_008/ov_SC06_008_jr_8012ACE0.c index e71d0c159..167acdecb 100644 --- a/src/ov_SC06_008/ov_SC06_008_jr_8012ACE0.c +++ b/src/ov_SC06_008/ov_SC06_008_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185E18[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185E18[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80185E5C; -extern u8 D_80185EA0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80185E5C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80185EA0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80185EE4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80185F20[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80185F20; - if (((s16)a1) < 0xC00) { - tbl = D_80185EE4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80185F5C, D_80185F5E, D_80185F60, D_80185F62, D_80185F64, D_80185F66; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80185F5E < ang)) goto outer_else; - if (!(ang < D_80185F64)) goto inner_else; - if (ang < D_80185F60) { *(s16 *)L = D_80185F60; goto done; } - if (D_80185F62 < ang) { *(s16 *)L = D_80185F62; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80185F5C) { *(s16 *)L = D_80185F5C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80185F66 < ang) { *(s16 *)L = D_80185F66; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A8D98; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A8D98, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A8D98; -extern s8 D_801A8D9C; -extern s8 D_801A8D9D; - -void func_8013C9C4(void * arg0) -{ - D_801A8D98 = arg0; - D_801A8D9C = 0; - D_801A8D9D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A8D98; -extern s8 D_801A8D9C; -extern s8 D_801A8D9D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A8D98; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A8D9D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A8D9C)) * 2) + D_801A8D98); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A8D9D = (unsigned char) p[1]; - D_801A8D9C = D_801A8D9C + 1; - if (D_801A8D9D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A8D9C = 0; - *base = 0; - } - } - else - { - D_801A8D9D = c - 1; - } - } - return; -} - - - -extern s32 D_801A8DBC; -extern s32 D_801A8DB0; -extern s32 D_801A8DB4; -extern s32 D_801A8DC0; - -void func_8013CABC(void) { - D_801A8DBC = 1; - D_801A8DB0 = 1; - D_801A8DB4 = 0; - D_801A8DC0 = 1; -} - - - -extern s32 D_801A8DB0; -extern s32 D_801A8DB4; -extern s32 D_801A8DB8; -extern s32 D_801A8DBC; -extern s32 D_801A8DC0; - -void func_8013CAE8(void) { - D_801A8DB0 = 1; - D_801A8DBC = 0; - D_801A8DB4 = 0; - D_801A8DB8 = -1; - D_801A8DC0 = 0; -} - - - -extern s32 D_801A8DBC; -extern s32 D_801A8DC0; -extern s32 D_801A8DE8; -extern s32 D_801A8DEC; - -void func_8013CB20(void) -{ - D_801A8DE8 = D_801A8DC0; - D_801A8DEC = D_801A8DBC; - D_801A8DC0 = 1; - D_801A8DBC = 0; -} - - - -extern s32 D_801A8DE8; -extern s32 D_801A8DEC; -extern s32 D_801A8DC0; -extern s32 D_801A8DBC; - -void func_8013CB5C(void) { - D_801A8DC0 = D_801A8DE8; - D_801A8DBC = D_801A8DEC; -} - - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AA6E0; - extern u8 D_801AA6E1; - extern u8 D_801AA6E2; - extern u8 D_801AA6E3; - extern u8 D_801AA6E4; - extern u8 D_801AA6E5; - extern u8 D_801AA6E6; - extern u8 D_801AA6E7; - extern u8 D_801AA6E8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AA6E0; t1 = D_801AA6E1; t2 = D_801AA6E2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AA6E3; t1 = D_801AA6E4; t2 = D_801AA6E5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AA6E6; t1 = D_801AA6E7; t2 = D_801AA6E8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A8DC8; -extern s32 D_801A8DB0; -extern s32 D_801A8DCC; -extern s32 D_801A8DBC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A8DC8 != 0) { - if (D_801A8DC8 != 2) { - if (((D_801A8DC8 < 3) && (D_801A8DC8 == 1)) && - (D_801A8DCC = D_801A8DCC + 1, 0x23a < D_801A8DCC)) { - D_801A8DB0 = D_801A8DC8; - D_801A8DC8 = 2; - } - } else { - D_801A8DB0 = D_801A8DB0 + -1; - if (D_801A8DB0 == 0) { - D_801A8DB0 = D_801A8DC8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A8DBC == 0) { - D_801A8DC8 = D_801A8DC8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A8DBC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A8DBC; -} - - - -extern s32 D_801A8DC8; - -void func_8013D164(void) { - D_801A8DC8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AA7C2; -extern u8 D_801AA836; -extern u8 D_801AA6EA; -extern u8 D_801AA7A4; -extern u8 D_801AA6C8; -extern u8 D_801AA6E9; -extern s32 D_801AA7A8; - -void func_8013D330(void) { - if ((D_801AA7C2 & 0xff) != D_801AA836) { - D_801AA7C2 = ((D_801AA7C2 & 0xff) < D_801AA836) ? (D_801AA7C2 + 1) : (D_801AA7C2 - 1); - } - if ((D_801AA6EA & 0xff) != D_801AA7A4) { - D_801AA6EA = ((D_801AA6EA & 0xff) < D_801AA7A4) ? (D_801AA6EA + 1) : (D_801AA6EA - 1); - } - if ((D_801AA6C8 & 0xff) != D_801AA6E9) { - D_801AA6C8 = ((D_801AA6C8 & 0xff) < D_801AA6E9) ? (D_801AA6C8 + 1) : (D_801AA6C8 - 1); - } - D_801AA7A8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A8DA0; -extern void *D_801A8DA4; -extern void *D_801A8DA8; -extern s32 D_801A8DD0; -extern s32 D_801A8DD4; -extern s32 D_801A8DD8; -extern s32 D_801AA71C[]; - -extern u8 D_80186054[]; -extern u8 D_801860FC[]; -extern u8 D_80185FAC[]; -extern u8 D_801860A8[]; -extern u8 D_80186128[]; -extern u8 D_80186000[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A8DD0 = param_2; - D_801A8DD4 = (param_2 >> 2) & 3; - D_801A8DD8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A8DA0 = D_80186054; - D_801A8DA4 = D_801860FC; - D_801A8DA8 = D_80185FAC; - } else { - D_801A8DA0 = D_801860A8; - D_801A8DA4 = D_80186128; - D_801A8DA8 = D_80186000; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A8DD8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A8DD0 & 2) != 0) { - D_801AA71C[0] = 0x140; - D_801AA71C[3] = 0x80; - if (p[0x37] == 4) { - D_801AA71C[0] = 0x140; - D_801AA71C[3] = 0; - } - if (p[0x37] == 0) { - D_801AA71C[0] = 0x140; - D_801AA71C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A8DA8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A8DA8; -extern s16 *D_801A8DAC; -extern s32 D_801A8DBC; -extern s32 D_801A8DDC; -extern s32 D_801A8DE0; -extern s32 D_801A8DE4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A8DAC != 0) { - D_801A8DBC = 0; - p = (int *)(param_1 * 12 + (int)D_801A8DA8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A8DDC != x) { - flag = 1; - if (D_801A8DDC < x) { - if (x - D_801A8DDC < 5) { - D_801A8DDC = x; - } else { - D_801A8DDC = D_801A8DDC + 4; - } - } else { - if (D_801A8DDC - x < 5) { - D_801A8DDC = x; - } else { - D_801A8DDC = D_801A8DDC - 4; - } - } - } - if (D_801A8DE0 != y) { - flag = 1; - if (D_801A8DE0 < y) { - if (y - D_801A8DE0 < 5) { - D_801A8DE0 = y; - } else { - D_801A8DE0 = D_801A8DE0 + 4; - } - } else { - if (D_801A8DE0 - y < 5) { - D_801A8DE0 = y; - } else { - D_801A8DE0 = D_801A8DE0 - 4; - } - } - } - if (D_801A8DE4 != z) { - flag = 1; - if (D_801A8DE4 < z) { - if (z - D_801A8DE4 < 5) { - D_801A8DE4 = z; - } else { - D_801A8DE4 = D_801A8DE4 + 4; - } - } else { - if (D_801A8DE4 - z < 5) { - D_801A8DE4 = z; - } else { - D_801A8DE4 = D_801A8DE4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A8DBC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801861B8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A8DAC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A8DDC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A8DE0); - uVar5 = (*(int*)&D_801A8DE4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801861B8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A8DC4; - -s32 func_8013E054(void) { - return D_801A8DC4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186BB4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186B8C; -extern s16 D_80186B8E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186BB4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186B8C = 2; - D_80186B8E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186B8E = 0; - D_80186B8C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A8DF8; - extern void * D_801A8DFC; - extern unsigned char D_8018682C; - extern unsigned char D_80186844; - extern unsigned char D_801868B8; - extern unsigned char D_801868C0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A8DF8 = &D_8018682C; - D_801A8DFC = &D_801868B8; - } else { - D_801A8DF8 = &D_80186844; - D_801A8DFC = &D_801868C0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186BB4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186BB4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186BB4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186B90; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186B90)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186B90)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186B8C; -extern s16 D_80186B8E; -extern unsigned char D_80186B90; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186B8E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186B8C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186B8E; - if (*r < 3) { - *r = *r + 1; - } - D_80186B8C = (u16)D_80186B8C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186B90); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186B90; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186B90); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_008/ov_SC06_008_jr_801380E0.c b/src/ov_SC06_008/ov_SC06_008_jr_801380E0.c new file mode 100644 index 000000000..d630c44c0 --- /dev/null +++ b/src/ov_SC06_008/ov_SC06_008_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A7B50; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80185AAC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A8CB4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AA7C8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A7B50; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801857E8)(); +extern s16 (*D_801857EC)(); +extern M2C_UNK (*D_801857F4)(); +extern s32 (*D_801857F8)(); +extern s32 D_801A8CB0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A7B54; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80185B40; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80189024; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80185B58; +extern M2C_UNK D_80185B60; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80185B68; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185B84[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185B90[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185BA4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185BF4[]; +extern s16 D_80185C24[]; +extern s16 D_80185C84[]; +extern s16 D_80185C8C[]; +extern s16 D_80185CAC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80185CE4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185D3C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185D84[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185D8C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185D94[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185D9C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80185D44; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80185D64; +extern void func_801321B0(int param_1); +extern int D_80185D74; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A8D20; +extern s32 D_801A8D24[]; +extern int D_801A8D28; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185DA8; +extern u8 D_80185DA4; +extern s16 *D_80185DAC; +extern u8 D_80185DB0; +extern int D_801A8D20; +extern u16 D_801A8D30; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185DAC; /* holds a pointer value (*(u16**)&D_80185DAC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185DC0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185E14; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185E18[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185E18[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80185E5C; +extern u8 D_80185EA0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80185E5C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80185EA0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80185EE4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80185F20[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80185F20; + if (((s16)a1) < 0xC00) { + tbl = D_80185EE4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80185F5C, D_80185F5E, D_80185F60, D_80185F62, D_80185F64, D_80185F66; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80185F5E < ang)) goto outer_else; + if (!(ang < D_80185F64)) goto inner_else; + if (ang < D_80185F60) { *(s16 *)L = D_80185F60; goto done; } + if (D_80185F62 < ang) { *(s16 *)L = D_80185F62; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80185F5C) { *(s16 *)L = D_80185F5C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80185F66 < ang) { *(s16 *)L = D_80185F66; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A8D98; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A8D98, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A8D98; +extern s8 D_801A8D9C; +extern s8 D_801A8D9D; + +void func_8013C9C4(void * arg0) +{ + D_801A8D98 = arg0; + D_801A8D9C = 0; + D_801A8D9D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A8D98; +extern s8 D_801A8D9C; +extern s8 D_801A8D9D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A8D98; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A8D9D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A8D9C)) * 2) + D_801A8D98); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A8D9D = (unsigned char) p[1]; + D_801A8D9C = D_801A8D9C + 1; + if (D_801A8D9D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A8D9C = 0; + *base = 0; + } + } + else + { + D_801A8D9D = c - 1; + } + } + return; +} + + + +extern s32 D_801A8DBC; +extern s32 D_801A8DB0; +extern s32 D_801A8DB4; +extern s32 D_801A8DC0; + +void func_8013CABC(void) { + D_801A8DBC = 1; + D_801A8DB0 = 1; + D_801A8DB4 = 0; + D_801A8DC0 = 1; +} + + + +extern s32 D_801A8DB0; +extern s32 D_801A8DB4; +extern s32 D_801A8DB8; +extern s32 D_801A8DBC; +extern s32 D_801A8DC0; + +void func_8013CAE8(void) { + D_801A8DB0 = 1; + D_801A8DBC = 0; + D_801A8DB4 = 0; + D_801A8DB8 = -1; + D_801A8DC0 = 0; +} + + + +extern s32 D_801A8DBC; +extern s32 D_801A8DC0; +extern s32 D_801A8DE8; +extern s32 D_801A8DEC; + +void func_8013CB20(void) +{ + D_801A8DE8 = D_801A8DC0; + D_801A8DEC = D_801A8DBC; + D_801A8DC0 = 1; + D_801A8DBC = 0; +} + + + +extern s32 D_801A8DE8; +extern s32 D_801A8DEC; +extern s32 D_801A8DC0; +extern s32 D_801A8DBC; + +void func_8013CB5C(void) { + D_801A8DC0 = D_801A8DE8; + D_801A8DBC = D_801A8DEC; +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AA6E0; + extern u8 D_801AA6E1; + extern u8 D_801AA6E2; + extern u8 D_801AA6E3; + extern u8 D_801AA6E4; + extern u8 D_801AA6E5; + extern u8 D_801AA6E6; + extern u8 D_801AA6E7; + extern u8 D_801AA6E8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AA6E0; t1 = D_801AA6E1; t2 = D_801AA6E2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AA6E3; t1 = D_801AA6E4; t2 = D_801AA6E5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AA6E6; t1 = D_801AA6E7; t2 = D_801AA6E8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A8DC8; +extern s32 D_801A8DB0; +extern s32 D_801A8DCC; +extern s32 D_801A8DBC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A8DC8 != 0) { + if (D_801A8DC8 != 2) { + if (((D_801A8DC8 < 3) && (D_801A8DC8 == 1)) && + (D_801A8DCC = D_801A8DCC + 1, 0x23a < D_801A8DCC)) { + D_801A8DB0 = D_801A8DC8; + D_801A8DC8 = 2; + } + } else { + D_801A8DB0 = D_801A8DB0 + -1; + if (D_801A8DB0 == 0) { + D_801A8DB0 = D_801A8DC8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A8DBC == 0) { + D_801A8DC8 = D_801A8DC8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A8DBC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A8DBC; +} + + + +extern s32 D_801A8DC8; + +void func_8013D164(void) { + D_801A8DC8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AA7C2; +extern u8 D_801AA836; +extern u8 D_801AA6EA; +extern u8 D_801AA7A4; +extern u8 D_801AA6C8; +extern u8 D_801AA6E9; +extern s32 D_801AA7A8; + +void func_8013D330(void) { + if ((D_801AA7C2 & 0xff) != D_801AA836) { + D_801AA7C2 = ((D_801AA7C2 & 0xff) < D_801AA836) ? (D_801AA7C2 + 1) : (D_801AA7C2 - 1); + } + if ((D_801AA6EA & 0xff) != D_801AA7A4) { + D_801AA6EA = ((D_801AA6EA & 0xff) < D_801AA7A4) ? (D_801AA6EA + 1) : (D_801AA6EA - 1); + } + if ((D_801AA6C8 & 0xff) != D_801AA6E9) { + D_801AA6C8 = ((D_801AA6C8 & 0xff) < D_801AA6E9) ? (D_801AA6C8 + 1) : (D_801AA6C8 - 1); + } + D_801AA7A8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A8DA0; +extern void *D_801A8DA4; +extern void *D_801A8DA8; +extern s32 D_801A8DD0; +extern s32 D_801A8DD4; +extern s32 D_801A8DD8; +extern s32 D_801AA71C[]; + +extern u8 D_80186054[]; +extern u8 D_801860FC[]; +extern u8 D_80185FAC[]; +extern u8 D_801860A8[]; +extern u8 D_80186128[]; +extern u8 D_80186000[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A8DD0 = param_2; + D_801A8DD4 = (param_2 >> 2) & 3; + D_801A8DD8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A8DA0 = D_80186054; + D_801A8DA4 = D_801860FC; + D_801A8DA8 = D_80185FAC; + } else { + D_801A8DA0 = D_801860A8; + D_801A8DA4 = D_80186128; + D_801A8DA8 = D_80186000; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A8DD8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A8DD0 & 2) != 0) { + D_801AA71C[0] = 0x140; + D_801AA71C[3] = 0x80; + if (p[0x37] == 4) { + D_801AA71C[0] = 0x140; + D_801AA71C[3] = 0; + } + if (p[0x37] == 0) { + D_801AA71C[0] = 0x140; + D_801AA71C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A8DA8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A8DA8; +extern s16 *D_801A8DAC; +extern s32 D_801A8DBC; +extern s32 D_801A8DDC; +extern s32 D_801A8DE0; +extern s32 D_801A8DE4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A8DAC != 0) { + D_801A8DBC = 0; + p = (int *)(param_1 * 12 + (int)D_801A8DA8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A8DDC != x) { + flag = 1; + if (D_801A8DDC < x) { + if (x - D_801A8DDC < 5) { + D_801A8DDC = x; + } else { + D_801A8DDC = D_801A8DDC + 4; + } + } else { + if (D_801A8DDC - x < 5) { + D_801A8DDC = x; + } else { + D_801A8DDC = D_801A8DDC - 4; + } + } + } + if (D_801A8DE0 != y) { + flag = 1; + if (D_801A8DE0 < y) { + if (y - D_801A8DE0 < 5) { + D_801A8DE0 = y; + } else { + D_801A8DE0 = D_801A8DE0 + 4; + } + } else { + if (D_801A8DE0 - y < 5) { + D_801A8DE0 = y; + } else { + D_801A8DE0 = D_801A8DE0 - 4; + } + } + } + if (D_801A8DE4 != z) { + flag = 1; + if (D_801A8DE4 < z) { + if (z - D_801A8DE4 < 5) { + D_801A8DE4 = z; + } else { + D_801A8DE4 = D_801A8DE4 + 4; + } + } else { + if (D_801A8DE4 - z < 5) { + D_801A8DE4 = z; + } else { + D_801A8DE4 = D_801A8DE4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A8DBC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801861B8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A8DAC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A8DDC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A8DE0); + uVar5 = (*(int*)&D_801A8DE4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801861B8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A8DC4; + +s32 func_8013E054(void) { + return D_801A8DC4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186BB4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186B8C; +extern s16 D_80186B8E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186BB4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186B8C = 2; + D_80186B8E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186B8E = 0; + D_80186B8C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A8DF8; + extern void * D_801A8DFC; + extern unsigned char D_8018682C; + extern unsigned char D_80186844; + extern unsigned char D_801868B8; + extern unsigned char D_801868C0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A8DF8 = &D_8018682C; + D_801A8DFC = &D_801868B8; + } else { + D_801A8DF8 = &D_80186844; + D_801A8DFC = &D_801868C0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186BB4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186BB4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186BB4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186B90; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186B90)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186B90)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186B8C; +extern s16 D_80186B8E; +extern unsigned char D_80186B90; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186B8E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186B8C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186B8E; + if (*r < 3) { + *r = *r + 1; + } + D_80186B8C = (u16)D_80186B8C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186B90); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186B90; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186B90); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_008/nonmatchings/ov_SC06_008_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_010/ov_SC06_010.c b/src/ov_SC06_010/ov_SC06_010.c index 2cc85e510..2dff95383 100644 --- a/src/ov_SC06_010/ov_SC06_010.c +++ b/src/ov_SC06_010/ov_SC06_010.c @@ -521,4843 +521,3 @@ void func_8012ACA0(void *arg0) { M2C_FIELD(arg0, u16 *, 0x72) = (u16) (M2C_FIELD(arg0, u16 *, 0x72) & 0xF9FF); func_8012AAAC(); } - - - - -// @class: iv-combine -// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). -typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ -typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ - -s32 func_8012ACE0(void *o) { - int i; - for (i = 0; ; i++) { - switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { - case -2: - case -1: - case 0: - return i; - case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ - default: - break; - } - } -} - -DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ - -DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ - - - -void func_8012AD64(s32 *a0, s16 a1) { - *(s16*)((s32)a0 + 0x34) = a1; -} - - -DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ - -DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ - -DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ - -DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ - -DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ - -DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ - -DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ - -DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ - -DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ - -DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ - -DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ - -DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ - -DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ - -DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ - -DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ - -DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ - -DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012B4B8); - -DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ - -DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ - -DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ - -DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012B77C); - -DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ - -DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ - -DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ - -DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ - -DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ - -DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ - -DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ - -DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ - -DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ - -DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ - -DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ - -DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ - -DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ - -DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ - - -void func_8012BF4C(s32 *a0, s32 a1) { - *(s32*)((s32)a0 + 0x1C) = a1; -} - - -DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ - -DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ - -DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ - -DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ - -DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012C098); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012C0EC); - -DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ - -DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ - -DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ - -DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ - -DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ - -DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ - -DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ - -DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ - -DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ - -DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ - -DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012C658); - -DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012C750); - -DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to -// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS -// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via -// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store -// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. -// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). - -extern s32 D_8018A200; -extern s16 D_801270C4; -extern u16 D_801274E4[]; -extern s32 D_8011DB08; -extern void func_80016714(void *a0, s32 a1); - -s32 func_8012C890(s32 a0, s32 a1, s32 a2) { - u8 *src = (u8 *)a0; - u8 *dst = (u8 *)a1; - u16 *d; - s16 count; - u16 v2, v4; - s32 v10; - void *obj; - - *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); - v2 = *(u16 *)(src + 0x0); - *(u16 *)(dst + 0x6) = v2; - *(u16 *)(dst + 0x88) = v2; - v2 = *(u16 *)(src + 0x2); - *(u16 *)(dst + 0xA) = v2; - *(u16 *)(dst + 0x8A) = v2; - v4 = *(u16 *)(src + 0x4); - *(u16 *)(dst + 0xC) = 0; - *(u16 *)(dst + 0x8) = 0; - *(u16 *)(dst + 0x4) = 0; - *(u16 *)(dst + 0xE) = v4; - *(u16 *)(dst + 0x8C) = v4; - *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); - *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; - *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); - v10 = *(s32 *)(src + 0x10); - *(s32 *)(dst + 0x78) = (s32)&D_8018A200; - *(s32 *)(dst + 0xDC) = v10; - - { - register u16 *pc __asm__("$3"); - pc = &(*(u16 *)&D_801270C4); - *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; - count = *(volatile u16 *)pc + 1; - *pc = count; - if (count == 0) { - *pc = 1; - } - } - - if (a2 != 0) { - *(s32 *)(dst + 0x64) = a2; - *(s32 *)(dst + 0x68) = 0; - } else { - *(s32 *)(dst + 0x64) = 0; - *(s32 *)(dst + 0x68) = (s32)src; - } - - *(u16 *)(src + 0xA) |= 0x8000; - *(u16 *)(dst + 0x2) = 0; - d = D_801274E4; - *d &= 0xFFFE; - (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); - - if (*d & 1) { - s32 a1v; - obj = *(void **)(dst + 0x20); - if (obj != 0) { - s32 t = *(u16 *)obj; - if (t != 1) { - if (t != 2) { - goto done; - } - a1v = 0x38; - } else { - a1v = 0x84; - } - func_80016714(obj, a1v); - done:; - } - func_80016714(dst, 0x10C); - *(u16 *)(src + 0xA) &= 0x7FFF; - return 0; - } - - if (*(s32 *)(dst + 0x64) == 0) { - void *o = *(void **)(dst + 0x20); - if (o == 0) { - return (s32)dst; - } - if (*(u16 *)o == 1) { - s16 c = *(s16 *)(src + 0xC); - if (c != 0x7FFF) { - *(s16 *)((u8 *)o + 0x12) = c; - } - } - } - if (*(s32 *)(dst + 0x20) != 0) { - *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); - *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); - } - return (s32)dst; -} - - -DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ - -DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ - -DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ - -DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ - -DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ - -DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ - -DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ - -DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012CC88); - -DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ - -DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ - -DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ - -DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ - -DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ - -DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ - -DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ - -DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ - -DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ - -DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ - -DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH - - -struct S8012D664_8012D664 { short a, b, c; }; - -int func_8012D664(int arg0, int arg1, int arg2) { - extern int func_8012F568(); - extern int D_80186D2C; - - struct S8012D664_8012D664 s; - int ret; - int t; - - s.a = (*(unsigned short*)&D_80126B5E); - s.b = (*(unsigned short*)&D_80126B62) - 0x40; - s.c = (*(unsigned short*)&D_80126B66); - ret = ((int(*)())func_800132BC)(arg0, &s); - t = arg1 + 0x20; - if (ret < t * t) { - func_8012F568(1, 1, 0, arg2, arg0, &D_80186D2C); - return 1; - } - return 0; -} - - - -DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ - - - -extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); -extern void func_8014C978(void); -extern M2C_UNK D_80186D34; -extern M2C_UNK D_80186D3C; - -s32 func_8012DB84(void) -{ - func_8014C978(); - func_8012F568(1, 0xC001, 0, 0x3E8, &D_80186D34, &D_80186D3C); -} - - -DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH - - -typedef struct Entry_8012DDA4 { - u16 active; - unsigned char pad[0x10C - 2]; -} Entry_8012DDA4; - - -s32 func_8012DDA4() -{ - extern Entry_8012DDA4 * D_801B0D0C; - extern Entry_8012DDA4 * D_801B0D08; - - Entry_8012DDA4 *p; - Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); - - while (D_801B0D0C != end) { - p = D_801B0D0C; - if (p->active != 0 && p != D_801B0D08) { - D_801B0D0C = p + 1; - return p; - } - D_801B0D0C++; - } - D_801B0D0C = 0; - return 0; -} - - - -// @class: plumbing -// @stuck: none — MATCH (35/35 ins, relocation-masked) - - -s32 func_8012DE2C(s32 a0) { - extern u8 * D_801B0D0C; - extern u8 * D_801B0D08; - - u8 *base; - u8 *end; - u8 *p; - - base = D_801202A0; - end = base + 0x6480; - D_801B0D0C = base; - D_801B0D08 = ((u8 *)a0); - - while (D_801B0D0C != end) { - p = D_801B0D0C; - if (*(u16 *)p != 0 && p != ((u8 *)a0)) { - D_801B0D0C = p + 0x10C; - return p; - } - D_801B0D0C += 0x10C; - } - D_801B0D0C = 0; - return 0; -} - - - -DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ - -DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ - -DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ - -DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ - -DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012E014); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012E138); - - -s32 func_8012E27C(void) { - return 1; -} - - -DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ - -DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ - -DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012E364); - -DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ - -DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ - -DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ - -DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ - -DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH -extern u8 D_800AF648; -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) -{ - struct { short xy[2]; int sp14; int flag; } f; - register void *p __asm__("$4"); - p = &D_800AF648; - func_8004914C(p); - func_800491AC(&D_800AF648); - RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); - if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { - func_8002D4C8(param_2, param_3); - } -} - - -DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012E778); - -DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ - -DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ - -DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ - -DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ - - - -// @class: other -// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) - -extern void func_8016AA50(int, int); -extern void func_8016B428(int); -extern void func_80019064(void *); -extern int D_80186D44; - -void func_8012E9C0(int param_1) -{ - int iVar1; - - if (*(short *)(param_1 + 0x60) != 0) { - if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { - *(short *)(param_1 + 0x82) = 0; - *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); - *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); - *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); - } - if (*(int *)(param_1 + 0x78) != 0) { - iVar1 = *(short *)(param_1 + 0x60) * - *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; - if (iVar1 < 1) { - iVar1 = 1; - } - } else { - iVar1 = *(short *)(param_1 + 0x60); - } - func_8016AA50(param_1, iVar1); - if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { - func_8016B428(param_1); - func_80019064(&D_80186D44); - } - } - return; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012EA90); - -DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ - -DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ - -DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ - -DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012EFB8); - - -// @class: other -// @stuck: none — MATCH (33 ins, match_one verified) - -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); - -void func_8012F038(int param_1, short *param_2, short *param_3) { - int in[3]; - int out[3]; - - in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); - in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); - in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); - ApplyTransposeMatrixLV((void *)param_1, in, out); - param_3[0] = out[0]; - param_3[1] = out[1]; - param_3[2] = out[2]; -} - - -DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern void RotTransSV(s32 a0, s32 a1, void *a2); - -void func_8012F14C(s32 a0, s32 a1, s32 a2) -{ - s32 buf[2]; - func_8004914C((void *)a0); - func_800491AC((void *)a0); - RotTransSV(a1, a2, buf); -} - - -DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ - -DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012F274); - -DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ - -DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012F40C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8012F49C); - -DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ - -DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ - -DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ - -DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ - -DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) -extern void func_80131170(); -extern void func_80131CA8(); -extern unsigned char D_80186D60[]; - -void func_8012F828(int param_1) -{ - *(unsigned char *)(param_1 + 0xC1) = 4; - if (*(unsigned int *)(param_1 + 0xB4) & 8) { - func_80131170(param_1, D_80186D60, 0xB); - } - func_80131CA8(param_1, 9); -} - - -DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ - - -extern void func_80131170(s32 a0, s32 a1, s32 a2); -extern void func_80131CA8(int a0, int a1); -extern u8 D_80186D6C[]; - -void func_8012F8C8(u8* arg0) { - *(u8*)(arg0 + 0xC1) = 7; - if (*(u32*)(arg0 + 0xB4) & 0x80) { - ((void (*)(void*, void*, s32))func_80131170)(arg0, D_80186D6C, 0xB); - } - ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); -} - - -DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ - -DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ - -DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ - -DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ - -DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. -// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for -// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be -// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an -// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). -// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: -// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. -// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which -// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because -// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. -// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out -// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, -// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what -// blocks reorg from sharing a downstream constant into a branch delay slot.) - - -s32 func_8012FCC4(s32 param_1) { - extern int D_80186D78; - - int v1 = *(int *)(((int)param_1) + 0xC4); - *(char *)(((int)param_1) + 0xC1) = 8; - if (v1 & 2) { - *(char *)(((int)param_1) + 0xC1) = 1; - func_80131CA8(((int)param_1), 3); - return; - } - if (v1 & 1) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 1); - return; - } - if (*(int *)(((int)param_1) + 0xB4) & 0x100) { - ((void (*)(int))func_80131B14)(((int)param_1)); - if (*(short *)(((int)param_1) + 0x76) <= 0) { - ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); - return; - } - if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { - *(char *)(((int)param_1) + 0xC2) = 0; - } else { - *(short *)(((int)param_1) + 0x98) = 0; - *(char *)(((int)param_1) + 0xC2) = 1; - } - ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_80186D78); - *(int *)(((int)param_1) + 0x1C) = 0; - func_80131CA8(((int)param_1), 0x1C); - return; - } - func_80131CA8(((int)param_1), 0x1C); -} - - - -DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ - -DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ - -DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ - -DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ - -DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ - -DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ - -DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ - -DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ - -DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ - -DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ - -DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ - -DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ - -DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ - -DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ - -DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ - -DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ - -DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80130650); - -DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ - -DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ - -DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ - -DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ - -DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ - -DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80130A18); - -DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ - -DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80130C08); - - -extern void (*D_80186D80[])(void); - -void func_80130D0C(void *a0) { - D_80186D80[*(u8 *)((s32)a0 + 0xC1)](); -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). -extern s32 rand(void); -extern u8 D_80078E78[]; -extern u16 D_80078EB2; -extern u16 D_80078EB4; -extern s16 D_80186DD0[]; -extern s16 D_80186E00[]; -extern s16 D_80186E60[]; -extern s16 D_80186E68[]; -extern s16 D_80186E88[]; - -void func_80130D48(s32 arg0) -{ - register s16 *tbl __asm__("$16"); - register s32 pa __asm__("$18") = arg0; - register u8 *p __asm__("$19") = D_80078E78; - s32 s1v; - s32 call_a0; - s32 call_a1; - s32 cnt; - s32 r; - void *ret; - - s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); - if (s1v == 0) { - return; - } - - if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - } - - switch (s1v & 0xFFFF0000) { - case 0x10000: { - u32 x = D_80078EB4; - u32 y = D_80078EB2; - u32 b; - u32 a; - - s1v = 0; - if (x == y) { - s1v = 0xC; - } else if ((y >> 1) >= x) { - s1v = 3; - } - - b = *(u16 *)(p + 0x40); - a = *(u16 *)(p + 0x3E); - if (b == a) { - s1v += 0x18; - } else if ((a >> 1) >= b) { - s1v += 6; - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E00; tbl = (s16 *)(bp + v1); } - - r = rand() % 100; - cnt = 0; - loop27: - if (r >= *tbl) { - cnt += 1; - tbl += 1; - if (cnt < 3) { - goto loop27; - } - } - - s1v = 0; - switch (cnt) { - case 0: - tbl = D_80186E60; - s1v = 0x31; - break; - case 1: { - s32 mx = *(u16 *)(p + 0x3A); - s32 cur = *(u16 *)(p + 0x3C); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E68; tbl = (s16 *)(bp + v1); } - s1v = 0x32; - break; - } - case 2: { - s32 mx = *(u16 *)(p + 0x3E); - s32 cur = *(u16 *)(p + 0x40); - if (((mx * 7) / 10) >= cur) { - s1v = 4; - if ((mx / 2) >= cur) { - s1v = 8; - if ((mx / 5) >= cur) { - s1v = 0xC; - } - } - } - { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E88; tbl = (s16 *)(bp + v1); } - s1v = 0x33; - break; - } - } - - r = rand() % 100; - call_a1 = 0; - loop50: - if (r >= *tbl) { - call_a1 += 1; - tbl += 1; - if (call_a1 < 4) { - goto loop50; - } - } - call_a0 = s1v; - goto do_call; - } - case 0x20000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x30000: - call_a0 = 0x31; - call_a1 = 0; - goto do_call; - case 0x40000: - call_a0 = 0x32; - call_a1 = 0; - goto do_call; - case 0x50000: - call_a0 = 0x33; - call_a1 = 0; - goto do_call; - case 0x60000: { - s32 rr = rand() & 0xFF; - tbl = D_80186DD0; - if (rr >= *tbl) { - do { - tbl += 3; - } while (rr >= *tbl); - } - call_a0 = tbl[1]; - if (*(u16 *)(p + 0x40) < 4U) { - call_a0 = 0x33; - } - call_a1 = tbl[2]; - goto do_call; - } - case 0x70000: - call_a0 = 0x27B; - call_a1 = 0; - goto do_call; - default: - return; - } - -do_call: - ret = func_8012C658(call_a0, call_a1, pa); - if (ret != 0) { - *(u16 *)((s8 *)ret + 0xA) -= 0x20; - } -} - - -// @class: loop-guard -// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps -// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` -// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); -// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's -// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC -// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). - - -void func_80131170(s32 p, s32 b, s32 c) { - extern u8 D_80186D54[]; - - func_80131B14(); - *(u8 *)(((u8 *)p) + 0xC2) = 0; - *(u8 *)(((u8 *)p) + 0xC3) = 0; - *(s16 *)(((u8 *)p) + 0x98) = 0; - if (((u8 *)b) == 0) { - ((u8 *)b) = D_80186D54; - } - func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); - *(s32 *)(((u8 *)p) + 0x1C) = 0; - if (c != 0) { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } else { - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; - *(s32 *)(((u8 *)p) + 0xC4) &= ~4; - if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { - *(s32 *)(((u8 *)p) + 0xC4) |= 4; - } else { - *(s16 *)(((u8 *)p) + 0x98) = 0; - } - } -tail: - if (*(s16 *)(((u8 *)p) + 0x76) > 0) { - return; - } - if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); - } else { - if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; - ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); - } -} - - - -// @class: struct -// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) - -typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ - - -s32 func_801312D0(s32 param_1, void *param_2) -{ - extern int func_80131CF4(int, int); - extern M8_801312D0 D_80186EA8; - - int iVar5; - - iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); - if (iVar5 != 0) { - ((short *)param_2)[2] = 0; - ((short *)param_2)[0] = 0; - ((short *)param_2)[1] = (short)iVar5; - } else { - *(M8_801312D0 *)((short *)param_2) = D_80186EA8; - } -} - - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80131340); - -DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80131A34); - -DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` -// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be -// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a -// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). -// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; -// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the -// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); -// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. - -void func_80131B14() { - extern void func_8002A520(void *); - extern void func_8002A790(void *); - extern u8 D_80186EB0; - - register u8 *a0v __asm__("$4"); - u8 *p = a0v; - - - s32 e = *(u8 *)(p + 0x5E); - - if (*(s16 *)(p + 0x60) != 0) { - if (e == 0x1D) { - *(s16 *)(p + 0x82) = 0; - *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); - *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); - *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); - } - { - s32 dec; - s32 q = *(s32 *)(p + 0x78); - if (q != 0) { - dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; - if (dec <= 0) dec = 1; - } - *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; - } - ((void (*)(void *))func_8016AA50)(p); - if (*(u16 *)(p + 0x82) & 1) { - ((void (*)(void *))func_8016B428)(p); - ((void(*)(void *))func_80019064)(&D_80186EB0); - } - } - - *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; - - if (e != 0x1D) { - if (*(u8 *)(p + 0xC8)) func_8002A520(p); - if (*(u8 *)(p + 0xC9)) func_8002A790(p); - } - - if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; - - { - s32 r = *(s32 *)(p + 0x20); - *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; - { - s32 r2 = *(s32 *)(p + 0x20); - *(s16 *)(r2 + 0x14) = 0; - *(s16 *)(r2 + 0x10) = 0; - } - } - - ((void (*)(void *))func_8012B2CC)(p); - ((void (*)(void *))func_8012B23C)(p); -} - - - -DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80131CA8); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80131CF4); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80131D68); - - -extern void (*D_80186EC0[])(struct S80131E00 *a0); - -void func_80131E00(struct S80131E00 *a0, s32 a1) { - a0->field_B0 = a1; - D_80186EC0[a1](a0); -} - - -DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ - -DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ - -DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ - - -extern void (*D_80186F18[])(void); - -void func_80131EEC(void *a0) { - D_80186F18[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80186F60[])(void); - -void func_80131F28(void *a0) { - D_80186F60[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80186F68[])(void); - -void func_80131F64(void *a0) { - D_80186F68[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80186F70[])(void); - -void func_80131FA0(void *a0) { - D_80186F70[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80186F78[])(void); - -void func_80131FDC(void *a0) { - D_80186F78[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80132018); - -DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80186F20; - -void func_801320D8(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80186F20; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -s32 func_80132144(s32 param_1) -{ - extern int D_80186F30; - - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(((int)param_1) + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(((int)param_1)); - } else { - ((void(*)(int, int))func_8001C214)(v0, 0); - *(int *)(((int)param_1) + 0x58) = (int)&D_80186F30; - *(short *)(((int)param_1) + 0x5c) = 0x80; - *(unsigned short *)(((int)param_1) + 2) += 1; - } -} - - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80186F40; - -void func_801321B0(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80186F40; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(int, int); -extern int D_80186F50; - -void func_8013221C(int param_1) -{ - int v0; - - v0 = ((int (*)(void))func_8012C1B8)(); - *(int *)(param_1 + 0x20) = v0; - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - func_8001C214(v0, 0); - *(int *)(param_1 + 0x58) = (int)&D_80186F50; - *(short *)(param_1 + 0x5c) = 0x80; - *(unsigned short *)(param_1 + 2) += 1; - } -} - - -DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ - -DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801325B8); - -DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ - -DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ - -DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ - -DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ - -DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ - -DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80132F40); - -DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801330E0); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80133298); - -DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ - -DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH - -extern s32 D_801B0D58; -extern s32 D_801B0D5C[]; -extern int D_801B0D60; -extern void func_80136BC4(s32 a0); - -void func_801336E8(void *a0, int a1, int a2) { - if (a0 != 0) { - (*(void * *)&D_801B0D58) = a0; - ((void (*)(void))func_80136BC4)(); - } - (*(int *)&D_801B0D5C) = a1; - D_801B0D60 = a2; -} - - - - -extern s32 D_801B0D5C[]; -extern s32 D_801B0D58; -extern void func_80136BC4(s32); - -void func_8013373C(s16 arg0) { - s32 temp = D_801B0D5C[arg0]; - if (temp != 0) { - D_801B0D58 = temp; - func_80136BC4(temp); - } -} - - -// @class: regalloc-order -#include "common.h" - -typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; - - -s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { - extern s32 func_80047D3C(s32); - extern s32 func_80133AB0(s16, s16, s16, s32); - extern Box_80133784 * D_80186F80; - extern Box_80133784 * D_80186F84; - extern s16 D_801B0D64; - extern u16 D_801B0D68; - - register s32 s1 __asm__("$17"); - s32 s2; - register s16 s3 __asm__("$19"); - register s32 s4 __asm__("$20"); - register s16 a0v __asm__("$4"); - register s16 arg0s __asm__("$21"); - s32 dx, dy, dz; - s32 r, ret; - - a0v = ((s16)arg0); - s1 = 0; - s3 = 0; - s4 = 0; - s2 = 0; - arg0s = a0v; - D_80186F80->f6 = -0x7FFF; - D_80186F84->f6 = 0x7FFF; - D_80186F80->f0 = ((Box_80133784 *)arg1)->f0; - D_80186F80->f4 = ((Box_80133784 *)arg1)->f4; - D_80186F84->f0 = ((Box_80133784 *)arg2)->f0; - D_80186F84->f4 = ((Box_80133784 *)arg2)->f4; - D_801B0D68 = 0; - D_801B0D64 = 0; - - if ((s16)a0v == 0) { - s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; - s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; - s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; - if (sx == 0 && sy == 0) { - s32 zt = (sz == 0); - __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); - } - D_80186F80->f2 = ((Box_80133784 *)arg1)->f2 - 4; - r = func_80047D3C(sx * sx + sz * sz); - if (r < 3) { - r = 4; - } else if (r < 5) { - r += 1; - } - D_80186F84->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; - } else { - D_80186F80->f2 = ((Box_80133784 *)arg1)->f2; - if ((s16)a0v == 2) { - D_80186F84->f0 = D_80186F80->f0; - D_80186F84->f2 = D_80186F80->f2 + 6; - s2 = 1; - D_80186F84->f4 = D_80186F80->f4; - } else { - D_80186F84->f2 = ((Box_80133784 *)arg2)->f2; - } - } - - while (1) { - s32 ret0; - register s32 retc __asm__("$3"); - __asm__ __volatile__(""); - ret0 = func_80133AB0(arg0s, (s16)D_80186F80->f0, (s16)D_80186F80->f4, (*(s32*)&D_801B0D58)); - __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); - ret = retc; - if (ret == 0) goto after; - s4 |= ret; - if (s2 != 0) goto after; - { - s16 oldc = s3; - s3 = s3 + 1; - if (oldc >= 5) break; - } - } - - D_80186F84->f0 = D_80186F80->f0; - D_80186F84->f2 = D_80186F80->f2; - s1 = 0x2000; - D_80186F84->f4 = D_80186F80->f4; - goto store_out; - -after: - if ((s16)s4 != 0 || D_801B0D64 != 0) { - s16 t; - __asm__ __volatile__("" :: "r"(s4)); - t = D_80186F80->f6; - if (t >= -0xBCB) { - if (t < -0x578) { - s1 |= 0x4000; - } else { - s1 |= 0x8000; - } - } - if ((s16)D_80186F84->f6 < -0xBCB) { - s1 |= 0x2000; - } - store_out: - ((Box_80133784 *)arg2)->f0 = D_80186F84->f0; - ((Box_80133784 *)arg2)->f2 = D_80186F84->f2; - ((Box_80133784 *)arg2)->f4 = D_80186F84->f4; - ((Box_80133784 *)arg2)->f6 = D_801B0D68; - return s1 & 0xFFFF; - } - ((Box_80133784 *)arg2)->f6 = D_801B0D68; - return 0; -} - - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80133AB0); - - -s32 func_80133CD4(arg0, cmd, base, arr) - s16 arg0; - s16 *cmd; - s16 *base; - s32 *arr; -{ - typedef struct { s16 e[4]; } ElemK; - - extern u16 *D_80186F84; - extern u16 *D_80186F80; - extern s16 *D_80186F8C; - extern s16 *D_80186F88; - extern s32 *D_80186F94; - extern s32 *D_80186F98; - extern u16 D_801B0D68; - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern u16 D_801152AE; - extern u8 D_801152B0; - extern s32 func_80134310(); - extern s32 func_8013435C(); - - s16 *s3 = ((ElemK *)base)[cmd[1]].e; - s32 s6 = arr[cmd[2]]; - s32 s0var, s1var; - s32 s2a; - s16 y; - - if (func_80134310(s3, D_80186F84, s6) >= 0) - return 0; - - s1var = func_80134310(s3, D_80186F80, s6); - if (s1var < 0) - return 0; - - s0var = func_80134310(s3, D_80186F8C, 0); - { - u16 *pac = D_80186F80; - s16 *pb8 = D_80186F8C; - s16 *pb4 = D_80186F88; - s32 neg = -s1var; - pb4[0] = pac[0] + neg * pb8[0] / s0var; - pb4[1] = pac[1] + neg * pb8[1] / s0var; - pb4[2] = pac[2] + neg * pb8[2] / s0var; - if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) - return 0; - } - if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80186F88, arr[cmd[6]], s3)) - return 0; - if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80186F88, arr[cmd[8]], s3)) - return 0; - if (arg0 < 0) { - if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80186F88, arr[cmd[10]], s3)) - return 0; - } - if (arg0 & 0x10) { - if (*(u16 *)cmd & 0x100) - return 0; - } - if (*(u16 *)cmd & 0x200) { - D_801B0D68 = *(u16 *)cmd; - return 0; - } - - { - s32 ret = func_80134310(s3, D_80186F84, s6); - s32 *pc0; - s32 *pc4; - u16 *pb0; - s32 t, o2; - s32 q3v; - - { - s32 *pw = D_80186F94; - ((struct { s32 w; } *)pw)->w = s3[0]; - pw[1] = s3[1]; - pw[2] = s3[2]; - } - s1var = -ret; - - __asm__ __volatile__( - "lwc2 $9, 0(%0)\n" - "lwc2 $10, 4(%0)\n" - "lwc2 $11, 8(%0)\n" - "nop\n" - "nop\n" - "sqr 0\n" - : : "r"(D_80186F94) : "$9", "$10", "$11", "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"(D_80186F98) : "memory"); - - pc0 = D_80186F94; - pc4 = D_80186F98; - s0var = pc4[0] + pc4[1] + pc4[2]; - pb0 = D_80186F84; - pb0[0] += s1var * pc0[0] / s0var; - pb0[1] += s1var * pc0[1] / s0var; - q3v = s1var * pc0[2] / s0var; - - { - s32 h; - h = ((s16 *)pb0)[0]; - s1var = h << 16; - __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); - s0var = h << 16; - } - pb0[2] += q3v; - s2a = (s16)pb0[2] << 16; - - t = pc0[0] << 4; - pc0[0] = t; - if (t < 0) s1var |= 0xFFFF; - t = pc0[1] << 4; - pc0[1] = t; - if (t < 0) s0var |= 0xFFFF; - o2 = pc0[2]; - t = o2 << 4; - pc0[2] = t; - if (t < 0) s2a |= 0xFFFF; - s2a += o2 << 5; - s1var += pc0[0] << 1; - s0var += pc0[1] << 1; - - do { - s32 *pl = D_80186F94; - u16 *pb; - s1var += pl[0]; - s0var += pl[1]; - s2a += pl[2]; - pb = D_80186F84; - pb[0] = s1var >> 16; - pb[1] = s0var >> 16; - pb[2] = s2a >> 16; - ret = func_80134310(s3, pb, s6); - } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); - } - - y = s3[1]; - if (y >= -0xBCB) { - D_80186F80[3] = y; - { - typedef struct { s8 c[8]; } Blk8; - *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; - } - if (*(u8 *)cmd != 0) - goto ret1; - return -1; - } - { - typedef struct { u16 h; } H16; - u16 *s3u = (u16 *)s3; - u16 *bp = D_80186F84; - u16 w; - ((H16 *)D_801152A8)->h = s3u[0]; - w = s3u[1]; - bp[3] = w; - ((H16 *)&D_801152AA)->h = w; - ((H16 *)&D_801152AC)->h = s3u[2]; - ((H16 *)&D_801152AE)->h = s3u[3]; - } -ret1: - return 1; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80134310); - -DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (83 ins, relocation-masked) - - - -s32 func_801343C4(s32 angle, s32 p1, s32 p2) -{ - extern int func_80133AB0(int, s16, s16, int); - extern s16 * D_80186F80; - extern s16 * D_80186F84; - extern u16 D_801B0D68; - extern u16 D_801B0D64; - - s16 *pac; - s16 *pb0; - s16 *pacs, *pb0s; - u16 *pb0u; - int a1v, a2v, d94, b0; - int sangle = ((s16)angle); - - pac = D_80186F80; - d94 = D_801B0D58; - pb0 = D_80186F84; - pac[0] = ((u16 *)p1)[0]; - pac[1] = ((u16 *)p1)[1]; - pac[2] = ((u16 *)p1)[2]; - pb0[0] = ((u16 *)p2)[0]; - pb0[1] = ((u16 *)p2)[1]; - pb0[2] = ((u16 *)p2)[2]; - - a1v = pac[0]; a2v = pac[2]; - __asm__ __volatile__("" ::: "memory"); - D_801B0D68 = 0; - D_801B0D64 = 0; - if (func_80133AB0(sangle, a1v, a2v, d94)) { - setdst: - pb0u = (u16 *)D_80186F84; - ((u16 *)p2)[0] = pb0u[0]; - ((u16 *)p2)[1] = pb0u[1]; - ((u16 *)p2)[2] = pb0u[2]; - ((u16 *)p2)[3] = D_801B0D68; - return 1; - } - - pacs = D_80186F80; - pb0s = D_80186F84; - b0 = pb0s[0]; - if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && - (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { - return 0; - } - if (func_80133AB0(sangle, b0, pb0s[2], D_801B0D58)) { - goto setdst; - } - return 0; -} - - - -// @class: schedule -typedef struct { - u16 f0; /* 0x0 */ - u16 f2; /* 0x2 */ - u16 f4; /* 0x4 */ - s16 f6; /* 0x6 */ -} Foo_80134510_80134510; - - -s32 func_80134510(s32 param) { - extern s32 func_801345F8(s32); - extern Foo_80134510_80134510 * D_80186F80; - extern Foo_80134510_80134510 * D_80186F84; - extern Foo_80134510_80134510 * D_80186F88; - extern u16 D_801B0D68; - - - s32 ret = 0; - Foo_80134510_80134510 *b0 = D_80186F84; - Foo_80134510_80134510 *ac = D_80186F80; - u16 t0 = ((Foo_80134510_80134510 *)param)->f0; - u16 t2, t4; - - ((Foo_80134510_80134510 *)param)->f6 = 0; - ac->f0 = t0; - b0->f0 = t0; - t2 = ((Foo_80134510_80134510 *)param)->f2; - ac->f2 = t2 - 4; - b0->f2 = t2 + 0x2FC; - t4 = ((Foo_80134510_80134510 *)param)->f4; - ac->f4 = t4; - b0->f4 = t4; - - if (func_801345F8((*(s32*)&D_801B0D58)) != 0) { - s16 x; - ((Foo_80134510_80134510 *)param)->f2 = D_80186F88->f2 - 2; - x = D_80186F80->f6; - if (x >= -3019) { - if (x < -1400) { - ret = 0x4000; - } else { - ret = 0x8000; - } - } else { - ret = 0x2000; - } - D_80186F80->f6 = D_801B0D68; - } - return ret; -} - - - -// @class: regalloc-order -// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. - - -s32 func_801345F8(s32 arg) -{ - extern int func_801347A0(short, u16 *, int, int); - extern u16 * D_80186F80; - extern u16 D_801B0D68; - - register u16 *param_1 __asm__("$5") = ((u16 *)arg); - register u16 *cc __asm__("$4") = D_80186F80; - int c8000 = 0x8000; - register int zr __asm__("$0"); - u32 c1, c2, uVar6, uVar2, cnt, v14; - u16 *ptmp, *puVar4, *puVar7, uVar1; - int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; - - c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; - uVar6 = c1 + zr; - if ((c1 & 0xffff) < (u32)param_1[2]) { - c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; - uVar2 = c2 + zr; - if ((c2 & 0xffff) < (u32)param_1[3]) - goto do_mult; - return 0; - found: - D_801B0D68 = *puVar7; - return 1; - do_mult: - tbl = *(int *)(param_1 + 4); - uVar10 = *(int *)(param_1 + 6); - uVar3 = *(int *)(param_1 + 8); - iVar9 = *(int *)(param_1 + 0xc); - iVar8 = *(int *)(param_1 + 0xe); - ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); - cnt = (u32)ptmp[1]; - v14 = *(int *)(param_1 + 10); - puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; - while (((cnt-- + zr) & 0xffff) != 0) { - uVar1 = *puVar4; - hi = uVar1 & 0x8000; - harg = hi + zr; - if (hi == 0) - puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); - else - puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); - if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) - goto found; - puVar4 = puVar4 - 1; - } - } - return 0; -} - - - -// @class: regalloc-order -// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. -#include "common.h" - -typedef struct { - /* 0x00 */ u16 f0; - /* 0x02 */ s16 f2; - /* 0x04 */ s16 f4; - /* 0x06 */ s16 f6; - /* 0x08 */ s16 f8; - /* 0x0A */ s16 fa; - /* 0x0C */ s16 fc; - /* 0x0E */ s16 fe; - /* 0x10 */ s16 f10; - /* 0x12 */ s16 f12; - /* 0x14 */ s16 f14; -} S0_801347A0; - -typedef struct { - /* 0x0 */ s16 f0; - /* 0x2 */ s16 f2; - /* 0x4 */ s16 f4; - /* 0x6 */ s16 f6; -} Elem_801347A0; - -typedef struct { - /* 0x0 */ u16 f0; - /* 0x2 */ u16 f2; - /* 0x4 */ u16 f4; - /* 0x6 */ u16 f6; -} SVec_801347A0; - - - -s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); - extern s16 * D_80186F84; - extern SVec_801347A0 * D_80186F80; - extern SVec_801347A0 * D_80186F88; - - Elem_801347A0 *pElem; - s32 val; - register s32 iv __asm__("$4"); - s32 q; - s32 dvsr; - - pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; - val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; - if (func_80134A28((s32)pElem, (s32)D_80186F84, val) >= 0) { - return 0; - } - iv = func_80134A28((s32)pElem, (s32)D_80186F80, val); - if (iv < 0) { - return 0; - } - iv = -iv; - dvsr = pElem->f2 * 48; - q = (iv * 48) / dvsr; - D_80186F88->f0 = D_80186F80->f0; - D_80186F88->f2 = D_80186F80->f2 + q; - D_80186F88->f4 = D_80186F80->f4; - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { - return 0; - } - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { - return 0; - } - if ((s16)arg0) { - if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { - return 0; - } - } - if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { - return 0; - } - D_80186F88->f0 = D_80186F80->f0; - D_80186F88->f4 = D_80186F80->f4; - (*(Elem_801347A0*)D_801152A8) = *pElem; - D_80186F80->f6 = pElem->f2; - return 1; -} - - - -DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80134A74); - -// @class: regalloc-order -// @try: variant B — direct pins m=$s5($21), c=$s6($22) - - -s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); - extern void * D_80186F80; - extern void * D_80186F84; - extern void * D_80186F88; - extern void * D_80186F8C; - extern u16 D_801B0D68; - - s32 temp_a3; - s32 temp_s1; - s32 temp_v0; - s32 temp_v0_2; - s32 var_v0; - u16 temp_a1; - s32 temp_s4; - s32 c = arg0; - __asm__ __volatile__("" : "=r"(c) : "0"(c)); - __asm__ __volatile__("" : : "r"(arg0)); - - temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); - temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); - var_v0 = 0; - if (func_80134FB8(temp_s4, (s32) D_80186F84, temp_s1) >= 0) { - return var_v0; - } - temp_v0 = func_80134FB8(temp_s4, (s32) D_80186F80, temp_s1); - if (temp_v0 < 0) { - goto block_13; - } - temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80186F8C, 0); - temp_a3 = -temp_v0; - { - u16 *pB4 = (u16 *)D_80186F88; - u16 *pAC = (u16 *)D_80186F80; - s16 *pB8 = (s16 *)D_80186F8C; - pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; - pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; - pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { - return var_v0; - } - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80186F88, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { - return var_v0; - } - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80186F88, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { - return var_v0; - } - if ((arg0 << 16) < 0) { - var_v0 = 0; - if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80186F88, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { - return var_v0; - } - } - if (c & 1) { - if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { - goto block_14; - } - return 0; - } - temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); - if (!(temp_a1 & 0x200)) { - goto block_14; - } - D_801B0D68 = temp_a1; -block_13: - return 0; -block_14: - __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); - VectorNormalSS(D_80186F8C, D_80186F8C); - { - u16 *pB8 = (u16 *)D_80186F8C; - u16 *pB4b = (u16 *)D_80186F88; - pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); - var_v0 = 1; - pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); - pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); - } - return var_v0; -} - - - -DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ - -// @class: plumbing -// @stuck: MATCH (89 ins). To BANK: retype D_80186F84 + D_80186F80 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). - - - - -s32 func_80135004(s32 arg0, s32 p1, s32 p2) -{ - extern int func_80134A74(int, s16, s16, int); - extern s16 * D_80186F84; - extern s16 * D_80186F80; - extern u8 D_80186F8C; - extern s16 *D_80186F88; - extern u16 D_801B0D68; - - register s16 *pb0 __asm__("$9"); /* D_80186F84 -> $t1 */ - register s16 *pac __asm__("$6"); /* D_80186F80 -> $a2 */ - register s16 *pb8 __asm__("$8"); /* D_80186F8C -> $t0 */ - u16 *pb4; - u16 a, b; - int id; - int a1v, a2v, d94; - - pb0 = D_80186F84; - __asm__ __volatile__("" : : "r"(pb0)); - - a = ((u16 *)p2)[0]; pac = D_80186F80; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80186F8C); pac[0] = b; pb8[0] = a - b; - a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; - a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; - - id = ((int)arg0) & 0xFFFF; - a1v = pac[0]; a2v = pac[2]; d94 = D_801B0D58; - __asm__ __volatile__("" ::: "memory"); - D_801B0D68 = 0; - - if (func_80134A74(id, a1v, a2v, d94)) { - found: - pb4 = (*(u16 * *)&D_80186F88); - ((u16 *)p2)[0] = pb4[0]; - ((u16 *)p2)[1] = pb4[1]; - ((u16 *)p2)[2] = pb4[2]; - ((u16 *)p2)[3] = D_801B0D68; - return 1; - } - { - register u16 *qb __asm__("$4"); /* D_80186F80 -> $a0 (reloaded) */ - register int qa0 __asm__("$5"); /* D_80186F84[0], kept in $a1 for the 2nd-call arg */ - register u16 *qa __asm__("$6"); /* D_80186F84 -> $a2 (reloaded) */ - qb = (u16 *)D_80186F80; - qa = (u16 *)D_80186F84; - qa0 = qa[0]; - if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && - ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) - return 0; - if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801B0D58)) - goto found; - return 0; - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (62 ins, relocation-masked) - - -extern u8 D_80186F84; -extern u8 D_80186F80; -extern s16 *D_80186F88; -extern u8 D_80186F8C; -extern int D_801B0D58; -extern u16 D_801B0D68; - -extern int func_80134A74(int, s16, s16, int); - -int func_80135168(u16 arg0, u16 *p1, u16 *p2) -{ - register s16 *pb0 __asm__("$8"); - register s16 *pac __asm__("$6"); - register s16 *pb8 __asm__("$7"); - u16 *pb4; - u16 a, b; - int a1v, a2v, d94; - - pb0 = (*(s16 * *)&D_80186F84); - __asm__ __volatile__("" : : "r"(pb0)); - - a = p2[0]; pac = (*(s16 * *)&D_80186F80); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80186F8C); pac[0] = b; pb8[0] = a - b; - a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; - a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; - - a1v = pac[0]; a2v = pac[2]; d94 = D_801B0D58; - __asm__ __volatile__("" ::: "memory"); - D_801B0D68 = 0; - if (func_80134A74(arg0, a1v, a2v, d94)) { - pb4 = (*(u16 * *)&D_80186F88); - p2[0] = pb4[0]; - p2[1] = pb4[1]; - p2[2] = pb4[2]; - p2[3] = D_801B0D68; - return 1; - } - return 0; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80135260); - - -/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). - * - * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 - * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does - * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in - * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). - * - * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): - * the two output buffers D_80186F80 / D_80186F84 are written through a pointer in each of the two - * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a - * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also - * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each - * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks - * the lowest-free scratch over its OWN window: - * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) - * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) - * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail - * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. - * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades - * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the - * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. - * - * Zero file-scope footprint (block-scoped typedefs + externs; D_80186F80/B0 read via the ambient - * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for - * family_sweep --edit-remap with no cc1 crash. - * - * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. - */ -s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) -{ - typedef struct { s32 vx, vy, vz, pad; } Vec32; - typedef struct { s16 vx, vy, vz, pad; } Vec16; - typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; - extern void func_80048EAC(void *m0, void *m1); - extern void func_8004914C(void *m); - extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); - extern void ApplyRotMatrixLV(void *in, void *out); - extern void ApplyRotMatrix(void *in, void *out); - extern s32 D_801B0D6C, D_801B0D70, D_801B0D74, D_801B0D78; - extern s16 D_801B0D7C; - extern s32 D_801B0D8C; - extern s16 D_801B0D90, D_801B0D92, D_801B0D94, D_801B0D96, D_801B0D98, D_801B0D9A; - - Vec32 in0, in1, rotout; - Mat32 mat2; - Vec16 vecin; - s32 result; - s32 mode; - s32 q1, q2; - s32 p; - s32 t18, t1A, t1C; - s32 *m; - - in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); - in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); - if ((param_2 & 0x10000000) == 0) { - if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { - return 0; - } - } - mode = param_2 & 0x60000000; - if (mode != 0) { - result = 1; - if (param_2 >= 0) { - mode &= 0x40000000; - } - in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); - in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); - in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); - switch (mode) { - case 0x60000000: - m = &D_801B0D6C; - *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); - q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); - q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); - D_801B0D70 = 0; - D_801B0D78 = 0; - D_801B0D74 = q1; - D_801B0D7C = q2; - func_80048EAC((void *)((s32)param_1 + 0x34), m); - ApplyTransposeMatrixLV(m, &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - /* fallthrough */ - case 0x20000000: - p = (param_2 & 0xFFFFFFF) | 0x80000000; - t18 = *(s16 *)((s32)param_1 + 0x18); - t1A = *(s16 *)((s32)param_1 + 0x1A); - t1C = *(u16 *)((s32)param_1 + 0x1C); - mat2.w4 = 0; - mat2.wC = 0; - mat2.w0 = t18; - mat2.w8 = t1A; - mat2.h10 = t1C; - func_8004914C(&mat2); - vecin.vx = *(u16 *)(p + 4); - vecin.vy = *(u16 *)(p + 8); - vecin.vz = *(u16 *)(p + 0xC); - ApplyRotMatrix(&vecin, &rotout); - D_801B0D90 = rotout.vx; - D_801B0D94 = rotout.vy; - D_801B0D98 = rotout.vz; - vecin.vx = *(u16 *)(p + 6); - vecin.vy = *(u16 *)(p + 0xA); - vecin.vz = *(u16 *)(p + 0xE); - ApplyRotMatrix(&vecin, &rotout); - D_801B0D8C = 0; - D_801B0D92 = rotout.vx; - D_801B0D96 = rotout.vy; - D_801B0D9A = rotout.vz; - result += 2; - break; - case 0x40000000: - ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); - ApplyRotMatrixLV(&in1, &in1); - result = 2; - break; - } - { - s16 *p = *(s16 **)&D_80186F80; - p[0] = in0.vx; - p[1] = in0.vy; - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_80186F84; - p[0] = in1.vx; - p[1] = in1.vy; - p[2] = in1.vz; - } - return result; - } - { - s16 *p = *(s16 **)&D_80186F80; - p[0] = in0.vx; - p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = in0.vz; - } - { - s16 *p = *(s16 **)&D_80186F84; - p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); - p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); - p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); - } - return 1; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80135888); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80135A4C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80135D20); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80135EB0); - - -s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - register s32 a1v __asm__("$11"); - register s32 a2v __asm__("$12"); - register s32 n __asm__("$5"); - register s16 *b4 __asm__("$7"); - s32 d; - s32 dx; - s32 denom; - s32 result; - s32 frame_pad[2]; - (void)&frame_pad; - __asm__("" : "=r"(a1v) : "0"(arg1)); - a2v = arg2; - - if (!(arg1 & 1)) { - dx = (s16) arg2 - (*(s16 **)&D_80186F80)[2]; - d = dx; - denom = -(*(s16 **)&D_80186F8C)[2]; - } else { - denom = (*(s16 **)&D_80186F8C)[2]; - d = (*(s16 **)&D_80186F80)[2] - (s16) arg2; - dx = -d; - } - n = -d; - { - register s16 *b8 __asm__("$6") = *(s16 **)&D_80186F8C; - u16 *ac = *(u16 **)&D_80186F80; - b4 = D_80186F88; - b4[0] = ac[0] + n * b8[0] / denom; - b4[1] = ac[1] + n * b8[1] / denom; - b4[2] = ac[2] + dx; - } - - if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; - if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; - if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; - if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; - if (a1v & 0x8000) { - u16 *b0 = *(u16 **)&D_80186F84; - b4[0] = b0[0]; - b4[1] = b0[1]; - } - D_801152AA = 0; - (*(s16 *)D_801152A8) = 0; - if (a1v & 1) { - D_80186F88[2] = a2v + 2; - __asm__ __volatile__(""); - D_801152AC = 0xFFF; - } else { - D_801152AC = -0xFFF; - D_80186F88[2] = a2v - 2; - } - __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); - (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; - D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; - result = 1; - D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; - return result; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801365B8); - - -// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) -// D_80186F80/B0/B8 are file-scope `extern u8`, D_80186F88 is `extern s32 []`; each HOLDS a -// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. -// D_80186F88 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the -// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar -// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the -// siblings read it once via *(u16**)&sym == direct lw either way). - -s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { - extern u8 D_801152A8[]; - extern s16 D_801152AA; - extern s16 D_801152AC; - extern s16 D_80126722; - extern s16 D_80126724; - - register u16 *ac __asm__("$4"); - register s16 *b8 __asm__("$6"); - register s16 *b4 __asm__("$9"); - register s32 r __asm__("$3"); - register s32 pos __asm__("$12"); - register s32 a1v __asm__("$5"); - s16 temp_v0; - s16 temp_v1; - s32 var_a3; - s16 var_v0_3; - s32 temp_a1; - s32 var_t0; - s32 var_v1; - s16 *b4b; - u16 *p; - - __asm__ ("" : "=r"(a1v) : "0"(arg1)); - pos = arg2; - if (!(a1v & 1)) { - var_t0 = (s16) arg2 - (*(s16 **)&D_80186F80)[1]; - var_v1 = var_t0; - var_a3 = -(*(s16 **)&D_80186F8C)[1]; - } else { - var_a3 = (*(s16 **)&D_80186F8C)[1]; - var_v1 = (*(s16 **)&D_80186F80)[1] - (s16) arg2; - var_t0 = -var_v1; - } - b8 = (*(s16 **)&D_80186F8C); - ac = (*(u16 **)&D_80186F80); - b4 = D_80186F88; - temp_a1 = -var_v1; - r = (temp_a1 * b8[0]) / var_a3; - b4[0] = ac[0] + r; - b4[1] = ac[1] + var_t0; - r = (temp_a1 * b8[2]) / var_a3; - temp_v0 = ac[2] + r; - b4[2] = temp_v0; - temp_v1 = b4[0]; - if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { - return 0; - } - if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { - return 0; - } - if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { - return 0; - } - if (arg1 & 0x8000) { - p = (*(u16 **)&D_80186F84); - b4[0] = (s16) p[0]; - b4[2] = (s16) p[2]; - } - D_801152AC = 0; - (*(s16 *)D_801152A8) = 0; - if (arg1 & 1) { - b4b = D_80186F88; - D_801152AA = 0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos + 2; - } else { - b4b = D_80186F88; - D_801152AA = -0xFFF; - __asm__ __volatile__(""); - var_v0_3 = pos - 2; - } - b4b[1] = var_v0_3; - __asm__ __volatile__("" :: "r"(pos)); - (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); - D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); - D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); - return 1; -} - - -// @class: schedule -// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a -// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE -// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses -// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] -// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the -// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; -// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits -// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the -// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). - - -extern s16 *D_80186F88; /* holds a pointer value (*(u16**)&D_80186F88) */ - -s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { - extern void ApplyMatrixSV(void *m, void *v0, void *v1); - extern void ApplyRotMatrix(void *v0, void *v1); - extern u16 D_80126722; - extern s16 D_80126724; - extern s16 D_801152AA; - extern s16 D_801152AC; - - s32 out[4]; - u16 *pb4; - - if (a0) { - ApplyMatrixSV((void *)a3, *(void **)&D_80186F88, *(void **)&D_80186F88); - ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); - ApplyRotMatrix((void *)D_801152A8, (void *)out); - *(s16 *)D_801152A8 = out[0]; - D_801152AA = out[1]; - D_801152AC = out[2]; - } - - pb4 = *(u16 **)&D_80186F88; - *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); - *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); - *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); - - *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); - D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); - D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); -} - - - -DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ - -DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ - -DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ - -DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ - -DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ - - -extern unsigned short D_800B99F0; -extern void (*D_80186F9C[])(void); - -void func_80136C54(void) -{ - D_80186F9C[D_800B99F0](); -} - - -// @class: struct -// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801AFDF8 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). - -typedef struct { char s[10]; } S10_80136C90; - -s32 func_80136C90() -{ - extern void func_8001534C(int, void *, int, int, int, int); - extern S10_80136C90 D_801AFDF8; - - S10_80136C90 buf = D_801AFDF8; - func_8001534C(0, &buf, 0x78, 0x10, 0, 0); -} - - - -DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ - -DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80136DFC); - -DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ - -DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80136F3C); - -DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80137178); - -DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ - -DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80137614); - -DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ - -DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801376E8); - -DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ - -DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801378F0); - -DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ - -DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801379FC); - - -// @class: remat -// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer -extern s32 D_80127548[]; -extern int D_80186FF0; -extern int D_801269F0; -extern void func_80138BE0(int p); - -void func_80137B80(void) { - int *p = &D_801269F0; - (*(int *)&D_80127548) = 0x24; - if (*p != 0) { - ((void (*)(int *))func_80138BE0)(p); - } - D_80186FF0 += 1; -} - - -DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. - -extern unsigned char D_80126A0E; -extern short D_80126A0A; -extern s16 D_801269F4; -extern int D_800A5E60; -extern int D_80186FF0; -extern int D_801269F0; - -extern void func_801392FC(); -extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); -extern void func_80139680(s32 a0, u8 *a1); - -int func_80137D08(int arg0, int arg1, short arg2) -{ - unsigned char buf[3]; - - D_800A5E60 = arg0; - D_80126A0A = arg2; - ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); - if ((*(short *)&D_801269F4) == 7) { - buf[0] = 0x39; - buf[1] = 0xFF; - buf[2] = 0x71; - ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); - } else if ((*(short *)&D_801269F4) == 3) { - if (D_80186FF0 & 4) { - ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); - } - } - return D_800A5E60; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80137DD4); - -DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186FF4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186FF4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80187038; -extern u8 D_8018707C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80187038; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018707C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801870C0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801870FC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801870FC; - if (((s16)a1) < 0xC00) { - tbl = D_801870C0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80187138, D_8018713A, D_8018713C, D_8018713E, D_80187140, D_80187142; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018713A < ang)) goto outer_else; - if (!(ang < D_80187140)) goto inner_else; - if (ang < D_8018713C) { *(s16 *)L = D_8018713C; goto done; } - if (D_8018713E < ang) { *(s16 *)L = D_8018713E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80187138) { *(s16 *)L = D_80187138; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80187142 < ang) { *(s16 *)L = D_80187142; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B0DD0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B0DD0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B0DD0; -extern s8 D_801B0DD4; -extern s8 D_801B0DD5; - -void func_8013C9C4(void * arg0) -{ - D_801B0DD0 = arg0; - D_801B0DD4 = 0; - D_801B0DD5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B0DD0; -extern s8 D_801B0DD4; -extern s8 D_801B0DD5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B0DD0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B0DD5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B0DD4)) * 2) + D_801B0DD0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B0DD5 = (unsigned char) p[1]; - D_801B0DD4 = D_801B0DD4 + 1; - if (D_801B0DD5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B0DD4 = 0; - *base = 0; - } - } - else - { - D_801B0DD5 = c - 1; - } - } - return; -} - - - -extern s32 D_801B0DF4; -extern s32 D_801B0DE8; -extern s32 D_801B0DEC; -extern s32 D_801B0DF8; - -void func_8013CABC(void) { - D_801B0DF4 = 1; - D_801B0DE8 = 1; - D_801B0DEC = 0; - D_801B0DF8 = 1; -} - - - -extern s32 D_801B0DE8; -extern s32 D_801B0DEC; -extern s32 D_801B0DF0; -extern s32 D_801B0DF4; -extern s32 D_801B0DF8; - -void func_8013CAE8(void) { - D_801B0DE8 = 1; - D_801B0DF4 = 0; - D_801B0DEC = 0; - D_801B0DF0 = -1; - D_801B0DF8 = 0; -} - - - -extern s32 D_801B0DF4; -extern s32 D_801B0DF8; -extern s32 D_801B0E20; -extern s32 D_801B0E24; - -void func_8013CB20(void) -{ - D_801B0E20 = D_801B0DF8; - D_801B0E24 = D_801B0DF4; - D_801B0DF8 = 1; - D_801B0DF4 = 0; -} - - - -extern s32 D_801B0E20; -extern s32 D_801B0E24; -extern s32 D_801B0DF8; -extern s32 D_801B0DF4; - -void func_8013CB5C(void) { - D_801B0DF8 = D_801B0E20; - D_801B0DF4 = D_801B0E24; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B2B28; - extern u8 D_801B2B29; - extern u8 D_801B2B2A; - extern u8 D_801B2B2B; - extern u8 D_801B2B2C; - extern u8 D_801B2B2D; - extern u8 D_801B2B2E; - extern u8 D_801B2B2F; - extern u8 D_801B2B30; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B2B28; t1 = D_801B2B29; t2 = D_801B2B2A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B2B2B; t1 = D_801B2B2C; t2 = D_801B2B2D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B2B2E; t1 = D_801B2B2F; t2 = D_801B2B30; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B0E00; -extern s32 D_801B0DE8; -extern s32 D_801B0E04; -extern s32 D_801B0DF4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B0E00 != 0) { - if (D_801B0E00 != 2) { - if (((D_801B0E00 < 3) && (D_801B0E00 == 1)) && - (D_801B0E04 = D_801B0E04 + 1, 0x23a < D_801B0E04)) { - D_801B0DE8 = D_801B0E00; - D_801B0E00 = 2; - } - } else { - D_801B0DE8 = D_801B0DE8 + -1; - if (D_801B0DE8 == 0) { - D_801B0DE8 = D_801B0E00; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B0DF4 == 0) { - D_801B0E00 = D_801B0E00 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B0DF4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B0DF4; -} - - - -extern s32 D_801B0E00; - -void func_8013D164(void) { - D_801B0E00 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B2C0A; -extern u8 D_801B2C7E; -extern u8 D_801B2B32; -extern u8 D_801B2BEC; -extern u8 D_801B2B10; -extern u8 D_801B2B31; -extern s32 D_801B2BF0; - -void func_8013D330(void) { - if ((D_801B2C0A & 0xff) != D_801B2C7E) { - D_801B2C0A = ((D_801B2C0A & 0xff) < D_801B2C7E) ? (D_801B2C0A + 1) : (D_801B2C0A - 1); - } - if ((D_801B2B32 & 0xff) != D_801B2BEC) { - D_801B2B32 = ((D_801B2B32 & 0xff) < D_801B2BEC) ? (D_801B2B32 + 1) : (D_801B2B32 - 1); - } - if ((D_801B2B10 & 0xff) != D_801B2B31) { - D_801B2B10 = ((D_801B2B10 & 0xff) < D_801B2B31) ? (D_801B2B10 + 1) : (D_801B2B10 - 1); - } - D_801B2BF0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B0DD8; -extern void *D_801B0DDC; -extern void *D_801B0DE0; -extern s32 D_801B0E08; -extern s32 D_801B0E0C; -extern s32 D_801B0E10; -extern s32 D_801B2B64[]; - -extern u8 D_80187230[]; -extern u8 D_801872D8[]; -extern u8 D_80187188[]; -extern u8 D_80187284[]; -extern u8 D_80187304[]; -extern u8 D_801871DC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B0E08 = param_2; - D_801B0E0C = (param_2 >> 2) & 3; - D_801B0E10 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B0DD8 = D_80187230; - D_801B0DDC = D_801872D8; - D_801B0DE0 = D_80187188; - } else { - D_801B0DD8 = D_80187284; - D_801B0DDC = D_80187304; - D_801B0DE0 = D_801871DC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B0E10 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B0E08 & 2) != 0) { - D_801B2B64[0] = 0x140; - D_801B2B64[3] = 0x80; - if (p[0x37] == 4) { - D_801B2B64[0] = 0x140; - D_801B2B64[3] = 0; - } - if (p[0x37] == 0) { - D_801B2B64[0] = 0x140; - D_801B2B64[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B0DE0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B0DE0; -extern s16 *D_801B0DE4; -extern s32 D_801B0DF4; -extern s32 D_801B0E14; -extern s32 D_801B0E18; -extern s32 D_801B0E1C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B0DE4 != 0) { - D_801B0DF4 = 0; - p = (int *)(param_1 * 12 + (int)D_801B0DE0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B0E14 != x) { - flag = 1; - if (D_801B0E14 < x) { - if (x - D_801B0E14 < 5) { - D_801B0E14 = x; - } else { - D_801B0E14 = D_801B0E14 + 4; - } - } else { - if (D_801B0E14 - x < 5) { - D_801B0E14 = x; - } else { - D_801B0E14 = D_801B0E14 - 4; - } - } - } - if (D_801B0E18 != y) { - flag = 1; - if (D_801B0E18 < y) { - if (y - D_801B0E18 < 5) { - D_801B0E18 = y; - } else { - D_801B0E18 = D_801B0E18 + 4; - } - } else { - if (D_801B0E18 - y < 5) { - D_801B0E18 = y; - } else { - D_801B0E18 = D_801B0E18 - 4; - } - } - } - if (D_801B0E1C != z) { - flag = 1; - if (D_801B0E1C < z) { - if (z - D_801B0E1C < 5) { - D_801B0E1C = z; - } else { - D_801B0E1C = D_801B0E1C + 4; - } - } else { - if (D_801B0E1C - z < 5) { - D_801B0E1C = z; - } else { - D_801B0E1C = D_801B0E1C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B0DF4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80187394[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B0DE4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B0E14); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B0E18); - uVar5 = (*(int*)&D_801B0E1C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80187394); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B0DFC; - -s32 func_8013E054(void) { - return D_801B0DFC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187D90; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80187D68; -extern s16 D_80187D6A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187D90; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80187D68 = 2; - D_80187D6A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80187D6A = 0; - D_80187D68 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B0E30; - extern void * D_801B0E34; - extern unsigned char D_80187A08; - extern unsigned char D_80187A20; - extern unsigned char D_80187A94; - extern unsigned char D_80187A9C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B0E30 = &D_80187A08; - D_801B0E34 = &D_80187A94; - } else { - D_801B0E30 = &D_80187A20; - D_801B0E34 = &D_80187A9C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187D90/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187D90 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187D90)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187D6C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187D6C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187D6C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80187D68; -extern s16 D_80187D6A; -extern unsigned char D_80187D6C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187D6A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80187D68` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80187D6A; - if (*r < 3) { - *r = *r + 1; - } - D_80187D68 = (u16)D_80187D68 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187D6C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187D6C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187D6C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013FAF8); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8013FFD8); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8014032C); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80140608); - - -// @class: iv-combine -// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source -// pointer compile to fixed offsets when written base[0..n]; the target advances -// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead -// final increment, yielding the "increment N-2 then offset 0/2" tail). - -extern u8 *D_80187A48; -extern u8 *D_80187A4C; -extern u8 *D_80187A50; -extern u8 *D_80187A54; -extern u8 *D_80187A58; -extern u16 *D_80187A5C[]; -extern u16 *D_80187A64[]; -extern u16 *D_80187A84[]; - -extern s32 func_80028D58(void); -extern s32 func_80028DE0(void); -extern s32 func_80028FBC(void); -extern s32 func_80029000(void); -extern s32 func_80028D9C(void); - -void func_801407F4(void) -{ - u8 *puVar1; - s32 iVar2; - u16 *puVar3; - - puVar1 = D_80187A48; - iVar2 = func_80028D58(); - puVar3 = D_80187A5C[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - puVar1 = D_80187A4C; - iVar2 = func_80028DE0(); - puVar3 = D_80187A5C[iVar2]; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - - iVar2 = func_80028FBC(); - *(s16 *)(D_80187A50 + 0x18) = *D_80187A64[iVar2]; - iVar2 = func_80029000(); - *(s16 *)(D_80187A54 + 0x18) = *D_80187A64[iVar2]; - - puVar1 = D_80187A58; - iVar2 = func_80028D9C(); - puVar3 = D_80187A84[iVar2]; - *(s16 *)(puVar1 + 0x12) = *puVar3++; - *(s16 *)(puVar1 + 0x14) = *puVar3++; - *(s16 *)(puVar1 + 0x16) = *puVar3++; - *(s16 *)(puVar1 + 0x18) = *puVar3++; - *(s16 *)(puVar1 + 0x1a) = *puVar3++; - *(s16 *)(puVar1 + 0x1c) = *puVar3++; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80140958); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80140D68); - - -// @class: struct -// @stuck: none — MATCH - -extern unsigned char D_80078E7F; -extern unsigned char D_80078E7E; -extern unsigned char D_80078E7D; -extern M2C_UNK D_80187984; - -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); - -void func_80140E6C(void) { - void *puVar1; - unsigned int uVar2; - unsigned int uVar3; - unsigned int uVar4; - - puVar1 = (*(void * *)&D_80187984); - uVar2 = func_800D2CA8(D_80078E7F, 0x18); - uVar3 = func_800D2CA8(D_80078E7E, 0xc); - uVar4 = func_800D2CA8(D_80078E7D, 0); - func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); -} - - - - -// @class: plumbing -// @stuck: none — MATCH (128/128 ins, match_one confirmed) - -extern short D_80115128; -extern u8 D_80187994; -extern char *D_801879B4; -extern char *D_801879B8; -extern char *D_801879BC; -extern char *D_801879C0; -extern char *D_801879C4; - -extern int func_80029FE4(void); -extern int func_800D2CA8(int, int); -extern void func_800D2D10(int, int, void *, int); -extern char *func_8002AAB4(void); -extern char *strcpy(char *, const char *); -extern int func_8002A26C(void); -extern int func_8002A2B0(void); -extern int func_8002A4B8(void); -extern s32 func_8002A4FC(s32 a0); -extern int func_8002A998(void); -extern int func_8002A9DC(void); -extern int func_8002A728(void); -extern int func_8002A76C(void); -extern int func_80029FD4(void); - -void func_80140F00(void) { - char *p; - int r; - - if (D_80115128 == 0) { - p = (*(char * *)&D_80187994); - r = func_800D2CA8(func_80029FE4() + 1, 0x18); - func_800D2D10(r, 2, p + 4, 1); - strcpy(p + 0xA, func_8002AAB4()); - - p = D_801879B4; - r = func_800D2CA8(func_8002A26C() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A2B0(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_801879B8; - r = func_800D2CA8(func_8002A4B8() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_801879BC; - r = func_800D2CA8(func_8002A998() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A9DC(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_801879C0; - r = func_800D2CA8(func_8002A728() + 1, 0x18); - func_800D2D10(r, 2, p + 0x12, 1); - r = func_800D2CA8(func_8002A76C(), 0x18); - func_800D2D10(r, 2, p + 0x22, -1); - - p = D_801879C4; - r = func_800D2CA8(func_80029FD4(), 4); - func_800D2D10(r, 7, p + 0x18, -1); - } -} - - - -// @class: other -// @stuck: none — MATCH - -extern short D_80115128; -extern unsigned short D_80115172; -extern unsigned short D_8018784E; -extern unsigned short D_80187852; -extern unsigned short D_80187856; -extern unsigned short D_8018785A; - -extern s32 func_8002A1B4(void); -extern short func_8002A28C(void); -extern short func_8002A27C(void); -extern s32 func_8002A400(void); -extern short func_8002A4D8(void); -extern short func_8002A4C8(void); -extern s32 func_8002A8E0(void); -extern short func_8002A9B8(void); -extern short func_8002A9A8(void); -extern s32 func_8002A670(void); -extern short func_8002A748(void); -extern short func_8002A738(void); -extern int func_801412A8(int, int, int, int, int, int); - -int func_80141100(int param_1) -{ - short sVar1; - int iVar7; - - if (D_80115128 == 0) { - iVar7 = D_80115172 + 0x31; - sVar1 = D_8018784E; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); - sVar1 = D_80187852; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); - sVar1 = D_80187856; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); - sVar1 = D_8018785A; - param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); - } - return param_1; -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801412A8); - -DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ - -DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ - -DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ - - -extern unsigned short D_80115112; -extern void (*D_80187DE4[])(void); - -void func_80141788(void) -{ - D_80187DE4[D_80115112](); -} - - -DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ - -DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80141874); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801418F8); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80141A60); - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80141B90); - -DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) - -extern u16 D_80115110; -extern u8 D_80187D44; -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_80141C0C(s32 param_1) -{ - func_8002D4C8(*(u16 *)(&D_80187D44 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); -} - - -DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ - -DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ - -DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ - -DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_801424E4); - - -extern void (*D_80187E24[])(void); - -void func_801425CC(void *a0) { - D_80187E24[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: schedule -// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail - -extern void func_8012C1B8(void); -extern s32 func_8012C1DC(s32 a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012CAE4(void *a0); -extern s32 func_8012AD50(void *a0); -extern s32 D_80187E08; - -void func_80142608(s32 param_1) -{ - register s32 iVar1 __asm__("$16"); - - if (*(short *)(param_1 + 0x70) != 0) { - iVar1 = ((s32 (*)(void))func_8012C1B8)(); - } else { - iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); - } - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CA1C(iVar1, (s32)&D_80187E08); - *(short *)(iVar1 + 0x1a) = 0x200; - *(short *)(iVar1 + 0x18) = 0x200; - *(short *)(param_1 + 0xfc) = 0x40; - if (*(short *)(param_1 + 0x70) != 0) { - goto ad50; - } - if (*(s32 *)(param_1 + 100) != 0) { - *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); - goto ad50; - } - } - ((void (*)(s32))func_8012CAE4)(param_1); - return; -ad50: - *(short *)(param_1 + 0x98) = 0; - *(s32 *)(param_1 + 0x90) = 0; - ((void (*)(s32))func_8012AD50)(param_1); -} - - -DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ - -DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ - -DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ - -DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ - -DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80187E38[])(); - -void func_801427EC(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80187E38[*(u16 *)(param_1 + 2)](); - } -} - - -DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ - -DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80187E54[])(); - -void func_8014292C(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80187E54[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_80188024[])(); - -void func_80142978(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_80188024[*(u16 *)(param_1 + 2)](); - } -} - - - -// @class: struct -// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) - -extern u16 D_801270C0; -extern void (*D_801880DC[])(); - -void func_801429C4(int param_1) -{ - if (*(s16 *)&D_801270C0 != 3) { - D_801880DC[*(u16 *)(param_1 + 2)](); - } -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80142A10); - - -// @class: struct -// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) - -extern u16 D_800B99D8; -extern struct packed_word D_801B0534; -extern u8 D_801B0E38; -extern u8 D_801B0E39; -extern u8 D_801B0E3A; - -void func_80142A80(void) -{ - u16 flags; - union word_bytes local; - s32 mul; - - flags = D_800B99D8; - local.pw = D_801B0534; - - if (flags & 0x10) { - mul = (s8)((flags & 0xf) >> 1) + 9; - } else { - mul = 0x10 - (s8)((flags & 0xf) >> 1); - } - - D_801B0E38 = mul * (local.b[0] >> 4); - D_801B0E39 = mul * (local.b[1] >> 4); - D_801B0E3A = mul * (local.b[2] >> 4); -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80142B2C); - -DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ - -DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ - -DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ - -DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ - -DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ - -DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern int D_80187E2C; - -void func_80142DC4(int param_1) -{ - int v0; - - *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); - if (v0 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_80187E2C); - *(short *)(v0 + 0x1a) = 0x1800; - *(short *)(v0 + 0x18) = 0x1800; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80187E48[]; - -void func_80142E38(int param_1) -{ - short sVar1; - int iVar2; - - *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_80187E48); - sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; - *(short *)(iVar2 + 0x1a) = sVar1; - *(short *)(iVar2 + 0x18) = sVar1; - *(short *)(param_1 + 0xfc) = 0; - ((void (*)(int))func_80142B2C)(param_1); - } -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80142EC0); - -DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ - -DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result -// survives across func_8001CA1C while $v0 serves the pre-call store/test; -// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern void func_80142B2C(void *arg0); - -extern unsigned char D_80188034[]; -extern unsigned char D_80188094[]; - -void func_8014305C(int param_1) -{ - register int s0_param __asm__("$16") = param_1; - register int s1_copy __asm__("$17"); - int iVar2; - short sVar1; - - iVar2 = ((int (*)(void))func_8012C1B8)(); - *(int *)(s0_param + 0x20) = iVar2; - s1_copy = iVar2; - if (iVar2 == 0) { - ((void (*)(int))func_8012CAE4)(s0_param); - } else { - ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80188034); - sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; - *(short *)(s1_copy + 0x1a) = sVar1; - *(short *)(s1_copy + 0x18) = sVar1; - *(short *)(s0_param + 0xfc) = 0; - func_8012A828(s0_param, D_80188094); - ((void (*)(int))func_80142B2C)(s0_param); - } -} - - -DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ - -DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) - - -extern void *memcpy(void *, const void *, u32); - -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern int func_8001CA88(int, void *); -extern s32 func_8012E504(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80142B2C(void *arg0); - -extern u8 D_801B0530; -extern u8 D_801B0E38; -extern u8 D_801B0E3C; - -void func_801431E8(s32 param_1) { - u8 buf[8]; - s32 iVar5; - u16 uVar2; - s16 sVar4; - - register s32 d __asm__("$16"); - memcpy(buf, &D_801B0530, 4); - iVar5 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)(param_1 + 0x20) = iVar5; - d = iVar5; - if (iVar5 == 0) { - ((void (*)(s32))func_8012CAE4)(param_1); - } else { - ((void (*)(s32, void *))func_8001CA88)(d, &D_801B0E38); - uVar2 = *(u16 *)(param_1 + 0x70); - *(s16 *)(d + 0x76) = -0x10; - sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; - *(s16 *)(d + 0x1a) = sVar4; - *(s16 *)(d + 0x18) = sVar4; - *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; - if (func_8012E504(param_1, 0x33) == 0) { - *(s16 *)(param_1 + 0xfc) = 1; - func_800233CC(&D_801B0E38, 0x10); - memcpy(&D_801B0E3C, buf, 4); - } else { - *(s16 *)(param_1 + 0xfc) = 0; - } - ((void (*)(s32))func_80142B2C)(param_1); - } -} - - -DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ - -DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ - -DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (pending gate) - -extern u8 D_800D387C[]; -extern u32 D_801881EC[]; - -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); - -void func_80143458(s32 param_1) -{ - s32 p; - u16 v; - - *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; - - p = *(s32 *)(param_1 + 0x20); - if (*(s32 *)(p + 4) == 0) { - *(s32 *)(p + 4) = 0x50000000; - } - - *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; - - v = *(u16 *)(param_1 + 0x34) & 0x7fff; - if (v != 0) { - p = *(s32 *)(param_1 + 0x20); - *(u16 *)(p + 0x1a) = v; - *(u16 *)(p + 0x18) = v; - } - - func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, - D_801881EC[*(u16 *)(param_1 + 0x34) & 3]); - - *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; -} - - -DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_8014358C); - -DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ - -DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ - -DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ - -DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ - -DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ - -DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ - - -extern void (*D_80188314[])(void); - -void func_80143B30(void *a0) { - D_80188314[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ - -DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ - - -extern void (*D_80188320[])(void); - -void func_80143C38(void *a0) { - D_80188320[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ - - -extern void (*D_80188328[])(void); - -void func_80143C98(void *a0) { - D_80188328[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80143D28); - - -extern void (*D_80188370[])(void); - -void func_80143E68(void *a0) { - D_80188370[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ - -DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ - -DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ - -DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ - - -extern void (*D_80188384[])(void); - -void func_80144054(void *a0) { - D_80188384[*(u16 *)((s32)a0 + 0x2)](); -} - - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80144090); - -extern void func_8012C218(void *a0); - -// @class: struct -// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) - -extern void (*D_8018838C[])(); - -void func_801442F8(int param_1) -{ - int iVar1; - - D_8018838C[*(u16 *)(param_1 + 2)](); - iVar1 = *(int *)(param_1 + 0x1c) + 1; - *(int *)(param_1 + 0x1c) = iVar1; - if (0x1d < iVar1) { - func_8012C218(param_1); - } -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); -extern u8 D_80188308; - -void func_80144364(int param_1) { - int iVar3; - u16 uVar2; - s16 sVar1; - - iVar3 = ((s32 (*)(void))func_8012C194)(); - if (iVar3 == 0) { - ((void (*)(int))func_8012CAE4)(param_1); - } else { - uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); - *(int *)(param_1 + 0xCC) = iVar3; - *(u16 *)(param_1 + 0xFC) = uVar2; - func_8001CB6C((u8 *)iVar3, (s32)&D_80188308, 0x250, 0x1A0); - *(s32 *)(iVar3 + 4) = 0x60000000; - *(u8 *)(iVar3 + 0x27) = 0x14; - *(u16 *)(iVar3 + 0x10) = 0x400; - *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); - *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); - *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); - sVar1 = *(s16 *)(param_1 + 0x70); - if (sVar1 != 0) { - *(s16 *)(iVar3 + 0x1A) = sVar1; - *(s16 *)(iVar3 + 0x18) = sVar1; - } else { - *(u16 *)(iVar3 + 0x1A) = 0x2000; - *(u16 *)(iVar3 + 0x18) = 0x2000; - } - *(u16 *)(param_1 + 2) = 1; - } -} - - - - -extern void func_80016714(void *a0, s32 a1); -extern s32 func_8004787C(s32 a0); -extern s32 func_80047948(s32 a0); -extern s32 func_80128ED8(void *a0, void *a1); -extern void func_8012AD80(s32 a0); -extern void func_8012C218(void *a0); -extern s32 D_8018831C; - -void func_80144458(void *arg0) { - s32 temp_s0; - void *temp_s2; - void *temp_v0; - - temp_s2 = M2C_FIELD(arg0, void **, 0xCC); - if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { - temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); - if (temp_v0 != NULL) { - temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; - M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_8018831C * 0x10); - M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_8018831C * 0x10); - func_8012AD80(arg0); - } - } - M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); - M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); - M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); - if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { - func_80016714(temp_s2, 0x38); - func_8012C218(arg0); - } -} - - -DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ - -DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ - -DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ - - - -// @class: struct -// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first -extern void func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CA1C(s32 a0, s32 a1); -extern void func_8012A828(s32 a0, void *a1); -extern u8 D_80188330; -extern u8 D_8018833C; - -void func_8014477C(void *param_1) { - s32 v0; - s32 v1; - register s32 uVar2 __asm__("$2"); - register s32 addr __asm__("$3"); - s32 gv; - s32 fv; - - v0 = ((s32 (*)(void))func_8012C1B8)(); - *(s32 *)((s32)param_1 + 0x20) = v0; - if (v0 == 0) { - func_8012CAE4(param_1); - return; - } - ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80188330); - if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { - *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); - uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); - if (uVar2 != 0) { - addr = uVar2 & 0xFFFFFFF; - gv = *(u16 *)((addr | 0x80000000) + 8); - fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; - *(u16 *)((s32)param_1 + 0xA) = gv + fv; - } else { - *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; - } - } - ((void (*)(void *, void *))func_8012A828)(param_1, &D_8018833C); - v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; - *(s16 *)((s32)param_1 + 0x2) = 1; - *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; - *(s32 *)((s32)param_1 + 0x1C) = 0x78; -} - - - -extern void func_8012C194(void); -extern void func_8012CAE4(void *a0); -extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); - -extern u8 D_80188308; -extern u8 D_80188378; - -void func_80144880(s32 param_1) -{ - register s32 obj __asm__("$16"); /* $s0 */ - register s32 self __asm__("$17") = param_1; /* $s1 */ - register s32 b __asm__("$2"); /* $v0 */ - s32 e; - - obj = ((s32 (*)(void))func_8012C194)(); - if (obj == 0) { - ((void (*)(s32))func_8012CAE4)(self); - } else { - *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); - *(s32 *)(self + 0xCC) = obj; - if (*(s16 *)(self + 0x70) == 1) { - func_8001CB6C((u8 *)obj, (s32)&D_80188308, 0x250, 0x1A0); - b = 0x14; - } else { - func_8001CB6C((u8 *)obj, (s32)&D_80188378, 0x300, 0x1D0); - b = 0x6A; - } - *(u8 *)(obj + 0x27) = (u8)b; - *(s32 *)(obj + 4) = 0x60000000; - *(u16 *)(obj + 0x10) = 0x400; - *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); - *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); - e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); - *(u16 *)(obj + 0x1A) = 0x4000; - *(u16 *)(obj + 0x18) = 0x4000; - *(u16 *)(obj + 0xC) = (u16)e; - *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; - } -} - - -DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ - - -extern void (*D_80188394[])(void); - -void func_801449C8(void *a0) { - D_80188394[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ - - -extern void (*D_8018839C[])(void); - -void func_80144A2C(void *a0) { - D_8018839C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ - -DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ - -DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ - -DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010", func_80144B14); diff --git a/src/ov_SC06_010/ov_SC06_010_jr_8012ACE0.c b/src/ov_SC06_010/ov_SC06_010_jr_8012ACE0.c new file mode 100644 index 000000000..d4228d1a3 --- /dev/null +++ b/src/ov_SC06_010/ov_SC06_010_jr_8012ACE0.c @@ -0,0 +1,2827 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AFBA4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186C88[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B0CEC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B2C10; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AFBA4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801869C4)(); +extern s16 (*D_801869C8)(); +extern M2C_UNK (*D_801869D0)(); +extern s32 (*D_801869D4)(); +extern s32 D_801B0CE8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AFBA8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186D1C; +extern void func_8012ACA0(void *arg0); +/* ==== end §8b carried decl layer ==== */ + + + + +// @class: iv-combine +// @stuck: none — MATCH (25 ins). Array-subscript induction o->list[i] fixes preheader hoist order + loop-top load-delay nop; scattered case labels force the jump table (gcc merges contiguous same-target cases, so 6+ non-contiguous nodes needed for the density heuristic). +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ + +s32 func_8012ACE0(void *o) { + int i; + for (i = 0; ; i++) { + switch (((Owner_8012ACE0_8012ACE0 *)o)->list[i].cmd) { + case -2: + case -1: + case 0: + return i; + case -50: case -45: case -40: case -35: case -30: /* scatter -> force jump table (min=-50 sets low bound) */ + default: + break; + } + } +} + +DEFINE_func_8012AD44() /* dedup: shared engine-core @0x8012AD44 (src/shared) */ + +DEFINE_func_8012AD50() /* dedup: shared engine-core @0x8012AD50 (src/shared) */ + + + +void func_8012AD64(s32 *a0, s16 a1) { + *(s16*)((s32)a0 + 0x34) = a1; +} + + +DEFINE_func_8012AD6C() /* dedup: shared engine-core @0x8012AD6C (src/shared) */ + +DEFINE_func_8012AD80() /* dedup: shared engine-core @0x8012AD80 (src/shared) */ + +DEFINE_func_8012ADE4() /* dedup: shared engine-core @0x8012ADE4 (src/shared) */ + +DEFINE_func_8012AE00() /* dedup: shared engine-core @0x8012AE00 (src/shared) */ + +DEFINE_func_8012AF0C() /* dedup: shared engine-core @0x8012AF0C (src/shared) */ + +DEFINE_func_8012B030() /* dedup: shared engine-core @0x8012B030 (src/shared) */ + +DEFINE_func_8012B0B4() /* dedup: shared engine-core @0x8012B0B4 (src/shared) */ + +DEFINE_func_8012B14C() /* dedup: shared engine-core @0x8012B14C (src/shared) */ + +DEFINE_func_8012B178() /* dedup: shared engine-core @0x8012B178 (src/shared) */ + +DEFINE_func_8012B1B4() /* dedup: shared engine-core @0x8012B1B4 (src/shared) */ + +DEFINE_func_8012B200() /* dedup: shared engine-core @0x8012B200 (src/shared) */ + +DEFINE_func_8012B21C() /* dedup: shared engine-core @0x8012B21C (src/shared) */ + +DEFINE_func_8012B23C() /* dedup: shared engine-core @0x8012B23C (src/shared) */ + +DEFINE_func_8012B260() /* dedup: shared engine-core @0x8012B260 (src/shared) */ + +DEFINE_func_8012B2CC() /* dedup: shared engine-core @0x8012B2CC (src/shared) */ + +DEFINE_func_8012B370() /* dedup: shared engine-core @0x8012B370 (src/shared) */ + +DEFINE_func_8012B414() /* dedup: shared engine-core @0x8012B414 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012B4B8); + +DEFINE_func_8012B608() /* dedup: shared engine-core @0x8012B608 (src/shared) */ + +DEFINE_func_8012B6D4() /* dedup: shared engine-core @0x8012B6D4 (src/shared) */ + +DEFINE_func_8012B70C() /* dedup: shared engine-core @0x8012B70C (src/shared) */ + +DEFINE_func_8012B744() /* dedup: shared engine-core @0x8012B744 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012B77C); + +DEFINE_func_8012B864() /* dedup: shared engine-core @0x8012B864 (src/shared) */ + +DEFINE_func_8012B8A4() /* dedup: shared engine-core @0x8012B8A4 (src/shared) */ + +DEFINE_func_8012B8E4() /* dedup: shared engine-core @0x8012B8E4 (src/shared) */ + +DEFINE_func_8012BA10() /* dedup: shared engine-core @0x8012BA10 (src/shared) */ + +DEFINE_func_8012BB3C() /* dedup: shared engine-core @0x8012BB3C (src/shared) */ + +DEFINE_func_8012BC60() /* dedup: shared engine-core @0x8012BC60 (src/shared) */ + +DEFINE_func_8012BCCC() /* dedup: shared engine-core @0x8012BCCC (src/shared) */ + +DEFINE_func_8012BD14() /* dedup: shared engine-core @0x8012BD14 (src/shared) */ + +DEFINE_func_8012BD3C() /* dedup: shared engine-core @0x8012BD3C (src/shared) */ + +DEFINE_func_8012BDBC() /* dedup: shared engine-core @0x8012BDBC (src/shared) */ + +DEFINE_func_8012BE54() /* dedup: shared engine-core @0x8012BE54 (src/shared) */ + +DEFINE_func_8012BE98() /* dedup: shared engine-core @0x8012BE98 (src/shared) */ + +DEFINE_func_8012BEE8() /* dedup: shared engine-core @0x8012BEE8 (src/shared) */ + +DEFINE_func_8012BF10() /* dedup: shared engine-core @0x8012BF10 (src/shared) */ + + +void func_8012BF4C(s32 *a0, s32 a1) { + *(s32*)((s32)a0 + 0x1C) = a1; +} + + +DEFINE_func_8012BF54() /* dedup: shared engine-core @0x8012BF54 (src/shared) */ + +DEFINE_func_8012BF68() /* dedup: shared engine-core @0x8012BF68 (src/shared) */ + +DEFINE_func_8012BF7C() /* dedup: shared engine-core @0x8012BF7C (src/shared) */ + +DEFINE_func_8012BFA8() /* dedup: shared engine-core @0x8012BFA8 (src/shared) */ + +DEFINE_func_8012C044() /* dedup: shared engine-core @0x8012C044 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012C098); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012C0EC); + +DEFINE_func_8012C194() /* dedup: shared engine-core @0x8012C194 (src/shared) */ + +DEFINE_func_8012C1B8() /* dedup: shared engine-core @0x8012C1B8 (src/shared) */ + +DEFINE_func_8012C1DC() /* dedup: shared engine-core @0x8012C1DC (src/shared) */ + +DEFINE_func_8012C218() /* dedup: shared engine-core @0x8012C218 (src/shared) */ + +DEFINE_func_8012C284() /* dedup: shared engine-core @0x8012C284 (src/shared) */ + +DEFINE_func_8012C2D0() /* dedup: shared engine-core @0x8012C2D0 (src/shared) */ + +DEFINE_func_8012C31C() /* dedup: shared engine-core @0x8012C31C (src/shared) */ + +DEFINE_func_8012C354() /* dedup: shared engine-core @0x8012C354 (src/shared) */ + +DEFINE_func_8012C438() /* dedup: shared engine-core @0x8012C438 (src/shared) */ + +DEFINE_func_8012C51C() /* dedup: shared engine-core @0x8012C51C (src/shared) */ + +DEFINE_func_8012C588() /* dedup: shared engine-core @0x8012C588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012C658); + +DEFINE_func_8012C724() /* dedup: shared engine-core @0x8012C724 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012C750); + +DEFINE_func_8012C820() /* dedup: shared engine-core @0x8012C820 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (149 ins). Counter (*(u16 *)&D_801270C4): gcc CSE's the two reads (store to +// dst+0x36 assumed non-aliasing the global) AND folds %lo per-access — target instead RELOADS +// and keeps &(*(u16 *)&D_801270C4) in one reg. Fix = pin a `u16*` to $v1 (register asm "$3"), read via +// `*(volatile u16*)pc` (defeats CSE -> 2 loads) but STORE via plain `*pc` (non-volatile store +// schedules store-before-sll, no extra `move`). count is s16 so `count==0` -> `sll 16;bnez`. +// else-block obj must be a BLOCK-LOCAL (gcc then picks $a1, not the shared if-branch $a0). + +extern s32 D_8018A200; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern void func_80016714(void *a0, s32 a1); + +s32 func_8012C890(s32 a0, s32 a1, s32 a2) { + u8 *src = (u8 *)a0; + u8 *dst = (u8 *)a1; + u16 *d; + s16 count; + u16 v2, v4; + s32 v10; + void *obj; + + *(u16 *)(dst + 0x0) = *(u16 *)(src + 0x6); + v2 = *(u16 *)(src + 0x0); + *(u16 *)(dst + 0x6) = v2; + *(u16 *)(dst + 0x88) = v2; + v2 = *(u16 *)(src + 0x2); + *(u16 *)(dst + 0xA) = v2; + *(u16 *)(dst + 0x8A) = v2; + v4 = *(u16 *)(src + 0x4); + *(u16 *)(dst + 0xC) = 0; + *(u16 *)(dst + 0x8) = 0; + *(u16 *)(dst + 0x4) = 0; + *(u16 *)(dst + 0xE) = v4; + *(u16 *)(dst + 0x8C) = v4; + *(u16 *)(dst + 0x70) = *(u16 *)(src + 0x8); + *(u16 *)(dst + 0x72) = *(u16 *)(src + 0xA) & 0xF7FF; + *(u16 *)(dst + 0xFC) = *(u16 *)(src + 0xE); + v10 = *(s32 *)(src + 0x10); + *(s32 *)(dst + 0x78) = (s32)&D_8018A200; + *(s32 *)(dst + 0xDC) = v10; + + { + register u16 *pc __asm__("$3"); + pc = &(*(u16 *)&D_801270C4); + *(u16 *)(dst + 0x36) = *(volatile u16 *)pc; + count = *(volatile u16 *)pc + 1; + *pc = count; + if (count == 0) { + *pc = 1; + } + } + + if (a2 != 0) { + *(s32 *)(dst + 0x64) = a2; + *(s32 *)(dst + 0x68) = 0; + } else { + *(s32 *)(dst + 0x64) = 0; + *(s32 *)(dst + 0x68) = (s32)src; + } + + *(u16 *)(src + 0xA) |= 0x8000; + *(u16 *)(dst + 0x2) = 0; + d = D_801274E4; + *d &= 0xFFFE; + (*(void (**)(void *))(D_8011DB08 + *(u16 *)(dst + 0x0) * 4))(dst); + + if (*d & 1) { + s32 a1v; + obj = *(void **)(dst + 0x20); + if (obj != 0) { + s32 t = *(u16 *)obj; + if (t != 1) { + if (t != 2) { + goto done; + } + a1v = 0x38; + } else { + a1v = 0x84; + } + func_80016714(obj, a1v); + done:; + } + func_80016714(dst, 0x10C); + *(u16 *)(src + 0xA) &= 0x7FFF; + return 0; + } + + if (*(s32 *)(dst + 0x64) == 0) { + void *o = *(void **)(dst + 0x20); + if (o == 0) { + return (s32)dst; + } + if (*(u16 *)o == 1) { + s16 c = *(s16 *)(src + 0xC); + if (c != 0x7FFF) { + *(s16 *)((u8 *)o + 0x12) = c; + } + } + } + if (*(s32 *)(dst + 0x20) != 0) { + *(u16 *)(*(s32 *)(dst + 0x20) + 0x8) = *(u16 *)(dst + 0x6) + *(u16 *)(dst + 0x50); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xA) = *(u16 *)(dst + 0xA) + *(u16 *)(dst + 0x52); + *(u16 *)(*(s32 *)(dst + 0x20) + 0xC) = *(u16 *)(dst + 0xE) + *(u16 *)(dst + 0x54); + } + return (s32)dst; +} + + +DEFINE_func_8012CAE4() /* dedup: shared engine-core @0x8012CAE4 (src/shared) */ + +DEFINE_func_8012CB64() /* dedup: shared engine-core @0x8012CB64 (src/shared) */ + +DEFINE_func_8012CBA4() /* dedup: shared engine-core @0x8012CBA4 (src/shared) */ + +DEFINE_func_8012CBCC() /* dedup: shared engine-core @0x8012CBCC (src/shared) */ + +DEFINE_func_8012CBF4() /* dedup: shared engine-core @0x8012CBF4 (src/shared) */ + +DEFINE_func_8012CC1C() /* dedup: shared engine-core @0x8012CC1C (src/shared) */ + +DEFINE_func_8012CC40() /* dedup: shared engine-core @0x8012CC40 (src/shared) */ + +DEFINE_func_8012CC64() /* dedup: shared engine-core @0x8012CC64 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012CC88); + +DEFINE_func_8012CE2C() /* dedup: shared engine-core @0x8012CE2C (src/shared) */ + +DEFINE_func_8012CEB0() /* dedup: shared engine-core @0x8012CEB0 (src/shared) */ + +DEFINE_func_8012CFA8() /* dedup: shared engine-core @0x8012CFA8 (src/shared) */ + +DEFINE_func_8012D098() /* dedup: shared engine-core @0x8012D098 (src/shared) */ + +DEFINE_func_8012D38C() /* dedup: shared engine-core @0x8012D38C (src/shared) */ + +DEFINE_func_8012D3AC() /* dedup: shared engine-core @0x8012D3AC (src/shared) */ + +DEFINE_func_8012D3B4() /* dedup: shared engine-core @0x8012D3B4 (src/shared) */ + +DEFINE_func_8012D4B4() /* dedup: shared engine-core @0x8012D4B4 (src/shared) */ + +DEFINE_func_8012D5DC() /* dedup: shared engine-core @0x8012D5DC (src/shared) */ + +DEFINE_func_8012D5E4() /* dedup: shared engine-core @0x8012D5E4 (src/shared) */ + +DEFINE_func_8012D624() /* dedup: shared engine-core @0x8012D624 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH + + +struct S8012D664_8012D664 { short a, b, c; }; + +int func_8012D664(int arg0, int arg1, int arg2) { + extern int func_8012F568(); + extern int D_80186D2C; + + struct S8012D664_8012D664 s; + int ret; + int t; + + s.a = (*(unsigned short*)&D_80126B5E); + s.b = (*(unsigned short*)&D_80126B62) - 0x40; + s.c = (*(unsigned short*)&D_80126B66); + ret = ((int(*)())func_800132BC)(arg0, &s); + t = arg1 + 0x20; + if (ret < t * t) { + func_8012F568(1, 1, 0, arg2, arg0, &D_80186D2C); + return 1; + } + return 0; +} + + + +DEFINE_func_8012D714() /* dedup: shared engine-core @0x8012D714 (src/shared) */ + + + +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80186D34; +extern M2C_UNK D_80186D3C; + +s32 func_8012DB84(void) +{ + func_8014C978(); + func_8012F568(1, 0xC001, 0, 0x3E8, &D_80186D34, &D_80186D3C); +} + + +DEFINE_func_8012DBD0() /* dedup: shared engine-core @0x8012DBD0 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH + + +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; + + +s32 func_8012DDA4() +{ + extern Entry_8012DDA4 * D_801B0D0C; + extern Entry_8012DDA4 * D_801B0D08; + + Entry_8012DDA4 *p; + Entry_8012DDA4 *end = ((Entry_8012DDA4 *)D_80126720); + + while (D_801B0D0C != end) { + p = D_801B0D0C; + if (p->active != 0 && p != D_801B0D08) { + D_801B0D0C = p + 1; + return p; + } + D_801B0D0C++; + } + D_801B0D0C = 0; + return 0; +} + + + +// @class: plumbing +// @stuck: none — MATCH (35/35 ins, relocation-masked) + + +s32 func_8012DE2C(s32 a0) { + extern u8 * D_801B0D0C; + extern u8 * D_801B0D08; + + u8 *base; + u8 *end; + u8 *p; + + base = D_801202A0; + end = base + 0x6480; + D_801B0D0C = base; + D_801B0D08 = ((u8 *)a0); + + while (D_801B0D0C != end) { + p = D_801B0D0C; + if (*(u16 *)p != 0 && p != ((u8 *)a0)) { + D_801B0D0C = p + 0x10C; + return p; + } + D_801B0D0C += 0x10C; + } + D_801B0D0C = 0; + return 0; +} + + + +DEFINE_func_8012DEB8() /* dedup: shared engine-core @0x8012DEB8 (src/shared) */ + +DEFINE_func_8012DF34() /* dedup: shared engine-core @0x8012DF34 (src/shared) */ + +DEFINE_func_8012DFBC() /* dedup: shared engine-core @0x8012DFBC (src/shared) */ + +DEFINE_func_8012DFCC() /* dedup: shared engine-core @0x8012DFCC (src/shared) */ + +DEFINE_func_8012DFD4() /* dedup: shared engine-core @0x8012DFD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012E014); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012E138); + + +s32 func_8012E27C(void) { + return 1; +} + + +DEFINE_func_8012E284() /* dedup: shared engine-core @0x8012E284 (src/shared) */ + +DEFINE_func_8012E28C() /* dedup: shared engine-core @0x8012E28C (src/shared) */ + +DEFINE_func_8012E32C() /* dedup: shared engine-core @0x8012E32C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012E364); + +DEFINE_func_8012E470() /* dedup: shared engine-core @0x8012E470 (src/shared) */ + +DEFINE_func_8012E4C8() /* dedup: shared engine-core @0x8012E4C8 (src/shared) */ + +DEFINE_func_8012E504() /* dedup: shared engine-core @0x8012E504 (src/shared) */ + +DEFINE_func_8012E544() /* dedup: shared engine-core @0x8012E544 (src/shared) */ + +DEFINE_func_8012E57C() /* dedup: shared engine-core @0x8012E57C (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH +extern u8 D_800AF648; +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3) +{ + struct { short xy[2]; int sp14; int flag; } f; + register void *p __asm__("$4"); + p = &D_800AF648; + func_8004914C(p); + func_800491AC(&D_800AF648); + RotTransPers(param_1, (s32)f.xy, &f.sp14, &f.flag); + if (f.flag >= 0 && (u16)(f.xy[0] + 199) < 399 && (u16)(f.xy[1] + 0xA9) < 0x153) { + func_8002D4C8(param_2, param_3); + } +} + + +DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012E688 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012E778); + +DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012E88C (src/shared) */ + +DEFINE_func_8012E8A8() /* dedup: shared engine-core @0x8012E8A8 (src/shared) */ + +DEFINE_func_8012E8C4() /* dedup: shared engine-core @0x8012E8C4 (src/shared) */ + +DEFINE_func_8012E8E0() /* dedup: shared engine-core @0x8012E8E0 (src/shared) */ + + + +// @class: other +// @stuck: none — MATCH (branch-polarity invert: `0x78 != 0` puts compute block as fall-through) + +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80186D44; + +void func_8012E9C0(int param_1) +{ + int iVar1; + + if (*(short *)(param_1 + 0x60) != 0) { + if (*(unsigned char *)(param_1 + 0x5e) == 0x1d) { + *(short *)(param_1 + 0x82) = 0; + *(short *)(param_1 + 0x7c) = *(unsigned short *)(param_1 + 6); + *(short *)(param_1 + 0x7e) = *(unsigned short *)(param_1 + 0xa); + *(short *)(param_1 + 0x80) = *(unsigned short *)(param_1 + 0xe); + } + if (*(int *)(param_1 + 0x78) != 0) { + iVar1 = *(short *)(param_1 + 0x60) * + *(short *)(*(int *)(param_1 + 0x78) + 0x30) >> 0xc; + if (iVar1 < 1) { + iVar1 = 1; + } + } else { + iVar1 = *(short *)(param_1 + 0x60); + } + func_8016AA50(param_1, iVar1); + if ((*(unsigned short *)(param_1 + 0x82) & 1) != 0) { + func_8016B428(param_1); + func_80019064(&D_80186D44); + } + } + return; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012EA90); + +DEFINE_func_8012EC04() /* dedup: shared engine-core @0x8012EC04 (src/shared) */ + +DEFINE_func_8012EECC() /* dedup: shared engine-core @0x8012EECC (src/shared) */ + +DEFINE_func_8012EF34() /* dedup: shared engine-core @0x8012EF34 (src/shared) */ + +DEFINE_func_8012EF70() /* dedup: shared engine-core @0x8012EF70 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012EFB8); + + +// @class: other +// @stuck: none — MATCH (33 ins, match_one verified) + +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); + +void func_8012F038(int param_1, short *param_2, short *param_3) { + int in[3]; + int out[3]; + + in[0] = (int)param_2[0] - *(int *)(param_1 + 0x14); + in[1] = (int)param_2[1] - *(int *)(param_1 + 0x18); + in[2] = (int)param_2[2] - *(int *)(param_1 + 0x1c); + ApplyTransposeMatrixLV((void *)param_1, in, out); + param_3[0] = out[0]; + param_3[1] = out[1]; + param_3[2] = out[2]; +} + + +DEFINE_func_8012F0BC() /* dedup: shared engine-core @0x8012F0BC (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (clone of confirmed func_8012F214 template; passthrough a0) +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(s32 a0, s32 a1, void *a2); + +void func_8012F14C(s32 a0, s32 a1, s32 a2) +{ + s32 buf[2]; + func_8004914C((void *)a0); + func_800491AC((void *)a0); + RotTransSV(a1, a2, buf); +} + + +DEFINE_func_8012F1A4() /* dedup: shared engine-core @0x8012F1A4 (src/shared) */ + +DEFINE_func_8012F214() /* dedup: shared engine-core @0x8012F214 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012F274); + +DEFINE_func_8012F2E8() /* dedup: shared engine-core @0x8012F2E8 (src/shared) */ + +DEFINE_func_8012F374() /* dedup: shared engine-core @0x8012F374 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012F40C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_8012F49C); + +DEFINE_func_8012F568() /* dedup: shared engine-core @0x8012F568 (src/shared) */ + +DEFINE_func_8012F5F4() /* dedup: shared engine-core @0x8012F5F4 (src/shared) */ + +DEFINE_func_8012F68C() /* dedup: shared engine-core @0x8012F68C (src/shared) */ + +DEFINE_func_8012F75C() /* dedup: shared engine-core @0x8012F75C (src/shared) */ + +DEFINE_func_8012F7B4() /* dedup: shared engine-core @0x8012F7B4 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186D60[]; + +void func_8012F828(int param_1) +{ + *(unsigned char *)(param_1 + 0xC1) = 4; + if (*(unsigned int *)(param_1 + 0xB4) & 8) { + func_80131170(param_1, D_80186D60, 0xB); + } + func_80131CA8(param_1, 9); +} + + +DEFINE_func_8012F87C() /* dedup: shared engine-core @0x8012F87C (src/shared) */ + + +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern void func_80131CA8(int a0, int a1); +extern u8 D_80186D6C[]; + +void func_8012F8C8(u8* arg0) { + *(u8*)(arg0 + 0xC1) = 7; + if (*(u32*)(arg0 + 0xB4) & 0x80) { + ((void (*)(void*, void*, s32))func_80131170)(arg0, D_80186D6C, 0xB); + } + ((void (*)(void*, s32))func_80131CA8)(arg0, 0x16); +} + + +DEFINE_func_8012F91C() /* dedup: shared engine-core @0x8012F91C (src/shared) */ + +DEFINE_func_8012F968() /* dedup: shared engine-core @0x8012F968 (src/shared) */ + +DEFINE_func_8012FB54() /* dedup: shared engine-core @0x8012FB54 (src/shared) */ + +DEFINE_func_8012FC30() /* dedup: shared engine-core @0x8012FC30 (src/shared) */ + +DEFINE_func_8012FCA4() /* dedup: shared engine-core @0x8012FCA4 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (57 ins), byte-exact via rtu_match on the real TU. +// ROOT CAUSE of the prior 3-off "irreducible schedule-steal": the wave-2 draft had the WRONG ARITY for +// func_80131B14. It cast the call to (int,int) and passed (param_1, 0x1C), which forced `li a1,0x1C` to be +// func_80131B14's OWN arg. That premise made the beqz-delay `li a1,0x1C` / jal-delay `move a0,s0` look like an +// un-reorderable {li,move} schedule-steal (calls.c emits a0 first; sched2 keeps LUID; reorg swaps them). +// THE FIX: func_80131B14 takes ONE arg — ((void(*)(int))func_80131B14)(param_1). Then: +// - func_80131B14's own delay slot = `move a0,s0` (its a0 arg), and a1 is NOT live across it. +// - the `li a1,0x1C` in the beqz(0x100) delay slot is the TERMINAL func_80131CA8(param_1,0x1C)'s arg, which +// reorg fill_slots_from_thread shares into the delay slot for the beqz-taken (else) edge FOR FREE, because +// a1 is dead on the fall-through (1-arg func_80131B14 never reads a1) so there is no resource conflict. +// No barrier, no register pin, no schedule mutation — the correct arity makes the target schedule fall out +// of stock gcc-2.7.2 reorg. (Lesson for the cookbook: before conceding a delay-slot "steal" as irreducible, +// re-derive the CALLEE ARITY from the asm — a spurious extra register arg that is live across the call is what +// blocks reorg from sharing a downstream constant into a branch delay slot.) + + +s32 func_8012FCC4(s32 param_1) { + extern int D_80186D78; + + int v1 = *(int *)(((int)param_1) + 0xC4); + *(char *)(((int)param_1) + 0xC1) = 8; + if (v1 & 2) { + *(char *)(((int)param_1) + 0xC1) = 1; + func_80131CA8(((int)param_1), 3); + return; + } + if (v1 & 1) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 1); + return; + } + if (*(int *)(((int)param_1) + 0xB4) & 0x100) { + ((void (*)(int))func_80131B14)(((int)param_1)); + if (*(short *)(((int)param_1) + 0x76) <= 0) { + ((void (*)(int, int))func_80131E00)(((int)param_1), 0xC); + return; + } + if (((s32(*)(s32, s32))func_80131A34)(((int)param_1), 4) != 0) { + *(char *)(((int)param_1) + 0xC2) = 0; + } else { + *(short *)(((int)param_1) + 0x98) = 0; + *(char *)(((int)param_1) + 0xC2) = 1; + } + ((void (*)(int, void *))func_8012B14C)(((int)param_1), &D_80186D78); + *(int *)(((int)param_1) + 0x1C) = 0; + func_80131CA8(((int)param_1), 0x1C); + return; + } + func_80131CA8(((int)param_1), 0x1C); +} + + + +DEFINE_func_8012FDA8() /* dedup: shared engine-core @0x8012FDA8 (src/shared) */ + +DEFINE_func_8012FE70() /* dedup: shared engine-core @0x8012FE70 (src/shared) */ + +DEFINE_func_8012FF00() /* dedup: shared engine-core @0x8012FF00 (src/shared) */ + +DEFINE_func_8012FF4C() /* dedup: shared engine-core @0x8012FF4C (src/shared) */ + +DEFINE_func_8012FF98() /* dedup: shared engine-core @0x8012FF98 (src/shared) */ + +DEFINE_func_8013001C() /* dedup: shared engine-core @0x8013001C (src/shared) */ + +DEFINE_func_80130088() /* dedup: shared engine-core @0x80130088 (src/shared) */ + +DEFINE_func_801300F4() /* dedup: shared engine-core @0x801300F4 (src/shared) */ + +DEFINE_func_801301E8() /* dedup: shared engine-core @0x801301E8 (src/shared) */ + +DEFINE_func_80130278() /* dedup: shared engine-core @0x80130278 (src/shared) */ + +DEFINE_func_80130314() /* dedup: shared engine-core @0x80130314 (src/shared) */ + +DEFINE_func_80130360() /* dedup: shared engine-core @0x80130360 (src/shared) */ + +DEFINE_func_801303A0() /* dedup: shared engine-core @0x801303A0 (src/shared) */ + +DEFINE_func_801303EC() /* dedup: shared engine-core @0x801303EC (src/shared) */ + +DEFINE_func_80130438() /* dedup: shared engine-core @0x80130438 (src/shared) */ + +DEFINE_func_80130514() /* dedup: shared engine-core @0x80130514 (src/shared) */ + +DEFINE_func_801305CC() /* dedup: shared engine-core @0x801305CC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80130650); + +DEFINE_func_80130740() /* dedup: shared engine-core @0x80130740 (src/shared) */ + +DEFINE_func_801307B0() /* dedup: shared engine-core @0x801307B0 (src/shared) */ + +DEFINE_func_80130858() /* dedup: shared engine-core @0x80130858 (src/shared) */ + +DEFINE_func_80130898() /* dedup: shared engine-core @0x80130898 (src/shared) */ + +DEFINE_func_801308DC() /* dedup: shared engine-core @0x801308DC (src/shared) */ + +DEFINE_func_80130974() /* dedup: shared engine-core @0x80130974 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80130A18); + +DEFINE_func_80130AC4() /* dedup: shared engine-core @0x80130AC4 (src/shared) */ + +DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130AF0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80130C08); + + +extern void (*D_80186D80[])(void); + +void func_80130D0C(void *a0) { + D_80186D80[*(u8 *)((s32)a0 + 0xC1)](); +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (266/266). Levers: pin pa=$s2 p=$s3, tbl=$s0 (NOT s1v — leave natural so switch-mask lands in $v1); tight-block pins for the table-addr temps `register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2")` force offset=$v1/base=$v0 (else compute-into-dest $s0); inline offset `TABLE + s1v*2` (late) keeps the 2-sll delay-slot dup; 0x60000 reuses `tbl` (not a fresh `e`) so it stays $s0 and materializes after rand(). +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186DD0[]; +extern s16 D_80186E00[]; +extern s16 D_80186E60[]; +extern s16 D_80186E68[]; +extern s16 D_80186E88[]; + +void func_80130D48(s32 arg0) +{ + register s16 *tbl __asm__("$16"); + register s32 pa __asm__("$18") = arg0; + register u8 *p __asm__("$19") = D_80078E78; + s32 s1v; + s32 call_a0; + s32 call_a1; + s32 cnt; + s32 r; + void *ret; + + s1v = func_80131CF4(*(s32 *)((s8 *)pa + 0xBC), 0x15); + if (s1v == 0) { + return; + } + + if (*(u8 *)((s8 *)pa + 0x5E) == 0xB) { + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + } + + switch (s1v & 0xFFFF0000) { + case 0x10000: { + u32 x = D_80078EB4; + u32 y = D_80078EB2; + u32 b; + u32 a; + + s1v = 0; + if (x == y) { + s1v = 0xC; + } else if ((y >> 1) >= x) { + s1v = 3; + } + + b = *(u16 *)(p + 0x40); + a = *(u16 *)(p + 0x3E); + if (b == a) { + s1v += 0x18; + } else if ((a >> 1) >= b) { + s1v += 6; + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E00; tbl = (s16 *)(bp + v1); } + + r = rand() % 100; + cnt = 0; + loop27: + if (r >= *tbl) { + cnt += 1; + tbl += 1; + if (cnt < 3) { + goto loop27; + } + } + + s1v = 0; + switch (cnt) { + case 0: + tbl = D_80186E60; + s1v = 0x31; + break; + case 1: { + s32 mx = *(u16 *)(p + 0x3A); + s32 cur = *(u16 *)(p + 0x3C); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E68; tbl = (s16 *)(bp + v1); } + s1v = 0x32; + break; + } + case 2: { + s32 mx = *(u16 *)(p + 0x3E); + s32 cur = *(u16 *)(p + 0x40); + if (((mx * 7) / 10) >= cur) { + s1v = 4; + if ((mx / 2) >= cur) { + s1v = 8; + if ((mx / 5) >= cur) { + s1v = 0xC; + } + } + } + { register s32 v1 __asm__("$3"); register s8 *bp __asm__("$2"); v1 = s1v * 2; bp = (s8 *)D_80186E88; tbl = (s16 *)(bp + v1); } + s1v = 0x33; + break; + } + } + + r = rand() % 100; + call_a1 = 0; + loop50: + if (r >= *tbl) { + call_a1 += 1; + tbl += 1; + if (call_a1 < 4) { + goto loop50; + } + } + call_a0 = s1v; + goto do_call; + } + case 0x20000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x30000: + call_a0 = 0x31; + call_a1 = 0; + goto do_call; + case 0x40000: + call_a0 = 0x32; + call_a1 = 0; + goto do_call; + case 0x50000: + call_a0 = 0x33; + call_a1 = 0; + goto do_call; + case 0x60000: { + s32 rr = rand() & 0xFF; + tbl = D_80186DD0; + if (rr >= *tbl) { + do { + tbl += 3; + } while (rr >= *tbl); + } + call_a0 = tbl[1]; + if (*(u16 *)(p + 0x40) < 4U) { + call_a0 = 0x33; + } + call_a1 = tbl[2]; + goto do_call; + } + case 0x70000: + call_a0 = 0x27B; + call_a1 = 0; + goto do_call; + default: + return; + } + +do_call: + ret = func_8012C658(call_a0, call_a1, pa); + if (ret != 0) { + *(u16 *)((s8 *)ret + 0xA) -= 0x20; + } +} + + +// @class: loop-guard +// @stuck: none — MATCH (88 ins). Keys: duplicate the c!=0/c==0 bodies verbatim (gcc cross-jumps +// the shared "|=4;goto tail" into L240 on its own); tail dispatch as `if (((s32(*)(s32))func_8012BCCC)(p) <= 0x8FFF)` +// (the <= polarity makes the >0x8FFF/0x33-first block the bnez'd else=L298, fall-through = 0x32-first); +// both AC8 tails cross-jump-merge into the shared L2AC final call. Externs aligned to the file's +// existing decls for gate-safety: func_80131B14(void) [file line 1486], func_8012B14C/func_8012BCCC +// canonical (s32) [DEFINE macros], ((s32(*)())func_80131AC8)() no-proto (compatible w/ later 1-arg DEFINE, 2-arg call). + + +void func_80131170(s32 p, s32 b, s32 c) { + extern u8 D_80186D54[]; + + func_80131B14(); + *(u8 *)(((u8 *)p) + 0xC2) = 0; + *(u8 *)(((u8 *)p) + 0xC3) = 0; + *(s16 *)(((u8 *)p) + 0x98) = 0; + if (((u8 *)b) == 0) { + ((u8 *)b) = D_80186D54; + } + func_8012B14C((s32)((u8 *)p), (s32)((u8 *)b)); + *(s32 *)(((u8 *)p) + 0x1C) = 0; + if (c != 0) { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), c) != 0) goto tail; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } else { + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x24) != 0) goto tail; + *(s32 *)(((u8 *)p) + 0xC4) &= ~4; + if (((s32(*)(s32, s32))func_80131A34)((s32)((u8 *)p), 0x20) != 0) { + *(s32 *)(((u8 *)p) + 0xC4) |= 4; + } else { + *(s16 *)(((u8 *)p) + 0x98) = 0; + } + } +tail: + if (*(s16 *)(((u8 *)p) + 0x76) > 0) { + return; + } + if (((s32(*)(s32))func_8012BCCC)((s32)((u8 *)p)) <= 0x8FFF) { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x32) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x33); + } else { + if (((s32(*)())func_80131AC8)(((u8 *)p), 0x33) != 0) return; + ((s32(*)())func_80131AC8)(((u8 *)p), 0x32); + } +} + + + +// @class: struct +// @stuck: none — MATCH (8-byte alignment-1 struct copy → lwl/lwr/swl/swr) + +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ + + +s32 func_801312D0(s32 param_1, void *param_2) +{ + extern int func_80131CF4(int, int); + extern M8_801312D0 D_80186EA8; + + int iVar5; + + iVar5 = func_80131CF4(*(int *)(((int)param_1) + 0xBC), 0x2E); + if (iVar5 != 0) { + ((short *)param_2)[2] = 0; + ((short *)param_2)[0] = 0; + ((short *)param_2)[1] = (short)iVar5; + } else { + *(M8_801312D0 *)((short *)param_2) = D_80186EA8; + } +} + + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80131340); + +DEFINE_func_801319E0() /* dedup: shared engine-core @0x801319E0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80131A34); + +DEFINE_func_80131AC8() /* dedup: shared engine-core @0x80131AC8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (89 ins). Reconcile: TU canonical decl is `void func_80131B14(void)` +// (ov_SC01_077_a.c L1676/L1756; callers cast to (void(*)(int)) when passing p), so the def MUST be +// (void) or cc1 hard-errors `conflicting types` (exit 33). §42c lever #6: capture incoming $a0 into a +// NORMAL pseudo (`register u8 *a0v __asm__("$4"); u8 *p = a0v;`) so p gets a callee-saved home ($s0). +// func_8012B2CC/func_8012B23C are file-scope DEFINE'd here (split L740/L744) as void(s32) — do NOT redeclare; +// the (void(*)(void*)) cast on the bare name is byte-neutral. Body keys: e(0x5E) as s32 not u8 (kills the +// compare-time andi 0xff); f76 dual-width via per-access casts (lhu in the decrement, lh in the <=0 compare); +// the p->f20 reload split into TWO separate temps so the 2nd load takes $v0 not $v1. + +void func_80131B14() { + extern void func_8002A520(void *); + extern void func_8002A790(void *); + extern u8 D_80186EB0; + + register u8 *a0v __asm__("$4"); + u8 *p = a0v; + + + s32 e = *(u8 *)(p + 0x5E); + + if (*(s16 *)(p + 0x60) != 0) { + if (e == 0x1D) { + *(s16 *)(p + 0x82) = 0; + *(s16 *)(p + 0x7C) = *(u16 *)(p + 0x06); + *(s16 *)(p + 0x7E) = *(u16 *)(p + 0x0A); + *(s16 *)(p + 0x80) = *(u16 *)(p + 0x0E); + } + { + s32 dec; + s32 q = *(s32 *)(p + 0x78); + if (q != 0) { + dec = ((s32)*(s16 *)(p + 0x60) * (s32)*(s16 *)(q + 0x30)) >> 12; + if (dec <= 0) dec = 1; + } + *(u16 *)(p + 0x76) = *(u16 *)(p + 0x76) - dec; + } + ((void (*)(void *))func_8016AA50)(p); + if (*(u16 *)(p + 0x82) & 1) { + ((void (*)(void *))func_8016B428)(p); + ((void(*)(void *))func_80019064)(&D_80186EB0); + } + } + + *(u16 *)(p + 0x5C) = *(u16 *)(p + 0x5C) & 0xFFFE; + + if (e != 0x1D) { + if (*(u8 *)(p + 0xC8)) func_8002A520(p); + if (*(u8 *)(p + 0xC9)) func_8002A790(p); + } + + if (*(s16 *)(p + 0x76) <= 0) *(s16 *)(p + 0x5C) = 0; + + { + s32 r = *(s32 *)(p + 0x20); + *(s16 *)(r + 0x12) = (*(u16 *)(p + 0x62) + 0x800) & 0xFFF; + { + s32 r2 = *(s32 *)(p + 0x20); + *(s16 *)(r2 + 0x14) = 0; + *(s16 *)(r2 + 0x10) = 0; + } + } + + ((void (*)(void *))func_8012B2CC)(p); + ((void (*)(void *))func_8012B23C)(p); +} + + + +DEFINE_func_80131C78() /* dedup: shared engine-core @0x80131C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80131CA8); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80131CF4); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80131D68); + + +extern void (*D_80186EC0[])(struct S80131E00 *a0); + +void func_80131E00(struct S80131E00 *a0, s32 a1) { + a0->field_B0 = a1; + D_80186EC0[a1](a0); +} + + +DEFINE_func_80131E38() /* dedup: shared engine-core @0x80131E38 (src/shared) */ + +DEFINE_func_80131E7C() /* dedup: shared engine-core @0x80131E7C (src/shared) */ + +DEFINE_func_80131EE4() /* dedup: shared engine-core @0x80131EE4 (src/shared) */ + + +extern void (*D_80186F18[])(void); + +void func_80131EEC(void *a0) { + D_80186F18[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80186F60[])(void); + +void func_80131F28(void *a0) { + D_80186F60[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80186F68[])(void); + +void func_80131F64(void *a0) { + D_80186F68[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80186F70[])(void); + +void func_80131FA0(void *a0) { + D_80186F70[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80186F78[])(void); + +void func_80131FDC(void *a0) { + D_80186F78[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80132018); + +DEFINE_func_801320D0() /* dedup: shared engine-core @0x801320D0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80186F20; + +void func_801320D8(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80186F20; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +s32 func_80132144(s32 param_1) +{ + extern int D_80186F30; + + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(((int)param_1) + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(((int)param_1)); + } else { + ((void(*)(int, int))func_8001C214)(v0, 0); + *(int *)(((int)param_1) + 0x58) = (int)&D_80186F30; + *(short *)(((int)param_1) + 0x5c) = 0x80; + *(unsigned short *)(((int)param_1) + 2) += 1; + } +} + + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80186F40; + +void func_801321B0(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80186F40; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple if/else, param saved in $s0 across call + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(int, int); +extern int D_80186F50; + +void func_8013221C(int param_1) +{ + int v0; + + v0 = ((int (*)(void))func_8012C1B8)(); + *(int *)(param_1 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + func_8001C214(v0, 0); + *(int *)(param_1 + 0x58) = (int)&D_80186F50; + *(short *)(param_1 + 0x5c) = 0x80; + *(unsigned short *)(param_1 + 2) += 1; + } +} + + +DEFINE_func_80132288() /* dedup: shared engine-core @0x80132288 (src/shared) */ + +DEFINE_func_8013240C() /* dedup: shared engine-core @0x8013240C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_801325B8); + +DEFINE_func_8013277C() /* dedup: shared engine-core @0x8013277C (src/shared) */ + +DEFINE_func_80132784() /* dedup: shared engine-core @0x80132784 (src/shared) */ + +DEFINE_func_80132DC4() /* dedup: shared engine-core @0x80132DC4 (src/shared) */ + +DEFINE_func_80132E6C() /* dedup: shared engine-core @0x80132E6C (src/shared) */ + +DEFINE_func_80132EC4() /* dedup: shared engine-core @0x80132EC4 (src/shared) */ + +DEFINE_func_80132EF4() /* dedup: shared engine-core @0x80132EF4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80132F40); + +DEFINE_func_80133060() /* dedup: shared engine-core @0x80133060 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_801330E0); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80133298); + +DEFINE_func_8013339C() /* dedup: shared engine-core @0x8013339C (src/shared) */ + +DEFINE_func_8013361C() /* dedup: shared engine-core @0x8013361C (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH + +extern s32 D_801B0D58; +extern s32 D_801B0D5C[]; +extern int D_801B0D60; +extern void func_80136BC4(s32 a0); + +void func_801336E8(void *a0, int a1, int a2) { + if (a0 != 0) { + (*(void * *)&D_801B0D58) = a0; + ((void (*)(void))func_80136BC4)(); + } + (*(int *)&D_801B0D5C) = a1; + D_801B0D60 = a2; +} + + + + +extern s32 D_801B0D5C[]; +extern s32 D_801B0D58; +extern void func_80136BC4(s32); + +void func_8013373C(s16 arg0) { + s32 temp = D_801B0D5C[arg0]; + if (temp != 0) { + D_801B0D58 = temp; + func_80136BC4(temp); + } +} + + +// @class: regalloc-order +#include "common.h" + +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; + + +s32 func_80133784(s32 arg0, void *arg1, s32 arg2) { + extern s32 func_80047D3C(s32); + extern s32 func_80133AB0(s16, s16, s16, s32); + extern Box_80133784 * D_80186F80; + extern Box_80133784 * D_80186F84; + extern s16 D_801B0D64; + extern u16 D_801B0D68; + + register s32 s1 __asm__("$17"); + s32 s2; + register s16 s3 __asm__("$19"); + register s32 s4 __asm__("$20"); + register s16 a0v __asm__("$4"); + register s16 arg0s __asm__("$21"); + s32 dx, dy, dz; + s32 r, ret; + + a0v = ((s16)arg0); + s1 = 0; + s3 = 0; + s4 = 0; + s2 = 0; + arg0s = a0v; + D_80186F80->f6 = -0x7FFF; + D_80186F84->f6 = 0x7FFF; + D_80186F80->f0 = ((Box_80133784 *)arg1)->f0; + D_80186F80->f4 = ((Box_80133784 *)arg1)->f4; + D_80186F84->f0 = ((Box_80133784 *)arg2)->f0; + D_80186F84->f4 = ((Box_80133784 *)arg2)->f4; + D_801B0D68 = 0; + D_801B0D64 = 0; + + if ((s16)a0v == 0) { + s16 sx = ((Box_80133784 *)arg2)->f0 - ((Box_80133784 *)arg1)->f0; + s16 sy = ((Box_80133784 *)arg2)->f2 - ((Box_80133784 *)arg1)->f2; + s16 sz = ((Box_80133784 *)arg2)->f4 - ((Box_80133784 *)arg1)->f4; + if (sx == 0 && sy == 0) { + s32 zt = (sz == 0); + __asm__("addu %0,%1,$zero" : "=r"(s2) : "r"(zt)); + } + D_80186F80->f2 = ((Box_80133784 *)arg1)->f2 - 4; + r = func_80047D3C(sx * sx + sz * sz); + if (r < 3) { + r = 4; + } else if (r < 5) { + r += 1; + } + D_80186F84->f2 = ((Box_80133784 *)arg2)->f2 + r + 1; + } else { + D_80186F80->f2 = ((Box_80133784 *)arg1)->f2; + if ((s16)a0v == 2) { + D_80186F84->f0 = D_80186F80->f0; + D_80186F84->f2 = D_80186F80->f2 + 6; + s2 = 1; + D_80186F84->f4 = D_80186F80->f4; + } else { + D_80186F84->f2 = ((Box_80133784 *)arg2)->f2; + } + } + + while (1) { + s32 ret0; + register s32 retc __asm__("$3"); + __asm__ __volatile__(""); + ret0 = func_80133AB0(arg0s, (s16)D_80186F80->f0, (s16)D_80186F80->f4, (*(s32*)&D_801B0D58)); + __asm__("addu %0,%1,$zero" : "=r"(retc) : "r"(ret0)); + ret = retc; + if (ret == 0) goto after; + s4 |= ret; + if (s2 != 0) goto after; + { + s16 oldc = s3; + s3 = s3 + 1; + if (oldc >= 5) break; + } + } + + D_80186F84->f0 = D_80186F80->f0; + D_80186F84->f2 = D_80186F80->f2; + s1 = 0x2000; + D_80186F84->f4 = D_80186F80->f4; + goto store_out; + +after: + if ((s16)s4 != 0 || D_801B0D64 != 0) { + s16 t; + __asm__ __volatile__("" :: "r"(s4)); + t = D_80186F80->f6; + if (t >= -0xBCB) { + if (t < -0x578) { + s1 |= 0x4000; + } else { + s1 |= 0x8000; + } + } + if ((s16)D_80186F84->f6 < -0xBCB) { + s1 |= 0x2000; + } + store_out: + ((Box_80133784 *)arg2)->f0 = D_80186F84->f0; + ((Box_80133784 *)arg2)->f2 = D_80186F84->f2; + ((Box_80133784 *)arg2)->f4 = D_80186F84->f4; + ((Box_80133784 *)arg2)->f6 = D_801B0D68; + return s1 & 0xFFFF; + } + ((Box_80133784 *)arg2)->f6 = D_801B0D68; + return 0; +} + + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80133AB0); + + +s32 func_80133CD4(arg0, cmd, base, arr) + s16 arg0; + s16 *cmd; + s16 *base; + s32 *arr; +{ + typedef struct { s16 e[4]; } ElemK; + + extern u16 *D_80186F84; + extern u16 *D_80186F80; + extern s16 *D_80186F8C; + extern s16 *D_80186F88; + extern s32 *D_80186F94; + extern s32 *D_80186F98; + extern u16 D_801B0D68; + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern u16 D_801152AE; + extern u8 D_801152B0; + extern s32 func_80134310(); + extern s32 func_8013435C(); + + s16 *s3 = ((ElemK *)base)[cmd[1]].e; + s32 s6 = arr[cmd[2]]; + s32 s0var, s1var; + s32 s2a; + s16 y; + + if (func_80134310(s3, D_80186F84, s6) >= 0) + return 0; + + s1var = func_80134310(s3, D_80186F80, s6); + if (s1var < 0) + return 0; + + s0var = func_80134310(s3, D_80186F8C, 0); + { + u16 *pac = D_80186F80; + s16 *pb8 = D_80186F8C; + s16 *pb4 = D_80186F88; + s32 neg = -s1var; + pb4[0] = pac[0] + neg * pb8[0] / s0var; + pb4[1] = pac[1] + neg * pb8[1] / s0var; + pb4[2] = pac[2] + neg * pb8[2] / s0var; + if (func_8013435C(((ElemK *)base)[cmd[3]].e, pb4, arr[cmd[4]], s3)) + return 0; + } + if (func_8013435C(((ElemK *)base)[cmd[5]].e, D_80186F88, arr[cmd[6]], s3)) + return 0; + if (func_8013435C(((ElemK *)base)[cmd[7]].e, D_80186F88, arr[cmd[8]], s3)) + return 0; + if (arg0 < 0) { + if (func_8013435C(((ElemK *)base)[cmd[9]].e, D_80186F88, arr[cmd[10]], s3)) + return 0; + } + if (arg0 & 0x10) { + if (*(u16 *)cmd & 0x100) + return 0; + } + if (*(u16 *)cmd & 0x200) { + D_801B0D68 = *(u16 *)cmd; + return 0; + } + + { + s32 ret = func_80134310(s3, D_80186F84, s6); + s32 *pc0; + s32 *pc4; + u16 *pb0; + s32 t, o2; + s32 q3v; + + { + s32 *pw = D_80186F94; + ((struct { s32 w; } *)pw)->w = s3[0]; + pw[1] = s3[1]; + pw[2] = s3[2]; + } + s1var = -ret; + + __asm__ __volatile__( + "lwc2 $9, 0(%0)\n" + "lwc2 $10, 4(%0)\n" + "lwc2 $11, 8(%0)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : "r"(D_80186F94) : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"(D_80186F98) : "memory"); + + pc0 = D_80186F94; + pc4 = D_80186F98; + s0var = pc4[0] + pc4[1] + pc4[2]; + pb0 = D_80186F84; + pb0[0] += s1var * pc0[0] / s0var; + pb0[1] += s1var * pc0[1] / s0var; + q3v = s1var * pc0[2] / s0var; + + { + s32 h; + h = ((s16 *)pb0)[0]; + s1var = h << 16; + __asm__("lh %0, 2(%2)" : "=r"(h) : "0"(h), "r"(pb0) : "memory"); + s0var = h << 16; + } + pb0[2] += q3v; + s2a = (s16)pb0[2] << 16; + + t = pc0[0] << 4; + pc0[0] = t; + if (t < 0) s1var |= 0xFFFF; + t = pc0[1] << 4; + pc0[1] = t; + if (t < 0) s0var |= 0xFFFF; + o2 = pc0[2]; + t = o2 << 4; + pc0[2] = t; + if (t < 0) s2a |= 0xFFFF; + s2a += o2 << 5; + s1var += pc0[0] << 1; + s0var += pc0[1] << 1; + + do { + s32 *pl = D_80186F94; + u16 *pb; + s1var += pl[0]; + s0var += pl[1]; + s2a += pl[2]; + pb = D_80186F84; + pb[0] = s1var >> 16; + pb[1] = s0var >> 16; + pb[2] = s2a >> 16; + ret = func_80134310(s3, pb, s6); + } while (ret < ((s3[1] < -0xE00) ? 0x1800 : 0x2F00)); + } + + y = s3[1]; + if (y >= -0xBCB) { + D_80186F80[3] = y; + { + typedef struct { s8 c[8]; } Blk8; + *(Blk8 *)&D_801152B0 = *(Blk8 *)s3; + } + if (*(u8 *)cmd != 0) + goto ret1; + return -1; + } + { + typedef struct { u16 h; } H16; + u16 *s3u = (u16 *)s3; + u16 *bp = D_80186F84; + u16 w; + ((H16 *)D_801152A8)->h = s3u[0]; + w = s3u[1]; + bp[3] = w; + ((H16 *)&D_801152AA)->h = w; + ((H16 *)&D_801152AC)->h = s3u[2]; + ((H16 *)&D_801152AE)->h = s3u[3]; + } +ret1: + return 1; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80134310); + +DEFINE_func_8013435C() /* dedup: shared engine-core @0x8013435C (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (83 ins, relocation-masked) + + + +s32 func_801343C4(s32 angle, s32 p1, s32 p2) +{ + extern int func_80133AB0(int, s16, s16, int); + extern s16 * D_80186F80; + extern s16 * D_80186F84; + extern u16 D_801B0D68; + extern u16 D_801B0D64; + + s16 *pac; + s16 *pb0; + s16 *pacs, *pb0s; + u16 *pb0u; + int a1v, a2v, d94, b0; + int sangle = ((s16)angle); + + pac = D_80186F80; + d94 = D_801B0D58; + pb0 = D_80186F84; + pac[0] = ((u16 *)p1)[0]; + pac[1] = ((u16 *)p1)[1]; + pac[2] = ((u16 *)p1)[2]; + pb0[0] = ((u16 *)p2)[0]; + pb0[1] = ((u16 *)p2)[1]; + pb0[2] = ((u16 *)p2)[2]; + + a1v = pac[0]; a2v = pac[2]; + __asm__ __volatile__("" ::: "memory"); + D_801B0D68 = 0; + D_801B0D64 = 0; + if (func_80133AB0(sangle, a1v, a2v, d94)) { + setdst: + pb0u = (u16 *)D_80186F84; + ((u16 *)p2)[0] = pb0u[0]; + ((u16 *)p2)[1] = pb0u[1]; + ((u16 *)p2)[2] = pb0u[2]; + ((u16 *)p2)[3] = D_801B0D68; + return 1; + } + + pacs = D_80186F80; + pb0s = D_80186F84; + b0 = pb0s[0]; + if ((pacs[0] & 0xFF80) == (b0 & 0xFF80) && + (pacs[2] & 0xFF80) == (pb0s[2] & 0xFF80)) { + return 0; + } + if (func_80133AB0(sangle, b0, pb0s[2], D_801B0D58)) { + goto setdst; + } + return 0; +} + + + +// @class: schedule +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; + + +s32 func_80134510(s32 param) { + extern s32 func_801345F8(s32); + extern Foo_80134510_80134510 * D_80186F80; + extern Foo_80134510_80134510 * D_80186F84; + extern Foo_80134510_80134510 * D_80186F88; + extern u16 D_801B0D68; + + + s32 ret = 0; + Foo_80134510_80134510 *b0 = D_80186F84; + Foo_80134510_80134510 *ac = D_80186F80; + u16 t0 = ((Foo_80134510_80134510 *)param)->f0; + u16 t2, t4; + + ((Foo_80134510_80134510 *)param)->f6 = 0; + ac->f0 = t0; + b0->f0 = t0; + t2 = ((Foo_80134510_80134510 *)param)->f2; + ac->f2 = t2 - 4; + b0->f2 = t2 + 0x2FC; + t4 = ((Foo_80134510_80134510 *)param)->f4; + ac->f4 = t4; + b0->f4 = t4; + + if (func_801345F8((*(s32*)&D_801B0D58)) != 0) { + s16 x; + ((Foo_80134510_80134510 *)param)->f2 = D_80186F88->f2 - 2; + x = D_80186F80->f6; + if (x >= -3019) { + if (x < -1400) { + ret = 0x4000; + } else { + ret = 0x8000; + } + } else { + ret = 0x2000; + } + D_80186F80->f6 = D_801B0D68; + } + return ret; +} + + + +// @class: regalloc-order +// @stuck: 26-mismatch near-miss (structure fully matches: while-loop test-first via j-to-bottom-test, s0=puVar7/s1=cnt/s2=scan/s3=iVar8/s4=iVar9/s5=uVar3/s6=uVar10, a1=param/a0=cc/a3=0x8000 pinned, both range-persist copies present, mult+GPU-index+call all byte-correct). Residual = 4 instances of ONE gcc-2.7.2 regalloc/copy-prop tie-break: target computes a preserved-then-masked value in $v0 and reads $v0 for the mask (`subu $v0; addu $persist,$v0; andi $v0,$v0`), gcc here reads the persist reg (`andi $v0,$t0`). (1) range-check-1 andi reads $t0 not $v0; (2) range-check-2 andi reads $a0 not $v0; (3) `hi=uVar1&0x8000` folds into $a0 — target computes in $v0 + copies to $a0 in the branch-delay (same-block copy, gcc coalesces mine); (4) loop-test `cnt&0xffff` folds to direct `andi $v0,$s1` — target copies `addu $v0,$s1` first. Splitting the value into compare-temp + persist-var produces the copy but gcc forward-propagates the copy DEST into the mask; persist-after-compare kills the copy; explicit `register __asm__` pins fold the whole expr chain into the pinned reg; `=r/0` barriers force bad materialization. Also minor: while-loop header-copy adds a `beqz s1` entry guard vs target `j`, and a2/a3 call-arg setup order. Permuter can't run (register __asm__ pins rejected by pycparser). Genuinely compiler-internal — hand-finish or accept as ceiling. + + +s32 func_801345F8(s32 arg) +{ + extern int func_801347A0(short, u16 *, int, int); + extern u16 * D_80186F80; + extern u16 D_801B0D68; + + register u16 *param_1 __asm__("$5") = ((u16 *)arg); + register u16 *cc __asm__("$4") = D_80186F80; + int c8000 = 0x8000; + register int zr __asm__("$0"); + u32 c1, c2, uVar6, uVar2, cnt, v14; + u16 *ptmp, *puVar4, *puVar7, uVar1; + int hi, harg, iVar9, iVar8, uVar3, uVar10, tbl; + + c1 = ((int)(cc[0] + c8000) >> 7 & 0x1ff) - (u32)param_1[0]; + uVar6 = c1 + zr; + if ((c1 & 0xffff) < (u32)param_1[2]) { + c2 = ((int)(cc[2] + c8000) >> 7 & 0x1ff) - (u32)param_1[1]; + uVar2 = c2 + zr; + if ((c2 & 0xffff) < (u32)param_1[3]) + goto do_mult; + return 0; + found: + D_801B0D68 = *puVar7; + return 1; + do_mult: + tbl = *(int *)(param_1 + 4); + uVar10 = *(int *)(param_1 + 6); + uVar3 = *(int *)(param_1 + 8); + iVar9 = *(int *)(param_1 + 0xc); + iVar8 = *(int *)(param_1 + 0xe); + ptmp = (u16 *)((((u32)(u16)uVar2 * (u32)param_1[2] + (u32)(u16)uVar6) * 2 & 0xffff) * 2 + tbl); + cnt = (u32)ptmp[1]; + v14 = *(int *)(param_1 + 10); + puVar4 = (u16 *)(v14 + (u32)*ptmp + cnt * 2) - 1; + while (((cnt-- + zr) & 0xffff) != 0) { + uVar1 = *puVar4; + hi = uVar1 & 0x8000; + harg = hi + zr; + if (hi == 0) + puVar7 = (u16 *)(iVar9 + (u32)uVar1 * 0x12); + else + puVar7 = (u16 *)(iVar8 + (uVar1 & 0x7fff) * 0x16); + if (func_801347A0((short)harg, puVar7, uVar3, uVar10) != 0) + goto found; + puVar4 = puVar4 - 1; + } + } + return 0; +} + + + +// @class: regalloc-order +// @stuck: none — MATCH (162 ins). iv pinned to $4 (a0) forces move+delay-slot negu; divisor-temp forces divisor-first schedule (load-delay nop). Globals declared pointer-typed (SVec_801347A0*/s16*) so %lo folds per-use instead of &sym address-CSE into callee regs. +#include "common.h" + +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; + +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; + +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; + + + +s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); + extern s16 * D_80186F84; + extern SVec_801347A0 * D_80186F80; + extern SVec_801347A0 * D_80186F88; + + Elem_801347A0 *pElem; + s32 val; + register s32 iv __asm__("$4"); + s32 q; + s32 dvsr; + + pElem = &((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f2]; + val = ((s32 *)arg3)[((S0_801347A0 *)arg1)->f4]; + if (func_80134A28((s32)pElem, (s32)D_80186F84, val) >= 0) { + return 0; + } + iv = func_80134A28((s32)pElem, (s32)D_80186F80, val); + if (iv < 0) { + return 0; + } + iv = -iv; + dvsr = pElem->f2 * 48; + q = (iv * 48) / dvsr; + D_80186F88->f0 = D_80186F80->f0; + D_80186F88->f2 = D_80186F80->f2 + q; + D_80186F88->f4 = D_80186F80->f4; + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f6], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f8]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fa], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->fc]) < -0x2F00) { + return 0; + } + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->fe], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f10]) < -0x2F00) { + return 0; + } + if ((s16)arg0) { + if (func_80134A28((s32)&((Elem_801347A0 *)arg2)[((S0_801347A0 *)arg1)->f12], (s32)D_80186F88, ((s32 *)arg3)[((S0_801347A0 *)arg1)->f14]) < -0x2F00) { + return 0; + } + } + if ((((S0_801347A0 *)arg1)->f0 & 0x300) != 0) { + return 0; + } + D_80186F88->f0 = D_80186F80->f0; + D_80186F88->f4 = D_80186F80->f4; + (*(Elem_801347A0*)D_801152A8) = *pElem; + D_80186F80->f6 = pElem->f2; + return 1; +} + + + +DEFINE_func_80134A28() /* dedup: shared engine-core @0x80134A28 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80134A74); + +// @class: regalloc-order +// @try: variant B — direct pins m=$s5($21), c=$s6($22) + + +s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); + extern void * D_80186F80; + extern void * D_80186F84; + extern void * D_80186F88; + extern void * D_80186F8C; + extern u16 D_801B0D68; + + s32 temp_a3; + s32 temp_s1; + s32 temp_v0; + s32 temp_v0_2; + s32 var_v0; + u16 temp_a1; + s32 temp_s4; + s32 c = arg0; + __asm__ __volatile__("" : "=r"(c) : "0"(c)); + __asm__ __volatile__("" : : "r"(arg0)); + + temp_s4 = arg2 + (M2C_FIELD(((void *)arg1), s16 *, 2) * 8); + temp_s1 = *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 4) * 4)); + var_v0 = 0; + if (func_80134FB8(temp_s4, (s32) D_80186F84, temp_s1) >= 0) { + return var_v0; + } + temp_v0 = func_80134FB8(temp_s4, (s32) D_80186F80, temp_s1); + if (temp_v0 < 0) { + goto block_13; + } + temp_v0_2 = func_80134FB8(temp_s4, (s32) D_80186F8C, 0); + temp_a3 = -temp_v0; + { + u16 *pB4 = (u16 *)D_80186F88; + u16 *pAC = (u16 *)D_80186F80; + s16 *pB8 = (s16 *)D_80186F8C; + pB4[0] = pAC[0] + (temp_a3 * pB8[0]) / temp_v0_2; + pB4[1] = pAC[1] + (temp_a3 * pB8[1]) / temp_v0_2; + pB4[2] = pAC[2] + (temp_a3 * pB8[2]) / temp_v0_2; + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 6) * 8), (s32) pB4, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 8) * 4))) < -0x2F00) { + return var_v0; + } + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xA) * 8), (s32) D_80186F88, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0xC) * 4))) < -0x2F00) { + return var_v0; + } + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0xE) * 8), (s32) D_80186F88, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x10) * 4))) < -0x2F00) { + return var_v0; + } + if ((arg0 << 16) < 0) { + var_v0 = 0; + if (func_80134FB8(arg2 + (M2C_FIELD(((void *)arg1), s16 *, 0x12) * 8), (s32) D_80186F88, *(s32 *)(arg3 + (M2C_FIELD(((void *)arg1), s16 *, 0x14) * 4))) < -0x2F00) { + return var_v0; + } + } + if (c & 1) { + if (!(M2C_FIELD(((void *)arg1), u16 *, 0) & 0x300)) { + goto block_14; + } + return 0; + } + temp_a1 = M2C_FIELD(((void *)arg1), u16 *, 0); + if (!(temp_a1 & 0x200)) { + goto block_14; + } + D_801B0D68 = temp_a1; +block_13: + return 0; +block_14: + __builtin_memcpy(D_801152A8, (void *)temp_s4, 8); + VectorNormalSS(D_80186F8C, D_80186F8C); + { + u16 *pB8 = (u16 *)D_80186F8C; + u16 *pB4b = (u16 *)D_80186F88; + pB4b[0] = pB4b[0] - ((pB8[0] << 0x10) >> 0x1B); + var_v0 = 1; + pB4b[1] = pB4b[1] - ((pB8[1] << 0x10) >> 0x1B); + pB4b[2] = pB4b[2] - ((pB8[2] << 0x10) >> 0x1B); + } + return var_v0; +} + + + +DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134FB8 (src/shared) */ + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype D_80186F84 + D_80186F80 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + extern int func_80134A74(int, s16, s16, int); + extern s16 * D_80186F84; + extern s16 * D_80186F80; + extern u8 D_80186F8C; + extern s16 *D_80186F88; + extern u16 D_801B0D68; + + register s16 *pb0 __asm__("$9"); /* D_80186F84 -> $t1 */ + register s16 *pac __asm__("$6"); /* D_80186F80 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_80186F8C -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = D_80186F84; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = D_80186F80; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80186F8C); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_801B0D58; + __asm__ __volatile__("" ::: "memory"); + D_801B0D68 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_80186F88); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_801B0D68; + return 1; + } + { + register u16 *qb __asm__("$4"); /* D_80186F80 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* D_80186F84[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* D_80186F84 -> $a2 (reloaded) */ + qb = (u16 *)D_80186F80; + qa = (u16 *)D_80186F84; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801B0D58)) + goto found; + return 0; + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (62 ins, relocation-masked) + + +extern u8 D_80186F84; +extern u8 D_80186F80; +extern s16 *D_80186F88; +extern u8 D_80186F8C; +extern int D_801B0D58; +extern u16 D_801B0D68; + +extern int func_80134A74(int, s16, s16, int); + +int func_80135168(u16 arg0, u16 *p1, u16 *p2) +{ + register s16 *pb0 __asm__("$8"); + register s16 *pac __asm__("$6"); + register s16 *pb8 __asm__("$7"); + u16 *pb4; + u16 a, b; + int a1v, a2v, d94; + + pb0 = (*(s16 * *)&D_80186F84); + __asm__ __volatile__("" : : "r"(pb0)); + + a = p2[0]; pac = (*(s16 * *)&D_80186F80); pb0[0] = a; b = p1[0]; pb8 = (*(s16 * *)&D_80186F8C); pac[0] = b; pb8[0] = a - b; + a = p2[1]; pb0[1] = a; b = p1[1]; pac[1] = b; pb8[1] = a - b; + a = p2[2]; pb0[2] = a; b = p1[2]; pac[2] = b; pb8[2] = a - b; + + a1v = pac[0]; a2v = pac[2]; d94 = D_801B0D58; + __asm__ __volatile__("" ::: "memory"); + D_801B0D68 = 0; + if (func_80134A74(arg0, a1v, a2v, d94)) { + pb4 = (*(u16 * *)&D_80186F88); + p2[0] = pb4[0]; + p2[1] = pb4[1]; + p2[2] = pb4[2]; + p2[3] = D_801B0D68; + return 1; + } + return 0; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80135260); + + +/* func_80135480 — cull + coordinate-transform emitter (258 ins, ov_SC01_077 split _a, ×134 family). + * + * NOT a §43 s16-param giant. Params are (void*, s32, s16*, s16*); the sole `sll/sra 16` is the s16 + * RETURN narrowing on $s3 (result), not an in-place arg-reg narrow. So §43's K&R-s16-param map does + * not apply here — no //@EDIT, no ec_edit. func_80135480 has NO ambient prototype/caller anywhere in + * src/include, so the s16 return type is free (no void->s32 flip, no engine_core.h edit). + * + * THE CRACK (residual class = §31 regalloc/schedule, RC-4/RC-2 in gcc-2.7.2-map/regalloc.md): + * the two output buffers D_80186F80 / D_80186F84 are written through a pointer in each of the two + * return tails (mode!=0 and mode==0). A single function-scope `s16 *tmp` reused across both tails is a + * GLOBAL allocno (used in 2 blocks, dies 4x) -> forced onto one hard reg ($a1), which is WRONG and also + * perturbs the switch's first-`beq` delay-slot fill (extra nop). The target instead allocates each + * store-group's pointer as a LOCAL-ALLOC pseudo (set once, used 3x, dies once, single block) that picks + * the lowest-free scratch over its OWN window: + * mode!=0 tail: p_AC -> $v1, p_B0 -> $v1 (reused, $v0 = the load temp) + * mode==0 tail: p_AC -> $v1, p_B0 -> $a0 (the sub-scratch occupies $v1, so $v1 is unavailable) + * Reproduced by giving each of the four store-groups its OWN block-scoped pointer. With the tail + * allocation correct, the whole schedule (incl. the beq delay slot) re-derives to byte-identical. + * No register pins (§17 caveat: don't pin $v1 — the target reuses it for the cull; a pin cascades + * per RC-5). NOTE: the block-scope `s16 *p` intentionally shadows the function-scope `s32 p` (the + * case-0x20000000 pointer base); scopes never overlap — legal and byte-verified. + * + * Zero file-scope footprint (block-scoped typedefs + externs; D_80186F80/B0 read via the ambient + * `extern u8` + `*(s16**)&` §30 anon-cast, matching neighbor func_80135168) -> ×134-clean for + * family_sweep --edit-remap with no cc1 crash. + * + * VERIFIED: tools/rtu_match.py func_80135480 --split ov_SC01_077_a -> MATCH (258 ins), 3x stable. + */ +s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4) +{ + typedef struct { s32 vx, vy, vz, pad; } Vec32; + typedef struct { s16 vx, vy, vz, pad; } Vec16; + typedef struct { s32 w0, w4, w8, wC; s16 h10, hpad; s32 t0, t1, t2; } Mat32; + extern void func_80048EAC(void *m0, void *m1); + extern void func_8004914C(void *m); + extern void ApplyTransposeMatrixLV(void *m, void *in, void *out); + extern void ApplyRotMatrixLV(void *in, void *out); + extern void ApplyRotMatrix(void *in, void *out); + extern s32 D_801B0D6C, D_801B0D70, D_801B0D74, D_801B0D78; + extern s16 D_801B0D7C; + extern s32 D_801B0D8C; + extern s16 D_801B0D90, D_801B0D92, D_801B0D94, D_801B0D96, D_801B0D98, D_801B0D9A; + + Vec32 in0, in1, rotout; + Mat32 mat2; + Vec16 vecin; + s32 result; + s32 mode; + s32 q1, q2; + s32 p; + s32 t18, t1A, t1C; + s32 *m; + + in0.vx = param_3[0] - *(s32 *)((s32)param_1 + 0x48); + in0.vz = param_3[2] - *(s32 *)((s32)param_1 + 0x50); + if ((param_2 & 0x10000000) == 0) { + if (in0.vx * in0.vx + in0.vz * in0.vz > 0x40000) { + return 0; + } + } + mode = param_2 & 0x60000000; + if (mode != 0) { + result = 1; + if (param_2 >= 0) { + mode &= 0x40000000; + } + in0.vy = param_3[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vx = param_4[0] - *(s32 *)((s32)param_1 + 0x48); + in1.vy = param_4[1] - *(s32 *)((s32)param_1 + 0x4C); + in1.vz = param_4[2] - *(s32 *)((s32)param_1 + 0x50); + switch (mode) { + case 0x60000000: + m = &D_801B0D6C; + *m = 0x1000000 / *(s16 *)((s32)param_1 + 0x18); + q1 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1A); + q2 = 0x1000000 / *(s16 *)((s32)param_1 + 0x1C); + D_801B0D70 = 0; + D_801B0D78 = 0; + D_801B0D74 = q1; + D_801B0D7C = q2; + func_80048EAC((void *)((s32)param_1 + 0x34), m); + ApplyTransposeMatrixLV(m, &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + /* fallthrough */ + case 0x20000000: + p = (param_2 & 0xFFFFFFF) | 0x80000000; + t18 = *(s16 *)((s32)param_1 + 0x18); + t1A = *(s16 *)((s32)param_1 + 0x1A); + t1C = *(u16 *)((s32)param_1 + 0x1C); + mat2.w4 = 0; + mat2.wC = 0; + mat2.w0 = t18; + mat2.w8 = t1A; + mat2.h10 = t1C; + func_8004914C(&mat2); + vecin.vx = *(u16 *)(p + 4); + vecin.vy = *(u16 *)(p + 8); + vecin.vz = *(u16 *)(p + 0xC); + ApplyRotMatrix(&vecin, &rotout); + D_801B0D90 = rotout.vx; + D_801B0D94 = rotout.vy; + D_801B0D98 = rotout.vz; + vecin.vx = *(u16 *)(p + 6); + vecin.vy = *(u16 *)(p + 0xA); + vecin.vz = *(u16 *)(p + 0xE); + ApplyRotMatrix(&vecin, &rotout); + D_801B0D8C = 0; + D_801B0D92 = rotout.vx; + D_801B0D96 = rotout.vy; + D_801B0D9A = rotout.vz; + result += 2; + break; + case 0x40000000: + ApplyTransposeMatrixLV((void *)((s32)param_1 + 0x34), &in0, &in0); + ApplyRotMatrixLV(&in1, &in1); + result = 2; + break; + } + { + s16 *p = *(s16 **)&D_80186F80; + p[0] = in0.vx; + p[1] = in0.vy; + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_80186F84; + p[0] = in1.vx; + p[1] = in1.vy; + p[2] = in1.vz; + } + return result; + } + { + s16 *p = *(s16 **)&D_80186F80; + p[0] = in0.vx; + p[1] = ((u16 *)param_3)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = in0.vz; + } + { + s16 *p = *(s16 **)&D_80186F84; + p[0] = ((u16 *)param_4)[0] - *(s32 *)((s32)param_1 + 0x48); + p[1] = ((u16 *)param_4)[1] - *(s32 *)((s32)param_1 + 0x4C); + p[2] = ((u16 *)param_4)[2] - *(s32 *)((s32)param_1 + 0x50); + } + return 1; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80135888); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80135A4C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80135D20); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80135EB0); + + +s32 func_80136334(void *arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + register s32 a1v __asm__("$11"); + register s32 a2v __asm__("$12"); + register s32 n __asm__("$5"); + register s16 *b4 __asm__("$7"); + s32 d; + s32 dx; + s32 denom; + s32 result; + s32 frame_pad[2]; + (void)&frame_pad; + __asm__("" : "=r"(a1v) : "0"(arg1)); + a2v = arg2; + + if (!(arg1 & 1)) { + dx = (s16) arg2 - (*(s16 **)&D_80186F80)[2]; + d = dx; + denom = -(*(s16 **)&D_80186F8C)[2]; + } else { + denom = (*(s16 **)&D_80186F8C)[2]; + d = (*(s16 **)&D_80186F80)[2] - (s16) arg2; + dx = -d; + } + n = -d; + { + register s16 *b8 __asm__("$6") = *(s16 **)&D_80186F8C; + u16 *ac = *(u16 **)&D_80186F80; + b4 = D_80186F88; + b4[0] = ac[0] + n * b8[0] / denom; + b4[1] = ac[1] + n * b8[1] / denom; + b4[2] = ac[2] + dx; + } + + if (b4[0] < M2C_FIELD(arg0, s16 *, 4)) return 0; + if (M2C_FIELD(arg0, s16 *, 6) < b4[0]) return 0; + if (b4[1] < M2C_FIELD(arg0, s16 *, 8)) return 0; + if (M2C_FIELD(arg0, s16 *, 0xA) < b4[1]) return 0; + if (a1v & 0x8000) { + u16 *b0 = *(u16 **)&D_80186F84; + b4[0] = b0[0]; + b4[1] = b0[1]; + } + D_801152AA = 0; + (*(s16 *)D_801152A8) = 0; + if (a1v & 1) { + D_80186F88[2] = a2v + 2; + __asm__ __volatile__(""); + D_801152AC = 0xFFF; + } else { + D_801152AC = -0xFFF; + D_80186F88[2] = a2v - 2; + } + __asm__ __volatile__("" :: "r"(a1v), "r"(a2v)); + (*(s16 *)D_80126720) = (M2C_FIELD(arg0, s16 *, 4) + M2C_FIELD(arg0, s16 *, 6)) >> 1; + D_80126722 = (M2C_FIELD(arg0, s16 *, 8) + M2C_FIELD(arg0, s16 *, 0xA)) >> 1; + result = 1; + D_80126724 = (M2C_FIELD(arg0, s16 *, 0xC) + M2C_FIELD(arg0, s16 *, 0xE)) >> 1; + return result; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_801365B8); + + +// @class: pointer-type — pointer-vs-array reconcile for func_80136824 (ov_SC01_077_a) +// D_80186F80/B0/B8 are file-scope `extern u8`, D_80186F88 is `extern s32 []`; each HOLDS a +// pointer value that the target loads via lw then derefs. Read as pointer via *(T**)&sym. +// D_80186F88 must be a SCALAR pointer (not s32[]) — as an array it decays and gcc CSEs the +// base address into a held reg (lui;addiu;lw 0(reg)) across the 3 reloads; as a scalar +// pointer it folds %lo (lui;lw %lo). Retype all 3 file-TU occurrences (byte-neutral: the +// siblings read it once via *(u16**)&sym == direct lw either way). + +s32 func_80136824(s32 arg0, s32 arg1, s32 arg2) { + extern u8 D_801152A8[]; + extern s16 D_801152AA; + extern s16 D_801152AC; + extern s16 D_80126722; + extern s16 D_80126724; + + register u16 *ac __asm__("$4"); + register s16 *b8 __asm__("$6"); + register s16 *b4 __asm__("$9"); + register s32 r __asm__("$3"); + register s32 pos __asm__("$12"); + register s32 a1v __asm__("$5"); + s16 temp_v0; + s16 temp_v1; + s32 var_a3; + s16 var_v0_3; + s32 temp_a1; + s32 var_t0; + s32 var_v1; + s16 *b4b; + u16 *p; + + __asm__ ("" : "=r"(a1v) : "0"(arg1)); + pos = arg2; + if (!(a1v & 1)) { + var_t0 = (s16) arg2 - (*(s16 **)&D_80186F80)[1]; + var_v1 = var_t0; + var_a3 = -(*(s16 **)&D_80186F8C)[1]; + } else { + var_a3 = (*(s16 **)&D_80186F8C)[1]; + var_v1 = (*(s16 **)&D_80186F80)[1] - (s16) arg2; + var_t0 = -var_v1; + } + b8 = (*(s16 **)&D_80186F8C); + ac = (*(u16 **)&D_80186F80); + b4 = D_80186F88; + temp_a1 = -var_v1; + r = (temp_a1 * b8[0]) / var_a3; + b4[0] = ac[0] + r; + b4[1] = ac[1] + var_t0; + r = (temp_a1 * b8[2]) / var_a3; + temp_v0 = ac[2] + r; + b4[2] = temp_v0; + temp_v1 = b4[0]; + if (temp_v1 < M2C_FIELD(((void *)arg0), s16 *, 4)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 6) < temp_v1) { + return 0; + } + if (temp_v0 < M2C_FIELD(((void *)arg0), s16 *, 0xC)) { + return 0; + } + if (M2C_FIELD(((void *)arg0), s16 *, 0xE) < temp_v0) { + return 0; + } + if (arg1 & 0x8000) { + p = (*(u16 **)&D_80186F84); + b4[0] = (s16) p[0]; + b4[2] = (s16) p[2]; + } + D_801152AC = 0; + (*(s16 *)D_801152A8) = 0; + if (arg1 & 1) { + b4b = D_80186F88; + D_801152AA = 0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos + 2; + } else { + b4b = D_80186F88; + D_801152AA = -0xFFF; + __asm__ __volatile__(""); + var_v0_3 = pos - 2; + } + b4b[1] = var_v0_3; + __asm__ __volatile__("" :: "r"(pos)); + (*(s16 *)D_80126720) = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 4) + M2C_FIELD(((void *)arg0), s16 *, 6)) >> 1); + D_80126722 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 8) + M2C_FIELD(((void *)arg0), s16 *, 0xA)) >> 1); + D_80126724 = (s16) ((s32) (M2C_FIELD(((void *)arg0), s16 *, 0xC) + M2C_FIELD(((void *)arg0), s16 *, 0xE)) >> 1); + return 1; +} + + +// @class: schedule +// @stuck: none — MATCH (76 ins, relocation-masked). Key lever: the D_80126720/22/24 tail is a +// global-short RMW `+=`. Writing it via a cast `*(u16*)&SYM = *(u16*)&SYM + x` makes gcc CSE +// the address into a base reg (base-reuse) for ALL three — but the target only base-reuses +// D_80126720 (a SCHEDULER artifact: its addr-lui fills the load-delay slot after the pb4[4] +// load, and since $v0 is live it lands in $a0, reused for load+store). D_80126722/24 use the +// plain inline 2-lui form. Fix = DIRECT scalar RMW `SYM = SYM + x` (no &/cast) → inline %hi/%lo; +// the scheduler alone forces base-reuse on #1. Also: `s16 D_80126724 = D_80126724 + int` emits +// LHU (gcc-2.7.2 drops the sign-extend because the sum is truncated to 16b on the sh) — so the +// canonical s16 decl is byte-safe here (no u16 retype needed, keeps the sign-sensitive callers). + + +extern s16 *D_80186F88; /* holds a pointer value (*(u16**)&D_80186F88) */ + +s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3) { + extern void ApplyMatrixSV(void *m, void *v0, void *v1); + extern void ApplyRotMatrix(void *v0, void *v1); + extern u16 D_80126722; + extern s16 D_80126724; + extern s16 D_801152AA; + extern s16 D_801152AC; + + s32 out[4]; + u16 *pb4; + + if (a0) { + ApplyMatrixSV((void *)a3, *(void **)&D_80186F88, *(void **)&D_80186F88); + ApplyMatrixSV((void *)a3, (void *)D_80126720, (void *)D_80126720); + ApplyRotMatrix((void *)D_801152A8, (void *)out); + *(s16 *)D_801152A8 = out[0]; + D_801152AA = out[1]; + D_801152AC = out[2]; + } + + pb4 = *(u16 **)&D_80186F88; + *(s16 *)(a2) = pb4[0] + *(s32 *)(a1 + 0x48); + *(s16 *)(a2 + 2) = pb4[1] + *(s32 *)(a1 + 0x4C); + *(s16 *)(a2 + 4) = pb4[2] + *(s32 *)(a1 + 0x50); + + *(u16 *)D_80126720 = *(u16 *)D_80126720 + *(s32 *)(a1 + 0x48); + D_80126722 = D_80126722 + *(s32 *)(a1 + 0x4C); + D_80126724 = D_80126724 + *(s32 *)(a1 + 0x50); +} + + + +DEFINE_func_80136BC4() /* dedup: shared engine-core @0x80136BC4 (src/shared) */ + +DEFINE_func_80136C1C() /* dedup: shared engine-core @0x80136C1C (src/shared) */ + +DEFINE_func_80136C3C() /* dedup: shared engine-core @0x80136C3C (src/shared) */ + +DEFINE_func_80136C44() /* dedup: shared engine-core @0x80136C44 (src/shared) */ + +DEFINE_func_80136C4C() /* dedup: shared engine-core @0x80136C4C (src/shared) */ + + +extern unsigned short D_800B99F0; +extern void (*D_80186F9C[])(void); + +void func_80136C54(void) +{ + D_80186F9C[D_800B99F0](); +} + + +// @class: struct +// @stuck: none — MATCH (28 ins). 10-byte 1-aligned struct copy (S10_80136C90{char s[10]}) from global D_801AFDF8 into a stack buffer, then func_8001534C(0,&buf,0x78,0x10,0,0). gcc emits the block move as 2 unaligned words (lwl/lwr+swl/swr) + 2 bytes (lb/sb). + +typedef struct { char s[10]; } S10_80136C90; + +s32 func_80136C90() +{ + extern void func_8001534C(int, void *, int, int, int, int); + extern S10_80136C90 D_801AFDF8; + + S10_80136C90 buf = D_801AFDF8; + func_8001534C(0, &buf, 0x78, 0x10, 0, 0); +} + + + +DEFINE_func_80136D00() /* dedup: shared engine-core @0x80136D00 (src/shared) */ + +DEFINE_func_80136D08() /* dedup: shared engine-core @0x80136D08 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80136DFC); + +DEFINE_func_80136EC4() /* dedup: shared engine-core @0x80136EC4 (src/shared) */ + +DEFINE_func_80136ECC() /* dedup: shared engine-core @0x80136ECC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80136F3C); + +DEFINE_func_80137030() /* dedup: shared engine-core @0x80137030 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80137178); + +DEFINE_func_801372B0() /* dedup: shared engine-core @0x801372B0 (src/shared) */ + +DEFINE_func_801375EC() /* dedup: shared engine-core @0x801375EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80137614); + +DEFINE_func_8013767C() /* dedup: shared engine-core @0x8013767C (src/shared) */ + +DEFINE_func_801376C8() /* dedup: shared engine-core @0x801376C8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_801376E8); + +DEFINE_func_801377B4() /* dedup: shared engine-core @0x801377B4 (src/shared) */ + +DEFINE_func_80137840() /* dedup: shared engine-core @0x80137840 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_801378F0); + +DEFINE_func_801379D8() /* dedup: shared engine-core @0x801379D8 (src/shared) */ + +DEFINE_func_801379EC() /* dedup: shared engine-core @0x801379EC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_801379FC); + + +// @class: remat +// @stuck: target CSEs &D_801269F0 once for load+call arg; force via local pointer +extern s32 D_80127548[]; +extern int D_80186FF0; +extern int D_801269F0; +extern void func_80138BE0(int p); + +void func_80137B80(void) { + int *p = &D_801269F0; + (*(int *)&D_80127548) = 0x24; + if (*p != 0) { + ((void (*)(int *))func_80138BE0)(p); + } + D_80186FF0 += 1; +} + + +DEFINE_func_80137BD8() /* dedup: shared engine-core @0x80137BD8 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (51 ins). Three globals stored/loaded around 3 calls; &D_801269F0 held in $s1, arg1 in $s0 across calls; return reloads global D_800A5E60. + +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int D_80186FF0; +extern int D_801269F0; + +extern void func_801392FC(); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); + +int func_80137D08(int arg0, int arg1, short arg2) +{ + unsigned char buf[3]; + + D_800A5E60 = arg0; + D_80126A0A = arg2; + ((void (*)(void *, int, int))func_801392FC)(&D_801269F0, D_80126A0E, arg1); + if ((*(short *)&D_801269F4) == 7) { + buf[0] = 0x39; + buf[1] = 0xFF; + buf[2] = 0x71; + ((void (*)(void *, void *, int))func_80137DD4)(&D_801269F0, buf, arg1); + } else if ((*(short *)&D_801269F4) == 3) { + if (D_80186FF0 & 4) { + ((void (*)(void *, int))func_80139680)(&D_801269F0, arg1); + } + } + return D_800A5E60; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_8012ACE0", func_80137DD4); + +DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ diff --git a/src/ov_SC06_010/ov_SC06_010_jr_801380E0.c b/src/ov_SC06_010/ov_SC06_010_jr_801380E0.c new file mode 100644 index 000000000..5520a2cc9 --- /dev/null +++ b/src/ov_SC06_010/ov_SC06_010_jr_801380E0.c @@ -0,0 +1,3320 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AFBA4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186C88[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B0CEC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B2C10; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AFBA4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801869C4)(); +extern s16 (*D_801869C8)(); +extern M2C_UNK (*D_801869D0)(); +extern s32 (*D_801869D4)(); +extern s32 D_801B0CE8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AFBA8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern struct BigCopy D_80126DB8; +extern struct BigCopy D_80114EE8; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186D1C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018A200; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80186D34; +extern M2C_UNK D_80186D3C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80186D44; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186D60[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186D6C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186D80[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186DD0[]; +extern s16 D_80186E00[]; +extern s16 D_80186E60[]; +extern s16 D_80186E68[]; +extern s16 D_80186E88[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80186EC0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80186F18[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80186F60[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186F68[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186F70[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186F78[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80186F20; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80186F40; +extern void func_801321B0(int param_1); +extern int D_80186F50; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B0D58; +extern s32 D_801B0D5C[]; +extern int D_801B0D60; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186F84; +extern u8 D_80186F80; +extern s16 *D_80186F88; +extern u8 D_80186F8C; +extern int D_801B0D58; +extern u16 D_801B0D68; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186F88; /* holds a pointer value (*(u16**)&D_80186F88) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186F9C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186FF0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186FF4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186FF4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80187038; +extern u8 D_8018707C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80187038; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018707C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801870C0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801870FC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801870FC; + if (((s16)a1) < 0xC00) { + tbl = D_801870C0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80187138, D_8018713A, D_8018713C, D_8018713E, D_80187140, D_80187142; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018713A < ang)) goto outer_else; + if (!(ang < D_80187140)) goto inner_else; + if (ang < D_8018713C) { *(s16 *)L = D_8018713C; goto done; } + if (D_8018713E < ang) { *(s16 *)L = D_8018713E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80187138) { *(s16 *)L = D_80187138; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80187142 < ang) { *(s16 *)L = D_80187142; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B0DD0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B0DD0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B0DD0; +extern s8 D_801B0DD4; +extern s8 D_801B0DD5; + +void func_8013C9C4(void * arg0) +{ + D_801B0DD0 = arg0; + D_801B0DD4 = 0; + D_801B0DD5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B0DD0; +extern s8 D_801B0DD4; +extern s8 D_801B0DD5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B0DD0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B0DD5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B0DD4)) * 2) + D_801B0DD0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B0DD5 = (unsigned char) p[1]; + D_801B0DD4 = D_801B0DD4 + 1; + if (D_801B0DD5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B0DD4 = 0; + *base = 0; + } + } + else + { + D_801B0DD5 = c - 1; + } + } + return; +} + + + +extern s32 D_801B0DF4; +extern s32 D_801B0DE8; +extern s32 D_801B0DEC; +extern s32 D_801B0DF8; + +void func_8013CABC(void) { + D_801B0DF4 = 1; + D_801B0DE8 = 1; + D_801B0DEC = 0; + D_801B0DF8 = 1; +} + + + +extern s32 D_801B0DE8; +extern s32 D_801B0DEC; +extern s32 D_801B0DF0; +extern s32 D_801B0DF4; +extern s32 D_801B0DF8; + +void func_8013CAE8(void) { + D_801B0DE8 = 1; + D_801B0DF4 = 0; + D_801B0DEC = 0; + D_801B0DF0 = -1; + D_801B0DF8 = 0; +} + + + +extern s32 D_801B0DF4; +extern s32 D_801B0DF8; +extern s32 D_801B0E20; +extern s32 D_801B0E24; + +void func_8013CB20(void) +{ + D_801B0E20 = D_801B0DF8; + D_801B0E24 = D_801B0DF4; + D_801B0DF8 = 1; + D_801B0DF4 = 0; +} + + + +extern s32 D_801B0E20; +extern s32 D_801B0E24; +extern s32 D_801B0DF8; +extern s32 D_801B0DF4; + +void func_8013CB5C(void) { + D_801B0DF8 = D_801B0E20; + D_801B0DF4 = D_801B0E24; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B2B28; + extern u8 D_801B2B29; + extern u8 D_801B2B2A; + extern u8 D_801B2B2B; + extern u8 D_801B2B2C; + extern u8 D_801B2B2D; + extern u8 D_801B2B2E; + extern u8 D_801B2B2F; + extern u8 D_801B2B30; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B2B28; t1 = D_801B2B29; t2 = D_801B2B2A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B2B2B; t1 = D_801B2B2C; t2 = D_801B2B2D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B2B2E; t1 = D_801B2B2F; t2 = D_801B2B30; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B0E00; +extern s32 D_801B0DE8; +extern s32 D_801B0E04; +extern s32 D_801B0DF4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B0E00 != 0) { + if (D_801B0E00 != 2) { + if (((D_801B0E00 < 3) && (D_801B0E00 == 1)) && + (D_801B0E04 = D_801B0E04 + 1, 0x23a < D_801B0E04)) { + D_801B0DE8 = D_801B0E00; + D_801B0E00 = 2; + } + } else { + D_801B0DE8 = D_801B0DE8 + -1; + if (D_801B0DE8 == 0) { + D_801B0DE8 = D_801B0E00; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B0DF4 == 0) { + D_801B0E00 = D_801B0E00 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B0DF4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B0DF4; +} + + + +extern s32 D_801B0E00; + +void func_8013D164(void) { + D_801B0E00 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B2C0A; +extern u8 D_801B2C7E; +extern u8 D_801B2B32; +extern u8 D_801B2BEC; +extern u8 D_801B2B10; +extern u8 D_801B2B31; +extern s32 D_801B2BF0; + +void func_8013D330(void) { + if ((D_801B2C0A & 0xff) != D_801B2C7E) { + D_801B2C0A = ((D_801B2C0A & 0xff) < D_801B2C7E) ? (D_801B2C0A + 1) : (D_801B2C0A - 1); + } + if ((D_801B2B32 & 0xff) != D_801B2BEC) { + D_801B2B32 = ((D_801B2B32 & 0xff) < D_801B2BEC) ? (D_801B2B32 + 1) : (D_801B2B32 - 1); + } + if ((D_801B2B10 & 0xff) != D_801B2B31) { + D_801B2B10 = ((D_801B2B10 & 0xff) < D_801B2B31) ? (D_801B2B10 + 1) : (D_801B2B10 - 1); + } + D_801B2BF0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B0DD8; +extern void *D_801B0DDC; +extern void *D_801B0DE0; +extern s32 D_801B0E08; +extern s32 D_801B0E0C; +extern s32 D_801B0E10; +extern s32 D_801B2B64[]; + +extern u8 D_80187230[]; +extern u8 D_801872D8[]; +extern u8 D_80187188[]; +extern u8 D_80187284[]; +extern u8 D_80187304[]; +extern u8 D_801871DC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B0E08 = param_2; + D_801B0E0C = (param_2 >> 2) & 3; + D_801B0E10 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B0DD8 = D_80187230; + D_801B0DDC = D_801872D8; + D_801B0DE0 = D_80187188; + } else { + D_801B0DD8 = D_80187284; + D_801B0DDC = D_80187304; + D_801B0DE0 = D_801871DC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B0E10 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B0E08 & 2) != 0) { + D_801B2B64[0] = 0x140; + D_801B2B64[3] = 0x80; + if (p[0x37] == 4) { + D_801B2B64[0] = 0x140; + D_801B2B64[3] = 0; + } + if (p[0x37] == 0) { + D_801B2B64[0] = 0x140; + D_801B2B64[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B0DE0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B0DE0; +extern s16 *D_801B0DE4; +extern s32 D_801B0DF4; +extern s32 D_801B0E14; +extern s32 D_801B0E18; +extern s32 D_801B0E1C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B0DE4 != 0) { + D_801B0DF4 = 0; + p = (int *)(param_1 * 12 + (int)D_801B0DE0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B0E14 != x) { + flag = 1; + if (D_801B0E14 < x) { + if (x - D_801B0E14 < 5) { + D_801B0E14 = x; + } else { + D_801B0E14 = D_801B0E14 + 4; + } + } else { + if (D_801B0E14 - x < 5) { + D_801B0E14 = x; + } else { + D_801B0E14 = D_801B0E14 - 4; + } + } + } + if (D_801B0E18 != y) { + flag = 1; + if (D_801B0E18 < y) { + if (y - D_801B0E18 < 5) { + D_801B0E18 = y; + } else { + D_801B0E18 = D_801B0E18 + 4; + } + } else { + if (D_801B0E18 - y < 5) { + D_801B0E18 = y; + } else { + D_801B0E18 = D_801B0E18 - 4; + } + } + } + if (D_801B0E1C != z) { + flag = 1; + if (D_801B0E1C < z) { + if (z - D_801B0E1C < 5) { + D_801B0E1C = z; + } else { + D_801B0E1C = D_801B0E1C + 4; + } + } else { + if (D_801B0E1C - z < 5) { + D_801B0E1C = z; + } else { + D_801B0E1C = D_801B0E1C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B0DF4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80187394[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B0DE4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B0E14); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B0E18); + uVar5 = (*(int*)&D_801B0E1C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80187394); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B0DFC; + +s32 func_8013E054(void) { + return D_801B0DFC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187D90; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80187D68; +extern s16 D_80187D6A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187D90; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80187D68 = 2; + D_80187D6A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80187D6A = 0; + D_80187D68 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B0E30; + extern void * D_801B0E34; + extern unsigned char D_80187A08; + extern unsigned char D_80187A20; + extern unsigned char D_80187A94; + extern unsigned char D_80187A9C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B0E30 = &D_80187A08; + D_801B0E34 = &D_80187A94; + } else { + D_801B0E30 = &D_80187A20; + D_801B0E34 = &D_80187A9C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187D90/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187D90 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187D90)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187D6C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187D6C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187D6C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80187D68; +extern s16 D_80187D6A; +extern unsigned char D_80187D6C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187D6A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80187D68` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80187D6A; + if (*r < 3) { + *r = *r + 1; + } + D_80187D68 = (u16)D_80187D68 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187D6C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187D6C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187D6C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013FAF8); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8013FFD8); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8014032C); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80140608); + + +// @class: iv-combine +// @stuck: none — MATCH (89 ins). Sequential struct fields fed from a running source +// pointer compile to fixed offsets when written base[0..n]; the target advances +// the pointer, so use post-increment `*p++` for EVERY field (gcc drops the dead +// final increment, yielding the "increment N-2 then offset 0/2" tail). + +extern u8 *D_80187A48; +extern u8 *D_80187A4C; +extern u8 *D_80187A50; +extern u8 *D_80187A54; +extern u8 *D_80187A58; +extern u16 *D_80187A5C[]; +extern u16 *D_80187A64[]; +extern u16 *D_80187A84[]; + +extern s32 func_80028D58(void); +extern s32 func_80028DE0(void); +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); + +void func_801407F4(void) +{ + u8 *puVar1; + s32 iVar2; + u16 *puVar3; + + puVar1 = D_80187A48; + iVar2 = func_80028D58(); + puVar3 = D_80187A5C[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + puVar1 = D_80187A4C; + iVar2 = func_80028DE0(); + puVar3 = D_80187A5C[iVar2]; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + + iVar2 = func_80028FBC(); + *(s16 *)(D_80187A50 + 0x18) = *D_80187A64[iVar2]; + iVar2 = func_80029000(); + *(s16 *)(D_80187A54 + 0x18) = *D_80187A64[iVar2]; + + puVar1 = D_80187A58; + iVar2 = func_80028D9C(); + puVar3 = D_80187A84[iVar2]; + *(s16 *)(puVar1 + 0x12) = *puVar3++; + *(s16 *)(puVar1 + 0x14) = *puVar3++; + *(s16 *)(puVar1 + 0x16) = *puVar3++; + *(s16 *)(puVar1 + 0x18) = *puVar3++; + *(s16 *)(puVar1 + 0x1a) = *puVar3++; + *(s16 *)(puVar1 + 0x1c) = *puVar3++; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80140958); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80140D68); + + +// @class: struct +// @stuck: none — MATCH + +extern unsigned char D_80078E7F; +extern unsigned char D_80078E7E; +extern unsigned char D_80078E7D; +extern M2C_UNK D_80187984; + +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); + +void func_80140E6C(void) { + void *puVar1; + unsigned int uVar2; + unsigned int uVar3; + unsigned int uVar4; + + puVar1 = (*(void * *)&D_80187984); + uVar2 = func_800D2CA8(D_80078E7F, 0x18); + uVar3 = func_800D2CA8(D_80078E7E, 0xc); + uVar4 = func_800D2CA8(D_80078E7D, 0); + func_800D2D10(uVar2 | 0xb00000 | uVar3 | 0xb00 | uVar4, 8, puVar1, 0); +} + + + + +// @class: plumbing +// @stuck: none — MATCH (128/128 ins, match_one confirmed) + +extern short D_80115128; +extern u8 D_80187994; +extern char *D_801879B4; +extern char *D_801879B8; +extern char *D_801879BC; +extern char *D_801879C0; +extern char *D_801879C4; + +extern int func_80029FE4(void); +extern int func_800D2CA8(int, int); +extern void func_800D2D10(int, int, void *, int); +extern char *func_8002AAB4(void); +extern char *strcpy(char *, const char *); +extern int func_8002A26C(void); +extern int func_8002A2B0(void); +extern int func_8002A4B8(void); +extern s32 func_8002A4FC(s32 a0); +extern int func_8002A998(void); +extern int func_8002A9DC(void); +extern int func_8002A728(void); +extern int func_8002A76C(void); +extern int func_80029FD4(void); + +void func_80140F00(void) { + char *p; + int r; + + if (D_80115128 == 0) { + p = (*(char * *)&D_80187994); + r = func_800D2CA8(func_80029FE4() + 1, 0x18); + func_800D2D10(r, 2, p + 4, 1); + strcpy(p + 0xA, func_8002AAB4()); + + p = D_801879B4; + r = func_800D2CA8(func_8002A26C() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A2B0(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_801879B8; + r = func_800D2CA8(func_8002A4B8() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(((int (*)(void))func_8002A4FC)(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_801879BC; + r = func_800D2CA8(func_8002A998() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A9DC(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_801879C0; + r = func_800D2CA8(func_8002A728() + 1, 0x18); + func_800D2D10(r, 2, p + 0x12, 1); + r = func_800D2CA8(func_8002A76C(), 0x18); + func_800D2D10(r, 2, p + 0x22, -1); + + p = D_801879C4; + r = func_800D2CA8(func_80029FD4(), 4); + func_800D2D10(r, 7, p + 0x18, -1); + } +} + + + +// @class: other +// @stuck: none — MATCH + +extern short D_80115128; +extern unsigned short D_80115172; +extern unsigned short D_8018784E; +extern unsigned short D_80187852; +extern unsigned short D_80187856; +extern unsigned short D_8018785A; + +extern s32 func_8002A1B4(void); +extern short func_8002A28C(void); +extern short func_8002A27C(void); +extern s32 func_8002A400(void); +extern short func_8002A4D8(void); +extern short func_8002A4C8(void); +extern s32 func_8002A8E0(void); +extern short func_8002A9B8(void); +extern short func_8002A9A8(void); +extern s32 func_8002A670(void); +extern short func_8002A748(void); +extern short func_8002A738(void); +extern int func_801412A8(int, int, int, int, int, int); + +int func_80141100(int param_1) +{ + short sVar1; + int iVar7; + + if (D_80115128 == 0) { + iVar7 = D_80115172 + 0x31; + sVar1 = D_8018784E; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A1B4)(), func_8002A28C(), func_8002A27C(), (short)iVar7, (int)sVar1); + sVar1 = D_80187852; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A400)(), func_8002A4D8(), func_8002A4C8(), (short)iVar7, (int)sVar1); + sVar1 = D_80187856; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A8E0)(), func_8002A9B8(), func_8002A9A8(), (short)iVar7, (int)sVar1); + sVar1 = D_8018785A; + param_1 = func_801412A8(param_1, ((short (*)(void))func_8002A670)(), func_8002A748(), func_8002A738(), (short)iVar7, (int)sVar1); + } + return param_1; +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_801412A8); + +DEFINE_func_801415C0() /* dedup: shared engine-core @0x801415C0 (src/shared) */ + +DEFINE_func_8014168C() /* dedup: shared engine-core @0x8014168C (src/shared) */ + +DEFINE_func_801416D4() /* dedup: shared engine-core @0x801416D4 (src/shared) */ + + +extern unsigned short D_80115112; +extern void (*D_80187DE4[])(void); + +void func_80141788(void) +{ + D_80187DE4[D_80115112](); +} + + +DEFINE_func_801417C4() /* dedup: shared engine-core @0x801417C4 (src/shared) */ + +DEFINE_func_801417F8() /* dedup: shared engine-core @0x801417F8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80141874); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_801418F8); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80141A60); + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80141B90); + +DEFINE_func_80141C04() /* dedup: shared engine-core @0x80141C04 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (indexed u16 global: (s16)param_1*2 + D_80115110, *2 array stride) + +extern u16 D_80115110; +extern u8 D_80187D44; +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_80141C0C(s32 param_1) +{ + func_8002D4C8(*(u16 *)(&D_80187D44 + (((param_1 << 16) >> 15) + (u32)D_80115110) * 2), 0); +} + + +DEFINE_func_80141C50() /* dedup: shared engine-core @0x80141C50 (src/shared) */ + +DEFINE_func_80141CA4() /* dedup: shared engine-core @0x80141CA4 (src/shared) */ + +DEFINE_func_80142414() /* dedup: shared engine-core @0x80142414 (src/shared) */ + +DEFINE_func_80142454() /* dedup: shared engine-core @0x80142454 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_801424E4); + + +extern void (*D_80187E24[])(void); + +void func_801425CC(void *a0) { + D_80187E24[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: schedule +// @stuck: none — MATCH expected; CAE4 block fallthrough, AD50 block goto-tail + +extern void func_8012C1B8(void); +extern s32 func_8012C1DC(s32 a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012CAE4(void *a0); +extern s32 func_8012AD50(void *a0); +extern s32 D_80187E08; + +void func_80142608(s32 param_1) +{ + register s32 iVar1 __asm__("$16"); + + if (*(short *)(param_1 + 0x70) != 0) { + iVar1 = ((s32 (*)(void))func_8012C1B8)(); + } else { + iVar1 = func_8012C1DC(*(s32 *)(param_1 + 100)); + } + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CA1C(iVar1, (s32)&D_80187E08); + *(short *)(iVar1 + 0x1a) = 0x200; + *(short *)(iVar1 + 0x18) = 0x200; + *(short *)(param_1 + 0xfc) = 0x40; + if (*(short *)(param_1 + 0x70) != 0) { + goto ad50; + } + if (*(s32 *)(param_1 + 100) != 0) { + *(short *)(param_1 + 0xfe) = *(short *)(*(s32 *)(param_1 + 100) + 0x36); + goto ad50; + } + } + ((void (*)(s32))func_8012CAE4)(param_1); + return; +ad50: + *(short *)(param_1 + 0x98) = 0; + *(s32 *)(param_1 + 0x90) = 0; + ((void (*)(s32))func_8012AD50)(param_1); +} + + +DEFINE_func_801426D4() /* dedup: shared engine-core @0x801426D4 (src/shared) */ + +DEFINE_func_80142740() /* dedup: shared engine-core @0x80142740 (src/shared) */ + +DEFINE_func_80142778() /* dedup: shared engine-core @0x80142778 (src/shared) */ + +DEFINE_func_801427DC() /* dedup: shared engine-core @0x801427DC (src/shared) */ + +DEFINE_func_801427E4() /* dedup: shared engine-core @0x801427E4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80187E38[])(); + +void func_801427EC(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80187E38[*(u16 *)(param_1 + 2)](); + } +} + + +DEFINE_func_80142838() /* dedup: shared engine-core @0x80142838 (src/shared) */ + +DEFINE_func_801428CC() /* dedup: shared engine-core @0x801428CC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80187E54[])(); + +void func_8014292C(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80187E54[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_80188024[])(); + +void func_80142978(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_80188024[*(u16 *)(param_1 + 2)](); + } +} + + + +// @class: struct +// @stuck: none — MATCH (array-of-fnptr %lo-fold + signed-halfword guard) + +extern u16 D_801270C0; +extern void (*D_801880DC[])(); + +void func_801429C4(int param_1) +{ + if (*(s16 *)&D_801270C0 != 3) { + D_801880DC[*(u16 *)(param_1 + 2)](); + } +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80142A10); + + +// @class: struct +// @stuck: none — MATCH (packed-word struct -> lwl/lwr unaligned copy; union byte[] -> $sp-direct lbu; branch-polarity invert -> beqz) + +extern u16 D_800B99D8; +extern struct packed_word D_801B0534; +extern u8 D_801B0E38; +extern u8 D_801B0E39; +extern u8 D_801B0E3A; + +void func_80142A80(void) +{ + u16 flags; + union word_bytes local; + s32 mul; + + flags = D_800B99D8; + local.pw = D_801B0534; + + if (flags & 0x10) { + mul = (s8)((flags & 0xf) >> 1) + 9; + } else { + mul = 0x10 - (s8)((flags & 0xf) >> 1); + } + + D_801B0E38 = mul * (local.b[0] >> 4); + D_801B0E39 = mul * (local.b[1] >> 4); + D_801B0E3A = mul * (local.b[2] >> 4); +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80142B2C); + +DEFINE_func_80142BB4() /* dedup: shared engine-core @0x80142BB4 (src/shared) */ + +DEFINE_func_80142C7C() /* dedup: shared engine-core @0x80142C7C (src/shared) */ + +DEFINE_func_80142C84() /* dedup: shared engine-core @0x80142C84 (src/shared) */ + +DEFINE_func_80142C9C() /* dedup: shared engine-core @0x80142C9C (src/shared) */ + +DEFINE_func_80142D38() /* dedup: shared engine-core @0x80142D38 (src/shared) */ + +DEFINE_func_80142DB8() /* dedup: shared engine-core @0x80142DB8 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (combined store-assign `*(p)=v0=call()` keeps test/store on $v0, copy to $s0 for the else) + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern int D_80187E2C; + +void func_80142DC4(int param_1) +{ + int v0; + + *(int *)(param_1 + 0x20) = v0 = ((int (*)(void))func_8012C1B8)(); + if (v0 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, s32))func_8001CA1C)(v0, (s32)&D_80187E2C); + *(short *)(v0 + 0x1a) = 0x1800; + *(short *)(v0 + 0x18) = 0x1800; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80187E48[]; + +void func_80142E38(int param_1) +{ + short sVar1; + int iVar2; + + *(int *)(param_1 + 0x20) = iVar2 = ((int (*)(void))func_8012C1B8)(); + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + ((void (*)(int, void *))func_8001CA1C)(iVar2, &D_80187E48); + sVar1 = (*(unsigned short *)(param_1 + 0x70) & 0xf) * 0x600 + 0x1200; + *(short *)(iVar2 + 0x1a) = sVar1; + *(short *)(iVar2 + 0x18) = sVar1; + *(short *)(param_1 + 0xfc) = 0; + ((void (*)(int))func_80142B2C)(param_1); + } +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80142EC0); + +DEFINE_func_80142F68() /* dedup: shared engine-core @0x80142F68 (src/shared) */ + +DEFINE_func_80142FFC() /* dedup: shared engine-core @0x80142FFC (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (38 ins). $16=param pin; explicit $17 copy of the call result +// survives across func_8001CA1C while $v0 serves the pre-call store/test; +// store BEFORE the s1 copy so the store keeps $v0 (not the saved copy). + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_80142B2C(void *arg0); + +extern unsigned char D_80188034[]; +extern unsigned char D_80188094[]; + +void func_8014305C(int param_1) +{ + register int s0_param __asm__("$16") = param_1; + register int s1_copy __asm__("$17"); + int iVar2; + short sVar1; + + iVar2 = ((int (*)(void))func_8012C1B8)(); + *(int *)(s0_param + 0x20) = iVar2; + s1_copy = iVar2; + if (iVar2 == 0) { + ((void (*)(int))func_8012CAE4)(s0_param); + } else { + ((void (*)(int, void *))func_8001CA1C)(s1_copy, D_80188034); + sVar1 = (*(unsigned short *)(s0_param + 0x70) & 0xf) * 0x600 + 0xc00; + *(short *)(s1_copy + 0x1a) = sVar1; + *(short *)(s1_copy + 0x18) = sVar1; + *(short *)(s0_param + 0xfc) = 0; + func_8012A828(s0_param, D_80188094); + ((void (*)(int))func_80142B2C)(s0_param); + } +} + + +DEFINE_func_801430F4() /* dedup: shared engine-core @0x801430F4 (src/shared) */ + +DEFINE_func_80143188() /* dedup: shared engine-core @0x80143188 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (memcpy unaligned copy; $s0 survivor pinned, store-before-copy keeps $v0 for early store/branch) + + +extern void *memcpy(void *, const void *, u32); + +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern int func_8001CA88(int, void *); +extern s32 func_8012E504(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80142B2C(void *arg0); + +extern u8 D_801B0530; +extern u8 D_801B0E38; +extern u8 D_801B0E3C; + +void func_801431E8(s32 param_1) { + u8 buf[8]; + s32 iVar5; + u16 uVar2; + s16 sVar4; + + register s32 d __asm__("$16"); + memcpy(buf, &D_801B0530, 4); + iVar5 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)(param_1 + 0x20) = iVar5; + d = iVar5; + if (iVar5 == 0) { + ((void (*)(s32))func_8012CAE4)(param_1); + } else { + ((void (*)(s32, void *))func_8001CA88)(d, &D_801B0E38); + uVar2 = *(u16 *)(param_1 + 0x70); + *(s16 *)(d + 0x76) = -0x10; + sVar4 = (uVar2 & 0xf) * 0x600 + 0xc00; + *(s16 *)(d + 0x1a) = sVar4; + *(s16 *)(d + 0x18) = sVar4; + *(u32 *)(d + 4) = *(u32 *)(d + 4) | 0x50000000; + if (func_8012E504(param_1, 0x33) == 0) { + *(s16 *)(param_1 + 0xfc) = 1; + func_800233CC(&D_801B0E38, 0x10); + memcpy(&D_801B0E3C, buf, 4); + } else { + *(s16 *)(param_1 + 0xfc) = 0; + } + ((void (*)(s32))func_80142B2C)(param_1); + } +} + + +DEFINE_func_801432FC() /* dedup: shared engine-core @0x801432FC (src/shared) */ + +DEFINE_func_80143390() /* dedup: shared engine-core @0x80143390 (src/shared) */ + +DEFINE_func_801433F0() /* dedup: shared engine-core @0x801433F0 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (pending gate) + +extern u8 D_800D387C[]; +extern u32 D_801881EC[]; + +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_80143458(s32 param_1) +{ + s32 p; + u16 v; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + p = *(s32 *)(param_1 + 0x20); + if (*(s32 *)(p + 4) == 0) { + *(s32 *)(p + 4) = 0x50000000; + } + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + v = *(u16 *)(param_1 + 0x34) & 0x7fff; + if (v != 0) { + p = *(s32 *)(param_1 + 0x20); + *(u16 *)(p + 0x1a) = v; + *(u16 *)(p + 0x18) = v; + } + + func_80128EA8(*(u32 *)(param_1 + 0x20), param_1 + 0x24, + D_801881EC[*(u16 *)(param_1 + 0x34) & 3]); + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + + +DEFINE_func_8014350C() /* dedup: shared engine-core @0x8014350C (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_8014358C); + +DEFINE_func_80143640() /* dedup: shared engine-core @0x80143640 (src/shared) */ + +DEFINE_func_801437D8() /* dedup: shared engine-core @0x801437D8 (src/shared) */ + +DEFINE_func_80143970() /* dedup: shared engine-core @0x80143970 (src/shared) */ + +DEFINE_func_80143994() /* dedup: shared engine-core @0x80143994 (src/shared) */ + +DEFINE_func_801439C0() /* dedup: shared engine-core @0x801439C0 (src/shared) */ + +DEFINE_func_801439FC() /* dedup: shared engine-core @0x801439FC (src/shared) */ + + +extern void (*D_80188314[])(void); + +void func_80143B30(void *a0) { + D_80188314[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143B6C() /* dedup: shared engine-core @0x80143B6C (src/shared) */ + +DEFINE_func_80143BDC() /* dedup: shared engine-core @0x80143BDC (src/shared) */ + + +extern void (*D_80188320[])(void); + +void func_80143C38(void *a0) { + D_80188320[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143C74() /* dedup: shared engine-core @0x80143C74 (src/shared) */ + + +extern void (*D_80188328[])(void); + +void func_80143C98(void *a0) { + D_80188328[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143CD4() /* dedup: shared engine-core @0x80143CD4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80143D28); + + +extern void (*D_80188370[])(void); + +void func_80143E68(void *a0) { + D_80188370[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80143EA4() /* dedup: shared engine-core @0x80143EA4 (src/shared) */ + +DEFINE_func_80143EAC() /* dedup: shared engine-core @0x80143EAC (src/shared) */ + +DEFINE_func_80143EB4() /* dedup: shared engine-core @0x80143EB4 (src/shared) */ + +DEFINE_func_80143EBC() /* dedup: shared engine-core @0x80143EBC (src/shared) */ + + +extern void (*D_80188384[])(void); + +void func_80144054(void *a0) { + D_80188384[*(u16 *)((s32)a0 + 0x2)](); +} + + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80144090); + +extern void func_8012C218(void *a0); + +// @class: struct +// @stuck: none — MATCH (relocation-masked match_one); fn-ptr dispatch table + 0x1c counter, sibling idiom (func_801427EC/func_80143B30) + +extern void (*D_8018838C[])(); + +void func_801442F8(int param_1) +{ + int iVar1; + + D_8018838C[*(u16 *)(param_1 + 2)](); + iVar1 = *(int *)(param_1 + 0x1c) + 1; + *(int *)(param_1 + 0x1c) = iVar1; + if (0x1d < iVar1) { + func_8012C218(param_1); + } +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern u8 D_80188308; + +void func_80144364(int param_1) { + int iVar3; + u16 uVar2; + s16 sVar1; + + iVar3 = ((s32 (*)(void))func_8012C194)(); + if (iVar3 == 0) { + ((void (*)(int))func_8012CAE4)(param_1); + } else { + uVar2 = *(u16 *)(*(int *)(param_1 + 0x64) + 0x36); + *(int *)(param_1 + 0xCC) = iVar3; + *(u16 *)(param_1 + 0xFC) = uVar2; + func_8001CB6C((u8 *)iVar3, (s32)&D_80188308, 0x250, 0x1A0); + *(s32 *)(iVar3 + 4) = 0x60000000; + *(u8 *)(iVar3 + 0x27) = 0x14; + *(u16 *)(iVar3 + 0x10) = 0x400; + *(u16 *)(iVar3 + 8) = *(u16 *)(*(int *)(param_1 + 0x64) + 6); + *(u16 *)(iVar3 + 0xA) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xA); + *(u16 *)(iVar3 + 0xC) = *(u16 *)(*(int *)(param_1 + 0x64) + 0xE); + sVar1 = *(s16 *)(param_1 + 0x70); + if (sVar1 != 0) { + *(s16 *)(iVar3 + 0x1A) = sVar1; + *(s16 *)(iVar3 + 0x18) = sVar1; + } else { + *(u16 *)(iVar3 + 0x1A) = 0x2000; + *(u16 *)(iVar3 + 0x18) = 0x2000; + } + *(u16 *)(param_1 + 2) = 1; + } +} + + + + +extern void func_80016714(void *a0, s32 a1); +extern s32 func_8004787C(s32 a0); +extern s32 func_80047948(s32 a0); +extern s32 func_80128ED8(void *a0, void *a1); +extern void func_8012AD80(s32 a0); +extern void func_8012C218(void *a0); +extern s32 D_8018831C; + +void func_80144458(void *arg0) { + s32 temp_s0; + void *temp_s2; + void *temp_v0; + + temp_s2 = M2C_FIELD(arg0, void **, 0xCC); + if (M2C_FIELD(arg0, s16 *, 0x70) == 0) { + temp_v0 = M2C_FIELD(M2C_FIELD(arg0, void **, 0x64), void **, 0x20); + if (temp_v0 != NULL) { + temp_s0 = (M2C_FIELD(temp_v0, s16 *, 0x12) - 0x400) & 0xFFF; + M2C_FIELD(arg0, s32 *, 0x10) = (s32) (func_80047948(temp_s0) * D_8018831C * 0x10); + M2C_FIELD(arg0, s32 *, 0x18) = (s32) (func_8004787C(temp_s0) * -D_8018831C * 0x10); + func_8012AD80(arg0); + } + } + M2C_FIELD(temp_s2, u16 *, 8) = (u16) M2C_FIELD(arg0, u16 *, 6); + M2C_FIELD(temp_s2, u16 *, 0xA) = (u16) M2C_FIELD(arg0, u16 *, 0xA); + M2C_FIELD(temp_s2, u16 *, 0xC) = (u16) M2C_FIELD(arg0, u16 *, 0xE); + if (func_80128ED8(temp_s2, arg0 + 0xD0) != 0) { + func_80016714(temp_s2, 0x38); + func_8012C218(arg0); + } +} + + +DEFINE_func_80144558() /* dedup: shared engine-core @0x80144558 (src/shared) */ + +DEFINE_func_8014462C() /* dedup: shared engine-core @0x8014462C (src/shared) */ + +DEFINE_func_801446A4() /* dedup: shared engine-core @0x801446A4 (src/shared) */ + + + +// @class: struct +// @stuck: none — MATCH (65 ins, match_one). Levers: uVar2/$2 + addr/$3 pins; split (uVar2&0xFFFFFFF) into addr then (addr|0x80000000)+8 deref; %hi/%lo of 0x80000008 via plain 0x80000000+8 (match_one masks the target's D_80000008 reloc, real bytes identical); v1/3 magic-divide; gv+fv reassoc (field-0x30 in own temp) loads field first +extern void func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CA1C(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_80188330; +extern u8 D_8018833C; + +void func_8014477C(void *param_1) { + s32 v0; + s32 v1; + register s32 uVar2 __asm__("$2"); + register s32 addr __asm__("$3"); + s32 gv; + s32 fv; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)param_1 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4(param_1); + return; + } + ((void (*)(s32, void *))func_8001CA1C)(v0, &D_80188330); + if (*(u16 *)(*(s32 *)((s32)param_1 + 0x64)) != 0) { + *(s16 *)((s32)param_1 + 0xFC) = *(u16 *)(*(s32 *)((s32)param_1 + 0x64) + 0x36); + uVar2 = *(s32 *)(*(s32 *)((s32)param_1 + 0x64) + 0x58); + if (uVar2 != 0) { + addr = uVar2 & 0xFFFFFFF; + gv = *(u16 *)((addr | 0x80000000) + 8); + fv = *(u16 *)((s32)param_1 + 0xA) - 0x30; + *(u16 *)((s32)param_1 + 0xA) = gv + fv; + } else { + *(u16 *)((s32)param_1 + 0xA) = *(u16 *)((s32)param_1 + 0xA) - 0x60; + } + } + ((void (*)(void *, void *))func_8012A828)(param_1, &D_8018833C); + v1 = (s32)*(s16 *)((s32)param_1 + 0x70) << 0xC; + *(s16 *)((s32)param_1 + 0x2) = 1; + *(s16 *)(*(s32 *)((s32)param_1 + 0x20) + 0x12) = v1 / 3; + *(s32 *)((s32)param_1 + 0x1C) = 0x78; +} + + + +extern void func_8012C194(void); +extern void func_8012CAE4(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); + +extern u8 D_80188308; +extern u8 D_80188378; + +void func_80144880(s32 param_1) +{ + register s32 obj __asm__("$16"); /* $s0 */ + register s32 self __asm__("$17") = param_1; /* $s1 */ + register s32 b __asm__("$2"); /* $v0 */ + s32 e; + + obj = ((s32 (*)(void))func_8012C194)(); + if (obj == 0) { + ((void (*)(s32))func_8012CAE4)(self); + } else { + *(u16 *)(self + 0xFC) = *(u16 *)(*(s32 *)(self + 0x64) + 0x36); + *(s32 *)(self + 0xCC) = obj; + if (*(s16 *)(self + 0x70) == 1) { + func_8001CB6C((u8 *)obj, (s32)&D_80188308, 0x250, 0x1A0); + b = 0x14; + } else { + func_8001CB6C((u8 *)obj, (s32)&D_80188378, 0x300, 0x1D0); + b = 0x6A; + } + *(u8 *)(obj + 0x27) = (u8)b; + *(s32 *)(obj + 4) = 0x60000000; + *(u16 *)(obj + 0x10) = 0x400; + *(u16 *)(obj + 8) = *(u16 *)(*(s32 *)(self + 0x64) + 6); + *(u16 *)(obj + 0xA) = *(u16 *)(*(s32 *)(self + 0x64) + 0xA); + e = *(u16 *)(*(s32 *)(self + 0x64) + 0xE); + *(u16 *)(obj + 0x1A) = 0x4000; + *(u16 *)(obj + 0x18) = 0x4000; + *(u16 *)(obj + 0xC) = (u16)e; + *(s16 *)(self + 2) = *(s16 *)(self + 2) + 1; + } +} + + +DEFINE_func_80144988() /* dedup: shared engine-core @0x80144988 (src/shared) */ + + +extern void (*D_80188394[])(void); + +void func_801449C8(void *a0) { + D_80188394[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A04() /* dedup: shared engine-core @0x80144A04 (src/shared) */ + + +extern void (*D_8018839C[])(void); + +void func_80144A2C(void *a0) { + D_8018839C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80144A68() /* dedup: shared engine-core @0x80144A68 (src/shared) */ + +DEFINE_func_80144A90() /* dedup: shared engine-core @0x80144A90 (src/shared) */ + +DEFINE_func_80144A98() /* dedup: shared engine-core @0x80144A98 (src/shared) */ + +DEFINE_func_80144AEC() /* dedup: shared engine-core @0x80144AEC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_010/nonmatchings/ov_SC06_010_jr_801380E0", func_80144B14); + diff --git a/src/ov_SC06_011/ov_SC06_011_jr_8012ACE0.c b/src/ov_SC06_011/ov_SC06_011_jr_8012ACE0.c index 37b3c6444..4f310a154 100644 --- a/src/ov_SC06_011/ov_SC06_011_jr_8012ACE0.c +++ b/src/ov_SC06_011/ov_SC06_011_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80180A54[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80180A54[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180A98; -extern u8 D_80180ADC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180A98; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80180ADC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80180B20[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80180B5C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80180B5C; - if (((s16)a1) < 0xC00) { - tbl = D_80180B20; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180B98, D_80180B9A, D_80180B9C, D_80180B9E, D_80180BA0, D_80180BA2; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80180B9A < ang)) goto outer_else; - if (!(ang < D_80180BA0)) goto inner_else; - if (ang < D_80180B9C) { *(s16 *)L = D_80180B9C; goto done; } - if (D_80180B9E < ang) { *(s16 *)L = D_80180B9E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180B98) { *(s16 *)L = D_80180B98; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80180BA2 < ang) { *(s16 *)L = D_80180BA2; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801AA980; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801AA980, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801AA980; -extern s8 D_801AA984; -extern s8 D_801AA985; - -void func_8013C9C4(void * arg0) -{ - D_801AA980 = arg0; - D_801AA984 = 0; - D_801AA985 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801AA980; -extern s8 D_801AA984; -extern s8 D_801AA985; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801AA980; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801AA985; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801AA984)) * 2) + D_801AA980); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801AA985 = (unsigned char) p[1]; - D_801AA984 = D_801AA984 + 1; - if (D_801AA985 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801AA984 = 0; - *base = 0; - } - } - else - { - D_801AA985 = c - 1; - } - } - return; -} - - - -extern s32 D_801AA9A4; -extern s32 D_801AA998; -extern s32 D_801AA99C; -extern s32 D_801AA9A8; - -void func_8013CABC(void) { - D_801AA9A4 = 1; - D_801AA998 = 1; - D_801AA99C = 0; - D_801AA9A8 = 1; -} - - - -extern s32 D_801AA998; -extern s32 D_801AA99C; -extern s32 D_801AA9A0; -extern s32 D_801AA9A4; -extern s32 D_801AA9A8; - -void func_8013CAE8(void) { - D_801AA998 = 1; - D_801AA9A4 = 0; - D_801AA99C = 0; - D_801AA9A0 = -1; - D_801AA9A8 = 0; -} - - - -extern s32 D_801AA9A4; -extern s32 D_801AA9A8; -extern s32 D_801AA9D0; -extern s32 D_801AA9D4; - -void func_8013CB20(void) -{ - D_801AA9D0 = D_801AA9A8; - D_801AA9D4 = D_801AA9A4; - D_801AA9A8 = 1; - D_801AA9A4 = 0; -} - - - -extern s32 D_801AA9D0; -extern s32 D_801AA9D4; -extern s32 D_801AA9A8; -extern s32 D_801AA9A4; - -void func_8013CB5C(void) { - D_801AA9A8 = D_801AA9D0; - D_801AA9A4 = D_801AA9D4; -} - - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801ABC00; - extern u8 D_801ABC01; - extern u8 D_801ABC02; - extern u8 D_801ABC03; - extern u8 D_801ABC04; - extern u8 D_801ABC05; - extern u8 D_801ABC06; - extern u8 D_801ABC07; - extern u8 D_801ABC08; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801ABC00; t1 = D_801ABC01; t2 = D_801ABC02; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801ABC03; t1 = D_801ABC04; t2 = D_801ABC05; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801ABC06; t1 = D_801ABC07; t2 = D_801ABC08; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801AA9B0; -extern s32 D_801AA998; -extern s32 D_801AA9B4; -extern s32 D_801AA9A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801AA9B0 != 0) { - if (D_801AA9B0 != 2) { - if (((D_801AA9B0 < 3) && (D_801AA9B0 == 1)) && - (D_801AA9B4 = D_801AA9B4 + 1, 0x23a < D_801AA9B4)) { - D_801AA998 = D_801AA9B0; - D_801AA9B0 = 2; - } - } else { - D_801AA998 = D_801AA998 + -1; - if (D_801AA998 == 0) { - D_801AA998 = D_801AA9B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801AA9A4 == 0) { - D_801AA9B0 = D_801AA9B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801AA9A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801AA9A4; -} - - - -extern s32 D_801AA9B0; - -void func_8013D164(void) { - D_801AA9B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801ABCE2; -extern u8 D_801ABD56; -extern u8 D_801ABC0A; -extern u8 D_801ABCC4; -extern u8 D_801ABBE0; -extern u8 D_801ABC09; -extern s32 D_801ABCC8; - -void func_8013D330(void) { - if ((D_801ABCE2 & 0xff) != D_801ABD56) { - D_801ABCE2 = ((D_801ABCE2 & 0xff) < D_801ABD56) ? (D_801ABCE2 + 1) : (D_801ABCE2 - 1); - } - if ((D_801ABC0A & 0xff) != D_801ABCC4) { - D_801ABC0A = ((D_801ABC0A & 0xff) < D_801ABCC4) ? (D_801ABC0A + 1) : (D_801ABC0A - 1); - } - if ((D_801ABBE0 & 0xff) != D_801ABC09) { - D_801ABBE0 = ((D_801ABBE0 & 0xff) < D_801ABC09) ? (D_801ABBE0 + 1) : (D_801ABBE0 - 1); - } - D_801ABCC8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801AA988; -extern void *D_801AA98C; -extern void *D_801AA990; -extern s32 D_801AA9B8; -extern s32 D_801AA9BC; -extern s32 D_801AA9C0; -extern s32 D_801ABC3C[]; - -extern u8 D_80180C90[]; -extern u8 D_80180D38[]; -extern u8 D_80180BE8[]; -extern u8 D_80180CE4[]; -extern u8 D_80180D64[]; -extern u8 D_80180C3C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801AA9B8 = param_2; - D_801AA9BC = (param_2 >> 2) & 3; - D_801AA9C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801AA988 = D_80180C90; - D_801AA98C = D_80180D38; - D_801AA990 = D_80180BE8; - } else { - D_801AA988 = D_80180CE4; - D_801AA98C = D_80180D64; - D_801AA990 = D_80180C3C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801AA9C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801AA9B8 & 2) != 0) { - D_801ABC3C[0] = 0x140; - D_801ABC3C[3] = 0x80; - if (p[0x37] == 4) { - D_801ABC3C[0] = 0x140; - D_801ABC3C[3] = 0; - } - if (p[0x37] == 0) { - D_801ABC3C[0] = 0x140; - D_801ABC3C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801AA990)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801AA990; -extern s16 *D_801AA994; -extern s32 D_801AA9A4; -extern s32 D_801AA9C4; -extern s32 D_801AA9C8; -extern s32 D_801AA9CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801AA994 != 0) { - D_801AA9A4 = 0; - p = (int *)(param_1 * 12 + (int)D_801AA990); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801AA9C4 != x) { - flag = 1; - if (D_801AA9C4 < x) { - if (x - D_801AA9C4 < 5) { - D_801AA9C4 = x; - } else { - D_801AA9C4 = D_801AA9C4 + 4; - } - } else { - if (D_801AA9C4 - x < 5) { - D_801AA9C4 = x; - } else { - D_801AA9C4 = D_801AA9C4 - 4; - } - } - } - if (D_801AA9C8 != y) { - flag = 1; - if (D_801AA9C8 < y) { - if (y - D_801AA9C8 < 5) { - D_801AA9C8 = y; - } else { - D_801AA9C8 = D_801AA9C8 + 4; - } - } else { - if (D_801AA9C8 - y < 5) { - D_801AA9C8 = y; - } else { - D_801AA9C8 = D_801AA9C8 - 4; - } - } - } - if (D_801AA9CC != z) { - flag = 1; - if (D_801AA9CC < z) { - if (z - D_801AA9CC < 5) { - D_801AA9CC = z; - } else { - D_801AA9CC = D_801AA9CC + 4; - } - } else { - if (D_801AA9CC - z < 5) { - D_801AA9CC = z; - } else { - D_801AA9CC = D_801AA9CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801AA9A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80180DF4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801AA994); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AA9C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AA9C8); - uVar5 = (*(int*)&D_801AA9CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80180DF4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801AA9AC; - -s32 func_8013E054(void) { - return D_801AA9AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801817F0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801817C8; -extern s16 D_801817CA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801817F0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801817C8 = 2; - D_801817CA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801817CA = 0; - D_801817C8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801AA9E0; - extern void * D_801AA9E4; - extern unsigned char D_80181468; - extern unsigned char D_80181480; - extern unsigned char D_801814F4; - extern unsigned char D_801814FC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801AA9E0 = &D_80181468; - D_801AA9E4 = &D_801814F4; - } else { - D_801AA9E0 = &D_80181480; - D_801AA9E4 = &D_801814FC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801817F0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801817F0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801817F0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801817CC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801817CC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801817CC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801817C8; -extern s16 D_801817CA; -extern unsigned char D_801817CC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801817CA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801817C8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801817CA; - if (*r < 3) { - *r = *r + 1; - } - D_801817C8 = (u16)D_801817C8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801817CC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801817CC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801817CC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c b/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c new file mode 100644 index 000000000..9557062c5 --- /dev/null +++ b/src/ov_SC06_011/ov_SC06_011_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A9704; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801806E8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801AA89C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801ABCE8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A9704; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80180424)(); +extern s16 (*D_80180428)(); +extern M2C_UNK (*D_80180430)(); +extern s32 (*D_80180434)(); +extern s32 D_801AA898; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A9708; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018077C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80183C60; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80180794; +extern M2C_UNK D_8018079C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801807A4; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801807C0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801807CC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801807E0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180830[]; +extern s16 D_80180860[]; +extern s16 D_801808C0[]; +extern s16 D_801808C8[]; +extern s16 D_801808E8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80180920[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180978[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801809C0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801809C8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801809D0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801809D8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180980; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801809A0; +extern void func_801321B0(int param_1); +extern int D_801809B0; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801AA908; +extern s32 D_801AA90C[]; +extern int D_801AA910; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801809E4; +extern u8 D_801809E0; +extern s16 *D_801809E8; +extern u8 D_801809EC; +extern int D_801AA908; +extern u16 D_801AA918; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801809E8; /* holds a pointer value (*(u16**)&D_801809E8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801809FC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80180A50; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80180A54[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80180A54[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180A98; +extern u8 D_80180ADC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180A98; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80180ADC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80180B20[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80180B5C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80180B5C; + if (((s16)a1) < 0xC00) { + tbl = D_80180B20; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180B98, D_80180B9A, D_80180B9C, D_80180B9E, D_80180BA0, D_80180BA2; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80180B9A < ang)) goto outer_else; + if (!(ang < D_80180BA0)) goto inner_else; + if (ang < D_80180B9C) { *(s16 *)L = D_80180B9C; goto done; } + if (D_80180B9E < ang) { *(s16 *)L = D_80180B9E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180B98) { *(s16 *)L = D_80180B98; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180BA2 < ang) { *(s16 *)L = D_80180BA2; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801AA980; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801AA980, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801AA980; +extern s8 D_801AA984; +extern s8 D_801AA985; + +void func_8013C9C4(void * arg0) +{ + D_801AA980 = arg0; + D_801AA984 = 0; + D_801AA985 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801AA980; +extern s8 D_801AA984; +extern s8 D_801AA985; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801AA980; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801AA985; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801AA984)) * 2) + D_801AA980); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801AA985 = (unsigned char) p[1]; + D_801AA984 = D_801AA984 + 1; + if (D_801AA985 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801AA984 = 0; + *base = 0; + } + } + else + { + D_801AA985 = c - 1; + } + } + return; +} + + + +extern s32 D_801AA9A4; +extern s32 D_801AA998; +extern s32 D_801AA99C; +extern s32 D_801AA9A8; + +void func_8013CABC(void) { + D_801AA9A4 = 1; + D_801AA998 = 1; + D_801AA99C = 0; + D_801AA9A8 = 1; +} + + + +extern s32 D_801AA998; +extern s32 D_801AA99C; +extern s32 D_801AA9A0; +extern s32 D_801AA9A4; +extern s32 D_801AA9A8; + +void func_8013CAE8(void) { + D_801AA998 = 1; + D_801AA9A4 = 0; + D_801AA99C = 0; + D_801AA9A0 = -1; + D_801AA9A8 = 0; +} + + + +extern s32 D_801AA9A4; +extern s32 D_801AA9A8; +extern s32 D_801AA9D0; +extern s32 D_801AA9D4; + +void func_8013CB20(void) +{ + D_801AA9D0 = D_801AA9A8; + D_801AA9D4 = D_801AA9A4; + D_801AA9A8 = 1; + D_801AA9A4 = 0; +} + + + +extern s32 D_801AA9D0; +extern s32 D_801AA9D4; +extern s32 D_801AA9A8; +extern s32 D_801AA9A4; + +void func_8013CB5C(void) { + D_801AA9A8 = D_801AA9D0; + D_801AA9A4 = D_801AA9D4; +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801ABC00; + extern u8 D_801ABC01; + extern u8 D_801ABC02; + extern u8 D_801ABC03; + extern u8 D_801ABC04; + extern u8 D_801ABC05; + extern u8 D_801ABC06; + extern u8 D_801ABC07; + extern u8 D_801ABC08; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801ABC00; t1 = D_801ABC01; t2 = D_801ABC02; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801ABC03; t1 = D_801ABC04; t2 = D_801ABC05; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801ABC06; t1 = D_801ABC07; t2 = D_801ABC08; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801AA9B0; +extern s32 D_801AA998; +extern s32 D_801AA9B4; +extern s32 D_801AA9A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801AA9B0 != 0) { + if (D_801AA9B0 != 2) { + if (((D_801AA9B0 < 3) && (D_801AA9B0 == 1)) && + (D_801AA9B4 = D_801AA9B4 + 1, 0x23a < D_801AA9B4)) { + D_801AA998 = D_801AA9B0; + D_801AA9B0 = 2; + } + } else { + D_801AA998 = D_801AA998 + -1; + if (D_801AA998 == 0) { + D_801AA998 = D_801AA9B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801AA9A4 == 0) { + D_801AA9B0 = D_801AA9B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801AA9A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801AA9A4; +} + + + +extern s32 D_801AA9B0; + +void func_8013D164(void) { + D_801AA9B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801ABCE2; +extern u8 D_801ABD56; +extern u8 D_801ABC0A; +extern u8 D_801ABCC4; +extern u8 D_801ABBE0; +extern u8 D_801ABC09; +extern s32 D_801ABCC8; + +void func_8013D330(void) { + if ((D_801ABCE2 & 0xff) != D_801ABD56) { + D_801ABCE2 = ((D_801ABCE2 & 0xff) < D_801ABD56) ? (D_801ABCE2 + 1) : (D_801ABCE2 - 1); + } + if ((D_801ABC0A & 0xff) != D_801ABCC4) { + D_801ABC0A = ((D_801ABC0A & 0xff) < D_801ABCC4) ? (D_801ABC0A + 1) : (D_801ABC0A - 1); + } + if ((D_801ABBE0 & 0xff) != D_801ABC09) { + D_801ABBE0 = ((D_801ABBE0 & 0xff) < D_801ABC09) ? (D_801ABBE0 + 1) : (D_801ABBE0 - 1); + } + D_801ABCC8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801AA988; +extern void *D_801AA98C; +extern void *D_801AA990; +extern s32 D_801AA9B8; +extern s32 D_801AA9BC; +extern s32 D_801AA9C0; +extern s32 D_801ABC3C[]; + +extern u8 D_80180C90[]; +extern u8 D_80180D38[]; +extern u8 D_80180BE8[]; +extern u8 D_80180CE4[]; +extern u8 D_80180D64[]; +extern u8 D_80180C3C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801AA9B8 = param_2; + D_801AA9BC = (param_2 >> 2) & 3; + D_801AA9C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801AA988 = D_80180C90; + D_801AA98C = D_80180D38; + D_801AA990 = D_80180BE8; + } else { + D_801AA988 = D_80180CE4; + D_801AA98C = D_80180D64; + D_801AA990 = D_80180C3C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801AA9C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801AA9B8 & 2) != 0) { + D_801ABC3C[0] = 0x140; + D_801ABC3C[3] = 0x80; + if (p[0x37] == 4) { + D_801ABC3C[0] = 0x140; + D_801ABC3C[3] = 0; + } + if (p[0x37] == 0) { + D_801ABC3C[0] = 0x140; + D_801ABC3C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801AA990)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801AA990; +extern s16 *D_801AA994; +extern s32 D_801AA9A4; +extern s32 D_801AA9C4; +extern s32 D_801AA9C8; +extern s32 D_801AA9CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801AA994 != 0) { + D_801AA9A4 = 0; + p = (int *)(param_1 * 12 + (int)D_801AA990); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801AA9C4 != x) { + flag = 1; + if (D_801AA9C4 < x) { + if (x - D_801AA9C4 < 5) { + D_801AA9C4 = x; + } else { + D_801AA9C4 = D_801AA9C4 + 4; + } + } else { + if (D_801AA9C4 - x < 5) { + D_801AA9C4 = x; + } else { + D_801AA9C4 = D_801AA9C4 - 4; + } + } + } + if (D_801AA9C8 != y) { + flag = 1; + if (D_801AA9C8 < y) { + if (y - D_801AA9C8 < 5) { + D_801AA9C8 = y; + } else { + D_801AA9C8 = D_801AA9C8 + 4; + } + } else { + if (D_801AA9C8 - y < 5) { + D_801AA9C8 = y; + } else { + D_801AA9C8 = D_801AA9C8 - 4; + } + } + } + if (D_801AA9CC != z) { + flag = 1; + if (D_801AA9CC < z) { + if (z - D_801AA9CC < 5) { + D_801AA9CC = z; + } else { + D_801AA9CC = D_801AA9CC + 4; + } + } else { + if (D_801AA9CC - z < 5) { + D_801AA9CC = z; + } else { + D_801AA9CC = D_801AA9CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801AA9A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80180DF4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801AA994); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801AA9C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801AA9C8); + uVar5 = (*(int*)&D_801AA9CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80180DF4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801AA9AC; + +s32 func_8013E054(void) { + return D_801AA9AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801817F0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801817C8; +extern s16 D_801817CA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801817F0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801817C8 = 2; + D_801817CA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801817CA = 0; + D_801817C8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801AA9E0; + extern void * D_801AA9E4; + extern unsigned char D_80181468; + extern unsigned char D_80181480; + extern unsigned char D_801814F4; + extern unsigned char D_801814FC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801AA9E0 = &D_80181468; + D_801AA9E4 = &D_801814F4; + } else { + D_801AA9E0 = &D_80181480; + D_801AA9E4 = &D_801814FC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801817F0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801817F0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801817F0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801817CC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801817CC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801817CC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801817C8; +extern s16 D_801817CA; +extern unsigned char D_801817CC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801817CA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801817C8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801817CA; + if (*r < 3) { + *r = *r + 1; + } + D_801817C8 = (u16)D_801817C8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801817CC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801817CC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801817CC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_011/nonmatchings/ov_SC06_011_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_013/ov_SC06_013_jr_8012ACE0.c b/src/ov_SC06_013/ov_SC06_013_jr_8012ACE0.c index 28d7fa1a6..27163dffe 100644 --- a/src/ov_SC06_013/ov_SC06_013_jr_8012ACE0.c +++ b/src/ov_SC06_013/ov_SC06_013_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F1D0[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F1D0[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F214; -extern u8 D_8017F258; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F214; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F258 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F29C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F2D8[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F2D8; - if (((s16)a1) < 0xC00) { - tbl = D_8017F29C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F314, D_8017F316, D_8017F318, D_8017F31A, D_8017F31C, D_8017F31E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F316 < ang)) goto outer_else; - if (!(ang < D_8017F31C)) goto inner_else; - if (ang < D_8017F318) { *(s16 *)L = D_8017F318; goto done; } - if (D_8017F31A < ang) { *(s16 *)L = D_8017F31A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F314) { *(s16 *)L = D_8017F314; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F31E < ang) { *(s16 *)L = D_8017F31E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80199838; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80199838, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80199838; -extern s8 D_8019983C; -extern s8 D_8019983D; - -void func_8013C9C4(void * arg0) -{ - D_80199838 = arg0; - D_8019983C = 0; - D_8019983D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80199838; -extern s8 D_8019983C; -extern s8 D_8019983D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80199838; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019983D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019983C)) * 2) + D_80199838); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019983D = (unsigned char) p[1]; - D_8019983C = D_8019983C + 1; - if (D_8019983D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019983C = 0; - *base = 0; - } - } - else - { - D_8019983D = c - 1; - } - } - return; -} - - - -extern s32 D_8019985C; -extern s32 D_80199850; -extern s32 D_80199854; -extern s32 D_80199860; - -void func_8013CABC(void) { - D_8019985C = 1; - D_80199850 = 1; - D_80199854 = 0; - D_80199860 = 1; -} - - - -extern s32 D_80199850; -extern s32 D_80199854; -extern s32 D_80199858; -extern s32 D_8019985C; -extern s32 D_80199860; - -void func_8013CAE8(void) { - D_80199850 = 1; - D_8019985C = 0; - D_80199854 = 0; - D_80199858 = -1; - D_80199860 = 0; -} - - - -extern s32 D_8019985C; -extern s32 D_80199860; -extern s32 D_80199888; -extern s32 D_8019988C; - -void func_8013CB20(void) -{ - D_80199888 = D_80199860; - D_8019988C = D_8019985C; - D_80199860 = 1; - D_8019985C = 0; -} - - - -extern s32 D_80199888; -extern s32 D_8019988C; -extern s32 D_80199860; -extern s32 D_8019985C; - -void func_8013CB5C(void) { - D_80199860 = D_80199888; - D_8019985C = D_8019988C; -} - - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019AAB0; - extern u8 D_8019AAB1; - extern u8 D_8019AAB2; - extern u8 D_8019AAB3; - extern u8 D_8019AAB4; - extern u8 D_8019AAB5; - extern u8 D_8019AAB6; - extern u8 D_8019AAB7; - extern u8 D_8019AAB8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019AAB0; t1 = D_8019AAB1; t2 = D_8019AAB2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019AAB3; t1 = D_8019AAB4; t2 = D_8019AAB5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019AAB6; t1 = D_8019AAB7; t2 = D_8019AAB8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80199868; -extern s32 D_80199850; -extern s32 D_8019986C; -extern s32 D_8019985C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80199868 != 0) { - if (D_80199868 != 2) { - if (((D_80199868 < 3) && (D_80199868 == 1)) && - (D_8019986C = D_8019986C + 1, 0x23a < D_8019986C)) { - D_80199850 = D_80199868; - D_80199868 = 2; - } - } else { - D_80199850 = D_80199850 + -1; - if (D_80199850 == 0) { - D_80199850 = D_80199868; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019985C == 0) { - D_80199868 = D_80199868 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019985C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019985C; -} - - - -extern s32 D_80199868; - -void func_8013D164(void) { - D_80199868 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019AB92; -extern u8 D_8019AC06; -extern u8 D_8019AABA; -extern u8 D_8019AB74; -extern u8 D_8019AA98; -extern u8 D_8019AAB9; -extern s32 D_8019AB78; - -void func_8013D330(void) { - if ((D_8019AB92 & 0xff) != D_8019AC06) { - D_8019AB92 = ((D_8019AB92 & 0xff) < D_8019AC06) ? (D_8019AB92 + 1) : (D_8019AB92 - 1); - } - if ((D_8019AABA & 0xff) != D_8019AB74) { - D_8019AABA = ((D_8019AABA & 0xff) < D_8019AB74) ? (D_8019AABA + 1) : (D_8019AABA - 1); - } - if ((D_8019AA98 & 0xff) != D_8019AAB9) { - D_8019AA98 = ((D_8019AA98 & 0xff) < D_8019AAB9) ? (D_8019AA98 + 1) : (D_8019AA98 - 1); - } - D_8019AB78 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80199840; -extern void *D_80199844; -extern void *D_80199848; -extern s32 D_80199870; -extern s32 D_80199874; -extern s32 D_80199878; -extern s32 D_8019AAEC[]; - -extern u8 D_8017F40C[]; -extern u8 D_8017F4B4[]; -extern u8 D_8017F364[]; -extern u8 D_8017F460[]; -extern u8 D_8017F4E0[]; -extern u8 D_8017F3B8[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80199870 = param_2; - D_80199874 = (param_2 >> 2) & 3; - D_80199878 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80199840 = D_8017F40C; - D_80199844 = D_8017F4B4; - D_80199848 = D_8017F364; - } else { - D_80199840 = D_8017F460; - D_80199844 = D_8017F4E0; - D_80199848 = D_8017F3B8; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80199878 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80199870 & 2) != 0) { - D_8019AAEC[0] = 0x140; - D_8019AAEC[3] = 0x80; - if (p[0x37] == 4) { - D_8019AAEC[0] = 0x140; - D_8019AAEC[3] = 0; - } - if (p[0x37] == 0) { - D_8019AAEC[0] = 0x140; - D_8019AAEC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80199848)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80199848; -extern s16 *D_8019984C; -extern s32 D_8019985C; -extern s32 D_8019987C; -extern s32 D_80199880; -extern s32 D_80199884; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019984C != 0) { - D_8019985C = 0; - p = (int *)(param_1 * 12 + (int)D_80199848); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019987C != x) { - flag = 1; - if (D_8019987C < x) { - if (x - D_8019987C < 5) { - D_8019987C = x; - } else { - D_8019987C = D_8019987C + 4; - } - } else { - if (D_8019987C - x < 5) { - D_8019987C = x; - } else { - D_8019987C = D_8019987C - 4; - } - } - } - if (D_80199880 != y) { - flag = 1; - if (D_80199880 < y) { - if (y - D_80199880 < 5) { - D_80199880 = y; - } else { - D_80199880 = D_80199880 + 4; - } - } else { - if (D_80199880 - y < 5) { - D_80199880 = y; - } else { - D_80199880 = D_80199880 - 4; - } - } - } - if (D_80199884 != z) { - flag = 1; - if (D_80199884 < z) { - if (z - D_80199884 < 5) { - D_80199884 = z; - } else { - D_80199884 = D_80199884 + 4; - } - } else { - if (D_80199884 - z < 5) { - D_80199884 = z; - } else { - D_80199884 = D_80199884 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019985C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F570[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019984C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019987C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80199880); - uVar5 = (*(int*)&D_80199884); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F570); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80199864; - -s32 func_8013E054(void) { - return D_80199864; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FF6C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FF44; -extern s16 D_8017FF46; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FF6C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FF44 = 2; - D_8017FF46 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FF46 = 0; - D_8017FF44 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80199898; - extern void * D_8019989C; - extern unsigned char D_8017FBE4; - extern unsigned char D_8017FBFC; - extern unsigned char D_8017FC70; - extern unsigned char D_8017FC78; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80199898 = &D_8017FBE4; - D_8019989C = &D_8017FC70; - } else { - D_80199898 = &D_8017FBFC; - D_8019989C = &D_8017FC78; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FF6C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FF6C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FF6C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FF48; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FF48)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FF48)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FF44; -extern s16 D_8017FF46; -extern unsigned char D_8017FF48; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FF46` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FF44` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FF46; - if (*r < 3) { - *r = *r + 1; - } - D_8017FF44 = (u16)D_8017FF44 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF48); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FF48; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF48); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_013/ov_SC06_013_jr_801380E0.c b/src/ov_SC06_013/ov_SC06_013_jr_801380E0.c new file mode 100644 index 000000000..2f74bfda2 --- /dev/null +++ b/src/ov_SC06_013/ov_SC06_013_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801985D8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017EE64[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80199754; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019AB98; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801985D8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EBA0)(); +extern s16 (*D_8017EBA4)(); +extern M2C_UNK (*D_8017EBAC)(); +extern s32 (*D_8017EBB0)(); +extern s32 D_80199750; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801985DC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017EEF8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801823DC; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017EF10; +extern M2C_UNK D_8017EF18; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017EF20; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EF3C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EF48[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EF5C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EFAC[]; +extern s16 D_8017EFDC[]; +extern s16 D_8017F03C[]; +extern s16 D_8017F044[]; +extern s16 D_8017F064[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017F09C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017F0F4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017F13C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F144[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F14C[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F154[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017F0FC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017F11C; +extern void func_801321B0(int param_1); +extern int D_8017F12C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801997C0; +extern s32 D_801997C4[]; +extern int D_801997C8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F160; +extern u8 D_8017F15C; +extern s16 *D_8017F164; +extern u8 D_8017F168; +extern int D_801997C0; +extern u16 D_801997D0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F164; /* holds a pointer value (*(u16**)&D_8017F164) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F178[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F1CC; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F1D0[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F1D0[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F214; +extern u8 D_8017F258; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F214; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F258 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F29C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F2D8[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F2D8; + if (((s16)a1) < 0xC00) { + tbl = D_8017F29C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F314, D_8017F316, D_8017F318, D_8017F31A, D_8017F31C, D_8017F31E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F316 < ang)) goto outer_else; + if (!(ang < D_8017F31C)) goto inner_else; + if (ang < D_8017F318) { *(s16 *)L = D_8017F318; goto done; } + if (D_8017F31A < ang) { *(s16 *)L = D_8017F31A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F314) { *(s16 *)L = D_8017F314; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F31E < ang) { *(s16 *)L = D_8017F31E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80199838; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80199838, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80199838; +extern s8 D_8019983C; +extern s8 D_8019983D; + +void func_8013C9C4(void * arg0) +{ + D_80199838 = arg0; + D_8019983C = 0; + D_8019983D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80199838; +extern s8 D_8019983C; +extern s8 D_8019983D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80199838; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019983D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019983C)) * 2) + D_80199838); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019983D = (unsigned char) p[1]; + D_8019983C = D_8019983C + 1; + if (D_8019983D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019983C = 0; + *base = 0; + } + } + else + { + D_8019983D = c - 1; + } + } + return; +} + + + +extern s32 D_8019985C; +extern s32 D_80199850; +extern s32 D_80199854; +extern s32 D_80199860; + +void func_8013CABC(void) { + D_8019985C = 1; + D_80199850 = 1; + D_80199854 = 0; + D_80199860 = 1; +} + + + +extern s32 D_80199850; +extern s32 D_80199854; +extern s32 D_80199858; +extern s32 D_8019985C; +extern s32 D_80199860; + +void func_8013CAE8(void) { + D_80199850 = 1; + D_8019985C = 0; + D_80199854 = 0; + D_80199858 = -1; + D_80199860 = 0; +} + + + +extern s32 D_8019985C; +extern s32 D_80199860; +extern s32 D_80199888; +extern s32 D_8019988C; + +void func_8013CB20(void) +{ + D_80199888 = D_80199860; + D_8019988C = D_8019985C; + D_80199860 = 1; + D_8019985C = 0; +} + + + +extern s32 D_80199888; +extern s32 D_8019988C; +extern s32 D_80199860; +extern s32 D_8019985C; + +void func_8013CB5C(void) { + D_80199860 = D_80199888; + D_8019985C = D_8019988C; +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019AAB0; + extern u8 D_8019AAB1; + extern u8 D_8019AAB2; + extern u8 D_8019AAB3; + extern u8 D_8019AAB4; + extern u8 D_8019AAB5; + extern u8 D_8019AAB6; + extern u8 D_8019AAB7; + extern u8 D_8019AAB8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019AAB0; t1 = D_8019AAB1; t2 = D_8019AAB2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019AAB3; t1 = D_8019AAB4; t2 = D_8019AAB5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019AAB6; t1 = D_8019AAB7; t2 = D_8019AAB8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80199868; +extern s32 D_80199850; +extern s32 D_8019986C; +extern s32 D_8019985C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80199868 != 0) { + if (D_80199868 != 2) { + if (((D_80199868 < 3) && (D_80199868 == 1)) && + (D_8019986C = D_8019986C + 1, 0x23a < D_8019986C)) { + D_80199850 = D_80199868; + D_80199868 = 2; + } + } else { + D_80199850 = D_80199850 + -1; + if (D_80199850 == 0) { + D_80199850 = D_80199868; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019985C == 0) { + D_80199868 = D_80199868 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019985C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019985C; +} + + + +extern s32 D_80199868; + +void func_8013D164(void) { + D_80199868 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019AB92; +extern u8 D_8019AC06; +extern u8 D_8019AABA; +extern u8 D_8019AB74; +extern u8 D_8019AA98; +extern u8 D_8019AAB9; +extern s32 D_8019AB78; + +void func_8013D330(void) { + if ((D_8019AB92 & 0xff) != D_8019AC06) { + D_8019AB92 = ((D_8019AB92 & 0xff) < D_8019AC06) ? (D_8019AB92 + 1) : (D_8019AB92 - 1); + } + if ((D_8019AABA & 0xff) != D_8019AB74) { + D_8019AABA = ((D_8019AABA & 0xff) < D_8019AB74) ? (D_8019AABA + 1) : (D_8019AABA - 1); + } + if ((D_8019AA98 & 0xff) != D_8019AAB9) { + D_8019AA98 = ((D_8019AA98 & 0xff) < D_8019AAB9) ? (D_8019AA98 + 1) : (D_8019AA98 - 1); + } + D_8019AB78 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80199840; +extern void *D_80199844; +extern void *D_80199848; +extern s32 D_80199870; +extern s32 D_80199874; +extern s32 D_80199878; +extern s32 D_8019AAEC[]; + +extern u8 D_8017F40C[]; +extern u8 D_8017F4B4[]; +extern u8 D_8017F364[]; +extern u8 D_8017F460[]; +extern u8 D_8017F4E0[]; +extern u8 D_8017F3B8[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80199870 = param_2; + D_80199874 = (param_2 >> 2) & 3; + D_80199878 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80199840 = D_8017F40C; + D_80199844 = D_8017F4B4; + D_80199848 = D_8017F364; + } else { + D_80199840 = D_8017F460; + D_80199844 = D_8017F4E0; + D_80199848 = D_8017F3B8; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80199878 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80199870 & 2) != 0) { + D_8019AAEC[0] = 0x140; + D_8019AAEC[3] = 0x80; + if (p[0x37] == 4) { + D_8019AAEC[0] = 0x140; + D_8019AAEC[3] = 0; + } + if (p[0x37] == 0) { + D_8019AAEC[0] = 0x140; + D_8019AAEC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80199848)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80199848; +extern s16 *D_8019984C; +extern s32 D_8019985C; +extern s32 D_8019987C; +extern s32 D_80199880; +extern s32 D_80199884; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019984C != 0) { + D_8019985C = 0; + p = (int *)(param_1 * 12 + (int)D_80199848); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019987C != x) { + flag = 1; + if (D_8019987C < x) { + if (x - D_8019987C < 5) { + D_8019987C = x; + } else { + D_8019987C = D_8019987C + 4; + } + } else { + if (D_8019987C - x < 5) { + D_8019987C = x; + } else { + D_8019987C = D_8019987C - 4; + } + } + } + if (D_80199880 != y) { + flag = 1; + if (D_80199880 < y) { + if (y - D_80199880 < 5) { + D_80199880 = y; + } else { + D_80199880 = D_80199880 + 4; + } + } else { + if (D_80199880 - y < 5) { + D_80199880 = y; + } else { + D_80199880 = D_80199880 - 4; + } + } + } + if (D_80199884 != z) { + flag = 1; + if (D_80199884 < z) { + if (z - D_80199884 < 5) { + D_80199884 = z; + } else { + D_80199884 = D_80199884 + 4; + } + } else { + if (D_80199884 - z < 5) { + D_80199884 = z; + } else { + D_80199884 = D_80199884 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019985C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F570[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019984C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019987C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80199880); + uVar5 = (*(int*)&D_80199884); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F570); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80199864; + +s32 func_8013E054(void) { + return D_80199864; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FF6C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FF44; +extern s16 D_8017FF46; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FF6C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FF44 = 2; + D_8017FF46 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FF46 = 0; + D_8017FF44 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80199898; + extern void * D_8019989C; + extern unsigned char D_8017FBE4; + extern unsigned char D_8017FBFC; + extern unsigned char D_8017FC70; + extern unsigned char D_8017FC78; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80199898 = &D_8017FBE4; + D_8019989C = &D_8017FC70; + } else { + D_80199898 = &D_8017FBFC; + D_8019989C = &D_8017FC78; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FF6C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FF6C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FF6C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FF48; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FF48)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FF48)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FF44; +extern s16 D_8017FF46; +extern unsigned char D_8017FF48; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FF46` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FF44` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FF46; + if (*r < 3) { + *r = *r + 1; + } + D_8017FF44 = (u16)D_8017FF44 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF48); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FF48; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FF48); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_013/nonmatchings/ov_SC06_013_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_014/ov_SC06_014_jr_8012ACE0.c b/src/ov_SC06_014/ov_SC06_014_jr_8012ACE0.c index 672e9e47d..2a1c08588 100644 --- a/src/ov_SC06_014/ov_SC06_014_jr_8012ACE0.c +++ b/src/ov_SC06_014/ov_SC06_014_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80180534[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80180534[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80180578; -extern u8 D_801805BC; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80180578; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801805BC + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80180600[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018063C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018063C; - if (((s16)a1) < 0xC00) { - tbl = D_80180600; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80180678, D_8018067A, D_8018067C, D_8018067E, D_80180680, D_80180682; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018067A < ang)) goto outer_else; - if (!(ang < D_80180680)) goto inner_else; - if (ang < D_8018067C) { *(s16 *)L = D_8018067C; goto done; } - if (D_8018067E < ang) { *(s16 *)L = D_8018067E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80180678) { *(s16 *)L = D_80180678; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80180682 < ang) { *(s16 *)L = D_80180682; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A0228; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A0228, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A0228; -extern s8 D_801A022C; -extern s8 D_801A022D; - -void func_8013C9C4(void * arg0) -{ - D_801A0228 = arg0; - D_801A022C = 0; - D_801A022D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A0228; -extern s8 D_801A022C; -extern s8 D_801A022D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A0228; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A022D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A022C)) * 2) + D_801A0228); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A022D = (unsigned char) p[1]; - D_801A022C = D_801A022C + 1; - if (D_801A022D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A022C = 0; - *base = 0; - } - } - else - { - D_801A022D = c - 1; - } - } - return; -} - - - -extern s32 D_801A024C; -extern s32 D_801A0240; -extern s32 D_801A0244; -extern s32 D_801A0250; - -void func_8013CABC(void) { - D_801A024C = 1; - D_801A0240 = 1; - D_801A0244 = 0; - D_801A0250 = 1; -} - - - -extern s32 D_801A0240; -extern s32 D_801A0244; -extern s32 D_801A0248; -extern s32 D_801A024C; -extern s32 D_801A0250; - -void func_8013CAE8(void) { - D_801A0240 = 1; - D_801A024C = 0; - D_801A0244 = 0; - D_801A0248 = -1; - D_801A0250 = 0; -} - - - -extern s32 D_801A024C; -extern s32 D_801A0250; -extern s32 D_801A0278; -extern s32 D_801A027C; - -void func_8013CB20(void) -{ - D_801A0278 = D_801A0250; - D_801A027C = D_801A024C; - D_801A0250 = 1; - D_801A024C = 0; -} - - - -extern s32 D_801A0278; -extern s32 D_801A027C; -extern s32 D_801A0250; -extern s32 D_801A024C; - -void func_8013CB5C(void) { - D_801A0250 = D_801A0278; - D_801A024C = D_801A027C; -} - - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A14C8; - extern u8 D_801A14C9; - extern u8 D_801A14CA; - extern u8 D_801A14CB; - extern u8 D_801A14CC; - extern u8 D_801A14CD; - extern u8 D_801A14CE; - extern u8 D_801A14CF; - extern u8 D_801A14D0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A14C8; t1 = D_801A14C9; t2 = D_801A14CA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A14CB; t1 = D_801A14CC; t2 = D_801A14CD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A14CE; t1 = D_801A14CF; t2 = D_801A14D0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A0258; -extern s32 D_801A0240; -extern s32 D_801A025C; -extern s32 D_801A024C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A0258 != 0) { - if (D_801A0258 != 2) { - if (((D_801A0258 < 3) && (D_801A0258 == 1)) && - (D_801A025C = D_801A025C + 1, 0x23a < D_801A025C)) { - D_801A0240 = D_801A0258; - D_801A0258 = 2; - } - } else { - D_801A0240 = D_801A0240 + -1; - if (D_801A0240 == 0) { - D_801A0240 = D_801A0258; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A024C == 0) { - D_801A0258 = D_801A0258 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A024C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A024C; -} - - - -extern s32 D_801A0258; - -void func_8013D164(void) { - D_801A0258 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A15AA; -extern u8 D_801A161E; -extern u8 D_801A14D2; -extern u8 D_801A158C; -extern u8 D_801A14B0; -extern u8 D_801A14D1; -extern s32 D_801A1590; - -void func_8013D330(void) { - if ((D_801A15AA & 0xff) != D_801A161E) { - D_801A15AA = ((D_801A15AA & 0xff) < D_801A161E) ? (D_801A15AA + 1) : (D_801A15AA - 1); - } - if ((D_801A14D2 & 0xff) != D_801A158C) { - D_801A14D2 = ((D_801A14D2 & 0xff) < D_801A158C) ? (D_801A14D2 + 1) : (D_801A14D2 - 1); - } - if ((D_801A14B0 & 0xff) != D_801A14D1) { - D_801A14B0 = ((D_801A14B0 & 0xff) < D_801A14D1) ? (D_801A14B0 + 1) : (D_801A14B0 - 1); - } - D_801A1590 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A0230; -extern void *D_801A0234; -extern void *D_801A0238; -extern s32 D_801A0260; -extern s32 D_801A0264; -extern s32 D_801A0268; -extern s32 D_801A1504[]; - -extern u8 D_80180770[]; -extern u8 D_80180818[]; -extern u8 D_801806C8[]; -extern u8 D_801807C4[]; -extern u8 D_80180844[]; -extern u8 D_8018071C[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A0260 = param_2; - D_801A0264 = (param_2 >> 2) & 3; - D_801A0268 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A0230 = D_80180770; - D_801A0234 = D_80180818; - D_801A0238 = D_801806C8; - } else { - D_801A0230 = D_801807C4; - D_801A0234 = D_80180844; - D_801A0238 = D_8018071C; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A0268 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A0260 & 2) != 0) { - D_801A1504[0] = 0x140; - D_801A1504[3] = 0x80; - if (p[0x37] == 4) { - D_801A1504[0] = 0x140; - D_801A1504[3] = 0; - } - if (p[0x37] == 0) { - D_801A1504[0] = 0x140; - D_801A1504[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A0238)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A0238; -extern s16 *D_801A023C; -extern s32 D_801A024C; -extern s32 D_801A026C; -extern s32 D_801A0270; -extern s32 D_801A0274; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A023C != 0) { - D_801A024C = 0; - p = (int *)(param_1 * 12 + (int)D_801A0238); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A026C != x) { - flag = 1; - if (D_801A026C < x) { - if (x - D_801A026C < 5) { - D_801A026C = x; - } else { - D_801A026C = D_801A026C + 4; - } - } else { - if (D_801A026C - x < 5) { - D_801A026C = x; - } else { - D_801A026C = D_801A026C - 4; - } - } - } - if (D_801A0270 != y) { - flag = 1; - if (D_801A0270 < y) { - if (y - D_801A0270 < 5) { - D_801A0270 = y; - } else { - D_801A0270 = D_801A0270 + 4; - } - } else { - if (D_801A0270 - y < 5) { - D_801A0270 = y; - } else { - D_801A0270 = D_801A0270 - 4; - } - } - } - if (D_801A0274 != z) { - flag = 1; - if (D_801A0274 < z) { - if (z - D_801A0274 < 5) { - D_801A0274 = z; - } else { - D_801A0274 = D_801A0274 + 4; - } - } else { - if (D_801A0274 - z < 5) { - D_801A0274 = z; - } else { - D_801A0274 = D_801A0274 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A024C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801808D4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A023C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A026C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0270); - uVar5 = (*(int*)&D_801A0274); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801808D4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A0254; - -s32 func_8013E054(void) { - return D_801A0254; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801812D0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801812A8; -extern s16 D_801812AA; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801812D0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801812A8 = 2; - D_801812AA = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801812AA = 0; - D_801812A8 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A0288; - extern void * D_801A028C; - extern unsigned char D_80180F48; - extern unsigned char D_80180F60; - extern unsigned char D_80180FD4; - extern unsigned char D_80180FDC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A0288 = &D_80180F48; - D_801A028C = &D_80180FD4; - } else { - D_801A0288 = &D_80180F60; - D_801A028C = &D_80180FDC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801812D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801812D0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801812D0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801812AC; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801812AC)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801812AC)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801812A8; -extern s16 D_801812AA; -extern unsigned char D_801812AC; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801812AA` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801812A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801812AA; - if (*r < 3) { - *r = *r + 1; - } - D_801812A8 = (u16)D_801812A8 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801812AC); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801812AC; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801812AC); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_014/ov_SC06_014_jr_801380E0.c b/src/ov_SC06_014/ov_SC06_014_jr_801380E0.c new file mode 100644 index 000000000..8d3a3124f --- /dev/null +++ b/src/ov_SC06_014/ov_SC06_014_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019EFC8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801801C8[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A0144; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A15B0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019EFC8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017FF04)(); +extern s16 (*D_8017FF08)(); +extern M2C_UNK (*D_8017FF10)(); +extern s32 (*D_8017FF14)(); +extern s32 D_801A0140; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019EFCC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018025C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80183740; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80180274; +extern M2C_UNK D_8018027C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80180284; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801802A0[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801802AC[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801802C0[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80180310[]; +extern s16 D_80180340[]; +extern s16 D_801803A0[]; +extern s16 D_801803A8[]; +extern s16 D_801803C8[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80180400[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80180458[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801804A0[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801804A8[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801804B0[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801804B8[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80180460; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80180480; +extern void func_801321B0(int param_1); +extern int D_80180490; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A01B0; +extern s32 D_801A01B4[]; +extern int D_801A01B8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801804C4; +extern u8 D_801804C0; +extern s16 *D_801804C8; +extern u8 D_801804CC; +extern int D_801A01B0; +extern u16 D_801A01C0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801804C8; /* holds a pointer value (*(u16**)&D_801804C8) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801804DC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80180530; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80180534[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80180534[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80180578; +extern u8 D_801805BC; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80180578; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801805BC + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80180600[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018063C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018063C; + if (((s16)a1) < 0xC00) { + tbl = D_80180600; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80180678, D_8018067A, D_8018067C, D_8018067E, D_80180680, D_80180682; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018067A < ang)) goto outer_else; + if (!(ang < D_80180680)) goto inner_else; + if (ang < D_8018067C) { *(s16 *)L = D_8018067C; goto done; } + if (D_8018067E < ang) { *(s16 *)L = D_8018067E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80180678) { *(s16 *)L = D_80180678; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80180682 < ang) { *(s16 *)L = D_80180682; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A0228; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A0228, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A0228; +extern s8 D_801A022C; +extern s8 D_801A022D; + +void func_8013C9C4(void * arg0) +{ + D_801A0228 = arg0; + D_801A022C = 0; + D_801A022D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A0228; +extern s8 D_801A022C; +extern s8 D_801A022D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A0228; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A022D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A022C)) * 2) + D_801A0228); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A022D = (unsigned char) p[1]; + D_801A022C = D_801A022C + 1; + if (D_801A022D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A022C = 0; + *base = 0; + } + } + else + { + D_801A022D = c - 1; + } + } + return; +} + + + +extern s32 D_801A024C; +extern s32 D_801A0240; +extern s32 D_801A0244; +extern s32 D_801A0250; + +void func_8013CABC(void) { + D_801A024C = 1; + D_801A0240 = 1; + D_801A0244 = 0; + D_801A0250 = 1; +} + + + +extern s32 D_801A0240; +extern s32 D_801A0244; +extern s32 D_801A0248; +extern s32 D_801A024C; +extern s32 D_801A0250; + +void func_8013CAE8(void) { + D_801A0240 = 1; + D_801A024C = 0; + D_801A0244 = 0; + D_801A0248 = -1; + D_801A0250 = 0; +} + + + +extern s32 D_801A024C; +extern s32 D_801A0250; +extern s32 D_801A0278; +extern s32 D_801A027C; + +void func_8013CB20(void) +{ + D_801A0278 = D_801A0250; + D_801A027C = D_801A024C; + D_801A0250 = 1; + D_801A024C = 0; +} + + + +extern s32 D_801A0278; +extern s32 D_801A027C; +extern s32 D_801A0250; +extern s32 D_801A024C; + +void func_8013CB5C(void) { + D_801A0250 = D_801A0278; + D_801A024C = D_801A027C; +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A14C8; + extern u8 D_801A14C9; + extern u8 D_801A14CA; + extern u8 D_801A14CB; + extern u8 D_801A14CC; + extern u8 D_801A14CD; + extern u8 D_801A14CE; + extern u8 D_801A14CF; + extern u8 D_801A14D0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A14C8; t1 = D_801A14C9; t2 = D_801A14CA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A14CB; t1 = D_801A14CC; t2 = D_801A14CD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A14CE; t1 = D_801A14CF; t2 = D_801A14D0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A0258; +extern s32 D_801A0240; +extern s32 D_801A025C; +extern s32 D_801A024C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A0258 != 0) { + if (D_801A0258 != 2) { + if (((D_801A0258 < 3) && (D_801A0258 == 1)) && + (D_801A025C = D_801A025C + 1, 0x23a < D_801A025C)) { + D_801A0240 = D_801A0258; + D_801A0258 = 2; + } + } else { + D_801A0240 = D_801A0240 + -1; + if (D_801A0240 == 0) { + D_801A0240 = D_801A0258; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A024C == 0) { + D_801A0258 = D_801A0258 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A024C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A024C; +} + + + +extern s32 D_801A0258; + +void func_8013D164(void) { + D_801A0258 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A15AA; +extern u8 D_801A161E; +extern u8 D_801A14D2; +extern u8 D_801A158C; +extern u8 D_801A14B0; +extern u8 D_801A14D1; +extern s32 D_801A1590; + +void func_8013D330(void) { + if ((D_801A15AA & 0xff) != D_801A161E) { + D_801A15AA = ((D_801A15AA & 0xff) < D_801A161E) ? (D_801A15AA + 1) : (D_801A15AA - 1); + } + if ((D_801A14D2 & 0xff) != D_801A158C) { + D_801A14D2 = ((D_801A14D2 & 0xff) < D_801A158C) ? (D_801A14D2 + 1) : (D_801A14D2 - 1); + } + if ((D_801A14B0 & 0xff) != D_801A14D1) { + D_801A14B0 = ((D_801A14B0 & 0xff) < D_801A14D1) ? (D_801A14B0 + 1) : (D_801A14B0 - 1); + } + D_801A1590 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A0230; +extern void *D_801A0234; +extern void *D_801A0238; +extern s32 D_801A0260; +extern s32 D_801A0264; +extern s32 D_801A0268; +extern s32 D_801A1504[]; + +extern u8 D_80180770[]; +extern u8 D_80180818[]; +extern u8 D_801806C8[]; +extern u8 D_801807C4[]; +extern u8 D_80180844[]; +extern u8 D_8018071C[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A0260 = param_2; + D_801A0264 = (param_2 >> 2) & 3; + D_801A0268 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A0230 = D_80180770; + D_801A0234 = D_80180818; + D_801A0238 = D_801806C8; + } else { + D_801A0230 = D_801807C4; + D_801A0234 = D_80180844; + D_801A0238 = D_8018071C; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A0268 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A0260 & 2) != 0) { + D_801A1504[0] = 0x140; + D_801A1504[3] = 0x80; + if (p[0x37] == 4) { + D_801A1504[0] = 0x140; + D_801A1504[3] = 0; + } + if (p[0x37] == 0) { + D_801A1504[0] = 0x140; + D_801A1504[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A0238)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A0238; +extern s16 *D_801A023C; +extern s32 D_801A024C; +extern s32 D_801A026C; +extern s32 D_801A0270; +extern s32 D_801A0274; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A023C != 0) { + D_801A024C = 0; + p = (int *)(param_1 * 12 + (int)D_801A0238); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A026C != x) { + flag = 1; + if (D_801A026C < x) { + if (x - D_801A026C < 5) { + D_801A026C = x; + } else { + D_801A026C = D_801A026C + 4; + } + } else { + if (D_801A026C - x < 5) { + D_801A026C = x; + } else { + D_801A026C = D_801A026C - 4; + } + } + } + if (D_801A0270 != y) { + flag = 1; + if (D_801A0270 < y) { + if (y - D_801A0270 < 5) { + D_801A0270 = y; + } else { + D_801A0270 = D_801A0270 + 4; + } + } else { + if (D_801A0270 - y < 5) { + D_801A0270 = y; + } else { + D_801A0270 = D_801A0270 - 4; + } + } + } + if (D_801A0274 != z) { + flag = 1; + if (D_801A0274 < z) { + if (z - D_801A0274 < 5) { + D_801A0274 = z; + } else { + D_801A0274 = D_801A0274 + 4; + } + } else { + if (D_801A0274 - z < 5) { + D_801A0274 = z; + } else { + D_801A0274 = D_801A0274 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A024C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801808D4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A023C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A026C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A0270); + uVar5 = (*(int*)&D_801A0274); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801808D4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A0254; + +s32 func_8013E054(void) { + return D_801A0254; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801812D0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801812A8; +extern s16 D_801812AA; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801812D0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801812A8 = 2; + D_801812AA = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801812AA = 0; + D_801812A8 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A0288; + extern void * D_801A028C; + extern unsigned char D_80180F48; + extern unsigned char D_80180F60; + extern unsigned char D_80180FD4; + extern unsigned char D_80180FDC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A0288 = &D_80180F48; + D_801A028C = &D_80180FD4; + } else { + D_801A0288 = &D_80180F60; + D_801A028C = &D_80180FDC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801812D0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801812D0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801812D0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801812AC; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801812AC)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801812AC)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801812A8; +extern s16 D_801812AA; +extern unsigned char D_801812AC; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801812AA` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801812A8` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801812AA; + if (*r < 3) { + *r = *r + 1; + } + D_801812A8 = (u16)D_801812A8 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801812AC); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801812AC; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801812AC); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_014/nonmatchings/ov_SC06_014_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_015/ov_SC06_015_jr_8012ACE0.c b/src/ov_SC06_015/ov_SC06_015_jr_8012ACE0.c index 3c248f5d2..7817327fb 100644 --- a/src/ov_SC06_015/ov_SC06_015_jr_8012ACE0.c +++ b/src/ov_SC06_015/ov_SC06_015_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017F08C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017F08C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017F0D0; -extern u8 D_8017F114; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017F0D0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017F114 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017F158[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017F194[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017F194; - if (((s16)a1) < 0xC00) { - tbl = D_8017F158; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017F1D0, D_8017F1D2, D_8017F1D4, D_8017F1D6, D_8017F1D8, D_8017F1DA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017F1D2 < ang)) goto outer_else; - if (!(ang < D_8017F1D8)) goto inner_else; - if (ang < D_8017F1D4) { *(s16 *)L = D_8017F1D4; goto done; } - if (D_8017F1D6 < ang) { *(s16 *)L = D_8017F1D6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017F1D0) { *(s16 *)L = D_8017F1D0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017F1DA < ang) { *(s16 *)L = D_8017F1DA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80193608; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80193608, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80193608; -extern s8 D_8019360C; -extern s8 D_8019360D; - -void func_8013C9C4(void * arg0) -{ - D_80193608 = arg0; - D_8019360C = 0; - D_8019360D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80193608; -extern s8 D_8019360C; -extern s8 D_8019360D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80193608; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019360D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019360C)) * 2) + D_80193608); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019360D = (unsigned char) p[1]; - D_8019360C = D_8019360C + 1; - if (D_8019360D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019360C = 0; - *base = 0; - } - } - else - { - D_8019360D = c - 1; - } - } - return; -} - - - -extern s32 D_8019362C; -extern s32 D_80193620; -extern s32 D_80193624; -extern s32 D_80193630; - -void func_8013CABC(void) { - D_8019362C = 1; - D_80193620 = 1; - D_80193624 = 0; - D_80193630 = 1; -} - - - -extern s32 D_80193620; -extern s32 D_80193624; -extern s32 D_80193628; -extern s32 D_8019362C; -extern s32 D_80193630; - -void func_8013CAE8(void) { - D_80193620 = 1; - D_8019362C = 0; - D_80193624 = 0; - D_80193628 = -1; - D_80193630 = 0; -} - - - -extern s32 D_8019362C; -extern s32 D_80193630; -extern s32 D_80193658; -extern s32 D_8019365C; - -void func_8013CB20(void) -{ - D_80193658 = D_80193630; - D_8019365C = D_8019362C; - D_80193630 = 1; - D_8019362C = 0; -} - - - -extern s32 D_80193658; -extern s32 D_8019365C; -extern s32 D_80193630; -extern s32 D_8019362C; - -void func_8013CB5C(void) { - D_80193630 = D_80193658; - D_8019362C = D_8019365C; -} - - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801948A8; - extern u8 D_801948A9; - extern u8 D_801948AA; - extern u8 D_801948AB; - extern u8 D_801948AC; - extern u8 D_801948AD; - extern u8 D_801948AE; - extern u8 D_801948AF; - extern u8 D_801948B0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801948A8; t1 = D_801948A9; t2 = D_801948AA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801948AB; t1 = D_801948AC; t2 = D_801948AD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801948AE; t1 = D_801948AF; t2 = D_801948B0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_80193638; -extern s32 D_80193620; -extern s32 D_8019363C; -extern s32 D_8019362C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_80193638 != 0) { - if (D_80193638 != 2) { - if (((D_80193638 < 3) && (D_80193638 == 1)) && - (D_8019363C = D_8019363C + 1, 0x23a < D_8019363C)) { - D_80193620 = D_80193638; - D_80193638 = 2; - } - } else { - D_80193620 = D_80193620 + -1; - if (D_80193620 == 0) { - D_80193620 = D_80193638; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019362C == 0) { - D_80193638 = D_80193638 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019362C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019362C; -} - - - -extern s32 D_80193638; - -void func_8013D164(void) { - D_80193638 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019498A; -extern u8 D_801949FE; -extern u8 D_801948B2; -extern u8 D_8019496C; -extern u8 D_80194890; -extern u8 D_801948B1; -extern s32 D_80194970; - -void func_8013D330(void) { - if ((D_8019498A & 0xff) != D_801949FE) { - D_8019498A = ((D_8019498A & 0xff) < D_801949FE) ? (D_8019498A + 1) : (D_8019498A - 1); - } - if ((D_801948B2 & 0xff) != D_8019496C) { - D_801948B2 = ((D_801948B2 & 0xff) < D_8019496C) ? (D_801948B2 + 1) : (D_801948B2 - 1); - } - if ((D_80194890 & 0xff) != D_801948B1) { - D_80194890 = ((D_80194890 & 0xff) < D_801948B1) ? (D_80194890 + 1) : (D_80194890 - 1); - } - D_80194970 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80193610; -extern void *D_80193614; -extern void *D_80193618; -extern s32 D_80193640; -extern s32 D_80193644; -extern s32 D_80193648; -extern s32 D_801948E4[]; - -extern u8 D_8017F2C8[]; -extern u8 D_8017F370[]; -extern u8 D_8017F220[]; -extern u8 D_8017F31C[]; -extern u8 D_8017F39C[]; -extern u8 D_8017F274[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_80193640 = param_2; - D_80193644 = (param_2 >> 2) & 3; - D_80193648 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80193610 = D_8017F2C8; - D_80193614 = D_8017F370; - D_80193618 = D_8017F220; - } else { - D_80193610 = D_8017F31C; - D_80193614 = D_8017F39C; - D_80193618 = D_8017F274; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_80193648 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_80193640 & 2) != 0) { - D_801948E4[0] = 0x140; - D_801948E4[3] = 0x80; - if (p[0x37] == 4) { - D_801948E4[0] = 0x140; - D_801948E4[3] = 0; - } - if (p[0x37] == 0) { - D_801948E4[0] = 0x140; - D_801948E4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80193618)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80193618; -extern s16 *D_8019361C; -extern s32 D_8019362C; -extern s32 D_8019364C; -extern s32 D_80193650; -extern s32 D_80193654; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019361C != 0) { - D_8019362C = 0; - p = (int *)(param_1 * 12 + (int)D_80193618); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019364C != x) { - flag = 1; - if (D_8019364C < x) { - if (x - D_8019364C < 5) { - D_8019364C = x; - } else { - D_8019364C = D_8019364C + 4; - } - } else { - if (D_8019364C - x < 5) { - D_8019364C = x; - } else { - D_8019364C = D_8019364C - 4; - } - } - } - if (D_80193650 != y) { - flag = 1; - if (D_80193650 < y) { - if (y - D_80193650 < 5) { - D_80193650 = y; - } else { - D_80193650 = D_80193650 + 4; - } - } else { - if (D_80193650 - y < 5) { - D_80193650 = y; - } else { - D_80193650 = D_80193650 - 4; - } - } - } - if (D_80193654 != z) { - flag = 1; - if (D_80193654 < z) { - if (z - D_80193654 < 5) { - D_80193654 = z; - } else { - D_80193654 = D_80193654 + 4; - } - } else { - if (D_80193654 - z < 5) { - D_80193654 = z; - } else { - D_80193654 = D_80193654 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019362C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017F42C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019361C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019364C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80193650); - uVar5 = (*(int*)&D_80193654); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017F42C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_80193634; - -s32 func_8013E054(void) { - return D_80193634; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017FE28; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017FE00; -extern s16 D_8017FE02; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017FE28; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017FE00 = 2; - D_8017FE02 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017FE02 = 0; - D_8017FE00 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_80193668; - extern void * D_8019366C; - extern unsigned char D_8017FAA0; - extern unsigned char D_8017FAB8; - extern unsigned char D_8017FB2C; - extern unsigned char D_8017FB34; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_80193668 = &D_8017FAA0; - D_8019366C = &D_8017FB2C; - } else { - D_80193668 = &D_8017FAB8; - D_8019366C = &D_8017FB34; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017FE28/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE28 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017FE28)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017FE04; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE04)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE04)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017FE00; -extern s16 D_8017FE02; -extern unsigned char D_8017FE04; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE02` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017FE00` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017FE02; - if (*r < 3) { - *r = *r + 1; - } - D_8017FE00 = (u16)D_8017FE00 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE04); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017FE04; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE04); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_015/ov_SC06_015_jr_801380E0.c b/src/ov_SC06_015/ov_SC06_015_jr_801380E0.c new file mode 100644 index 000000000..f8943ccab --- /dev/null +++ b/src/ov_SC06_015/ov_SC06_015_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801923A8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017ED20[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_80193524; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_80194990; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801923A8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017EA5C)(); +extern s16 (*D_8017EA60)(); +extern M2C_UNK (*D_8017EA68)(); +extern s32 (*D_8017EA6C)(); +extern s32 D_80193520; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801923AC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017EDB4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80182298; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017EDCC; +extern M2C_UNK D_8017EDD4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017EDDC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017EDF8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017EE04[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017EE18[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017EE68[]; +extern s16 D_8017EE98[]; +extern s16 D_8017EEF8[]; +extern s16 D_8017EF00[]; +extern s16 D_8017EF20[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017EF58[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017EFB0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017EFF8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017F000[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017F008[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017F010[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017EFB8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017EFD8; +extern void func_801321B0(int param_1); +extern int D_8017EFE8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80193590; +extern s32 D_80193594[]; +extern int D_80193598; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017F01C; +extern u8 D_8017F018; +extern s16 *D_8017F020; +extern u8 D_8017F024; +extern int D_80193590; +extern u16 D_801935A0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017F020; /* holds a pointer value (*(u16**)&D_8017F020) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017F034[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017F088; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017F08C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017F08C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017F0D0; +extern u8 D_8017F114; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017F0D0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017F114 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017F158[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017F194[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017F194; + if (((s16)a1) < 0xC00) { + tbl = D_8017F158; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017F1D0, D_8017F1D2, D_8017F1D4, D_8017F1D6, D_8017F1D8, D_8017F1DA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017F1D2 < ang)) goto outer_else; + if (!(ang < D_8017F1D8)) goto inner_else; + if (ang < D_8017F1D4) { *(s16 *)L = D_8017F1D4; goto done; } + if (D_8017F1D6 < ang) { *(s16 *)L = D_8017F1D6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017F1D0) { *(s16 *)L = D_8017F1D0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017F1DA < ang) { *(s16 *)L = D_8017F1DA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80193608; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80193608, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80193608; +extern s8 D_8019360C; +extern s8 D_8019360D; + +void func_8013C9C4(void * arg0) +{ + D_80193608 = arg0; + D_8019360C = 0; + D_8019360D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80193608; +extern s8 D_8019360C; +extern s8 D_8019360D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80193608; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019360D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019360C)) * 2) + D_80193608); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019360D = (unsigned char) p[1]; + D_8019360C = D_8019360C + 1; + if (D_8019360D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019360C = 0; + *base = 0; + } + } + else + { + D_8019360D = c - 1; + } + } + return; +} + + + +extern s32 D_8019362C; +extern s32 D_80193620; +extern s32 D_80193624; +extern s32 D_80193630; + +void func_8013CABC(void) { + D_8019362C = 1; + D_80193620 = 1; + D_80193624 = 0; + D_80193630 = 1; +} + + + +extern s32 D_80193620; +extern s32 D_80193624; +extern s32 D_80193628; +extern s32 D_8019362C; +extern s32 D_80193630; + +void func_8013CAE8(void) { + D_80193620 = 1; + D_8019362C = 0; + D_80193624 = 0; + D_80193628 = -1; + D_80193630 = 0; +} + + + +extern s32 D_8019362C; +extern s32 D_80193630; +extern s32 D_80193658; +extern s32 D_8019365C; + +void func_8013CB20(void) +{ + D_80193658 = D_80193630; + D_8019365C = D_8019362C; + D_80193630 = 1; + D_8019362C = 0; +} + + + +extern s32 D_80193658; +extern s32 D_8019365C; +extern s32 D_80193630; +extern s32 D_8019362C; + +void func_8013CB5C(void) { + D_80193630 = D_80193658; + D_8019362C = D_8019365C; +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801948A8; + extern u8 D_801948A9; + extern u8 D_801948AA; + extern u8 D_801948AB; + extern u8 D_801948AC; + extern u8 D_801948AD; + extern u8 D_801948AE; + extern u8 D_801948AF; + extern u8 D_801948B0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801948A8; t1 = D_801948A9; t2 = D_801948AA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801948AB; t1 = D_801948AC; t2 = D_801948AD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801948AE; t1 = D_801948AF; t2 = D_801948B0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_80193638; +extern s32 D_80193620; +extern s32 D_8019363C; +extern s32 D_8019362C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_80193638 != 0) { + if (D_80193638 != 2) { + if (((D_80193638 < 3) && (D_80193638 == 1)) && + (D_8019363C = D_8019363C + 1, 0x23a < D_8019363C)) { + D_80193620 = D_80193638; + D_80193638 = 2; + } + } else { + D_80193620 = D_80193620 + -1; + if (D_80193620 == 0) { + D_80193620 = D_80193638; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019362C == 0) { + D_80193638 = D_80193638 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019362C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019362C; +} + + + +extern s32 D_80193638; + +void func_8013D164(void) { + D_80193638 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019498A; +extern u8 D_801949FE; +extern u8 D_801948B2; +extern u8 D_8019496C; +extern u8 D_80194890; +extern u8 D_801948B1; +extern s32 D_80194970; + +void func_8013D330(void) { + if ((D_8019498A & 0xff) != D_801949FE) { + D_8019498A = ((D_8019498A & 0xff) < D_801949FE) ? (D_8019498A + 1) : (D_8019498A - 1); + } + if ((D_801948B2 & 0xff) != D_8019496C) { + D_801948B2 = ((D_801948B2 & 0xff) < D_8019496C) ? (D_801948B2 + 1) : (D_801948B2 - 1); + } + if ((D_80194890 & 0xff) != D_801948B1) { + D_80194890 = ((D_80194890 & 0xff) < D_801948B1) ? (D_80194890 + 1) : (D_80194890 - 1); + } + D_80194970 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80193610; +extern void *D_80193614; +extern void *D_80193618; +extern s32 D_80193640; +extern s32 D_80193644; +extern s32 D_80193648; +extern s32 D_801948E4[]; + +extern u8 D_8017F2C8[]; +extern u8 D_8017F370[]; +extern u8 D_8017F220[]; +extern u8 D_8017F31C[]; +extern u8 D_8017F39C[]; +extern u8 D_8017F274[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_80193640 = param_2; + D_80193644 = (param_2 >> 2) & 3; + D_80193648 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80193610 = D_8017F2C8; + D_80193614 = D_8017F370; + D_80193618 = D_8017F220; + } else { + D_80193610 = D_8017F31C; + D_80193614 = D_8017F39C; + D_80193618 = D_8017F274; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_80193648 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_80193640 & 2) != 0) { + D_801948E4[0] = 0x140; + D_801948E4[3] = 0x80; + if (p[0x37] == 4) { + D_801948E4[0] = 0x140; + D_801948E4[3] = 0; + } + if (p[0x37] == 0) { + D_801948E4[0] = 0x140; + D_801948E4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80193618)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80193618; +extern s16 *D_8019361C; +extern s32 D_8019362C; +extern s32 D_8019364C; +extern s32 D_80193650; +extern s32 D_80193654; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019361C != 0) { + D_8019362C = 0; + p = (int *)(param_1 * 12 + (int)D_80193618); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019364C != x) { + flag = 1; + if (D_8019364C < x) { + if (x - D_8019364C < 5) { + D_8019364C = x; + } else { + D_8019364C = D_8019364C + 4; + } + } else { + if (D_8019364C - x < 5) { + D_8019364C = x; + } else { + D_8019364C = D_8019364C - 4; + } + } + } + if (D_80193650 != y) { + flag = 1; + if (D_80193650 < y) { + if (y - D_80193650 < 5) { + D_80193650 = y; + } else { + D_80193650 = D_80193650 + 4; + } + } else { + if (D_80193650 - y < 5) { + D_80193650 = y; + } else { + D_80193650 = D_80193650 - 4; + } + } + } + if (D_80193654 != z) { + flag = 1; + if (D_80193654 < z) { + if (z - D_80193654 < 5) { + D_80193654 = z; + } else { + D_80193654 = D_80193654 + 4; + } + } else { + if (D_80193654 - z < 5) { + D_80193654 = z; + } else { + D_80193654 = D_80193654 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019362C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017F42C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019361C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019364C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_80193650); + uVar5 = (*(int*)&D_80193654); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017F42C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_80193634; + +s32 func_8013E054(void) { + return D_80193634; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017FE28; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017FE00; +extern s16 D_8017FE02; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017FE28; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017FE00 = 2; + D_8017FE02 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017FE02 = 0; + D_8017FE00 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_80193668; + extern void * D_8019366C; + extern unsigned char D_8017FAA0; + extern unsigned char D_8017FAB8; + extern unsigned char D_8017FB2C; + extern unsigned char D_8017FB34; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_80193668 = &D_8017FAA0; + D_8019366C = &D_8017FB2C; + } else { + D_80193668 = &D_8017FAB8; + D_8019366C = &D_8017FB34; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017FE28/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017FE28 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017FE28)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017FE04; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017FE04)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017FE04)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017FE00; +extern s16 D_8017FE02; +extern unsigned char D_8017FE04; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017FE02` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017FE00` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017FE02; + if (*r < 3) { + *r = *r + 1; + } + D_8017FE00 = (u16)D_8017FE00 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE04); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017FE04; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017FE04); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_015/nonmatchings/ov_SC06_015_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_016/ov_SC06_016_jr_8012ACE0.c b/src/ov_SC06_016/ov_SC06_016_jr_8012ACE0.c index 74a9f1eb6..8605eea08 100644 --- a/src/ov_SC06_016/ov_SC06_016_jr_8012ACE0.c +++ b/src/ov_SC06_016/ov_SC06_016_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018549C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018549C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801854E0; -extern u8 D_80185524; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801854E0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80185524 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80185568[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801855A4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801855A4; - if (((s16)a1) < 0xC00) { - tbl = D_80185568; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801855E0, D_801855E2, D_801855E4, D_801855E6, D_801855E8, D_801855EA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801855E2 < ang)) goto outer_else; - if (!(ang < D_801855E8)) goto inner_else; - if (ang < D_801855E4) { *(s16 *)L = D_801855E4; goto done; } - if (D_801855E6 < ang) { *(s16 *)L = D_801855E6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801855E0) { *(s16 *)L = D_801855E0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801855EA < ang) { *(s16 *)L = D_801855EA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019E3D8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019E3D8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019E3D8; -extern s8 D_8019E3DC; -extern s8 D_8019E3DD; - -void func_8013C9C4(void * arg0) -{ - D_8019E3D8 = arg0; - D_8019E3DC = 0; - D_8019E3DD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019E3D8; -extern s8 D_8019E3DC; -extern s8 D_8019E3DD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019E3D8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019E3DD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019E3DC)) * 2) + D_8019E3D8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019E3DD = (unsigned char) p[1]; - D_8019E3DC = D_8019E3DC + 1; - if (D_8019E3DD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019E3DC = 0; - *base = 0; - } - } - else - { - D_8019E3DD = c - 1; - } - } - return; -} - - - -extern s32 D_8019E3FC; -extern s32 D_8019E3F0; -extern s32 D_8019E3F4; -extern s32 D_8019E400; - -void func_8013CABC(void) { - D_8019E3FC = 1; - D_8019E3F0 = 1; - D_8019E3F4 = 0; - D_8019E400 = 1; -} - - - -extern s32 D_8019E3F0; -extern s32 D_8019E3F4; -extern s32 D_8019E3F8; -extern s32 D_8019E3FC; -extern s32 D_8019E400; - -void func_8013CAE8(void) { - D_8019E3F0 = 1; - D_8019E3FC = 0; - D_8019E3F4 = 0; - D_8019E3F8 = -1; - D_8019E400 = 0; -} - - - -extern s32 D_8019E3FC; -extern s32 D_8019E400; -extern s32 D_8019E428; -extern s32 D_8019E42C; - -void func_8013CB20(void) -{ - D_8019E428 = D_8019E400; - D_8019E42C = D_8019E3FC; - D_8019E400 = 1; - D_8019E3FC = 0; -} - - - -extern s32 D_8019E428; -extern s32 D_8019E42C; -extern s32 D_8019E400; -extern s32 D_8019E3FC; - -void func_8013CB5C(void) { - D_8019E400 = D_8019E428; - D_8019E3FC = D_8019E42C; -} - - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A0118; - extern u8 D_801A0119; - extern u8 D_801A011A; - extern u8 D_801A011B; - extern u8 D_801A011C; - extern u8 D_801A011D; - extern u8 D_801A011E; - extern u8 D_801A011F; - extern u8 D_801A0120; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A0118; t1 = D_801A0119; t2 = D_801A011A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A011B; t1 = D_801A011C; t2 = D_801A011D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A011E; t1 = D_801A011F; t2 = D_801A0120; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019E408; -extern s32 D_8019E3F0; -extern s32 D_8019E40C; -extern s32 D_8019E3FC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019E408 != 0) { - if (D_8019E408 != 2) { - if (((D_8019E408 < 3) && (D_8019E408 == 1)) && - (D_8019E40C = D_8019E40C + 1, 0x23a < D_8019E40C)) { - D_8019E3F0 = D_8019E408; - D_8019E408 = 2; - } - } else { - D_8019E3F0 = D_8019E3F0 + -1; - if (D_8019E3F0 == 0) { - D_8019E3F0 = D_8019E408; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019E3FC == 0) { - D_8019E408 = D_8019E408 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019E3FC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019E3FC; -} - - - -extern s32 D_8019E408; - -void func_8013D164(void) { - D_8019E408 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A01FA; -extern u8 D_801A026E; -extern u8 D_801A0122; -extern u8 D_801A01DC; -extern u8 D_801A0100; -extern u8 D_801A0121; -extern s32 D_801A01E0; - -void func_8013D330(void) { - if ((D_801A01FA & 0xff) != D_801A026E) { - D_801A01FA = ((D_801A01FA & 0xff) < D_801A026E) ? (D_801A01FA + 1) : (D_801A01FA - 1); - } - if ((D_801A0122 & 0xff) != D_801A01DC) { - D_801A0122 = ((D_801A0122 & 0xff) < D_801A01DC) ? (D_801A0122 + 1) : (D_801A0122 - 1); - } - if ((D_801A0100 & 0xff) != D_801A0121) { - D_801A0100 = ((D_801A0100 & 0xff) < D_801A0121) ? (D_801A0100 + 1) : (D_801A0100 - 1); - } - D_801A01E0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019E3E0; -extern void *D_8019E3E4; -extern void *D_8019E3E8; -extern s32 D_8019E410; -extern s32 D_8019E414; -extern s32 D_8019E418; -extern s32 D_801A0154[]; - -extern u8 D_801856D8[]; -extern u8 D_80185780[]; -extern u8 D_80185630[]; -extern u8 D_8018572C[]; -extern u8 D_801857AC[]; -extern u8 D_80185684[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019E410 = param_2; - D_8019E414 = (param_2 >> 2) & 3; - D_8019E418 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019E3E0 = D_801856D8; - D_8019E3E4 = D_80185780; - D_8019E3E8 = D_80185630; - } else { - D_8019E3E0 = D_8018572C; - D_8019E3E4 = D_801857AC; - D_8019E3E8 = D_80185684; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019E418 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019E410 & 2) != 0) { - D_801A0154[0] = 0x140; - D_801A0154[3] = 0x80; - if (p[0x37] == 4) { - D_801A0154[0] = 0x140; - D_801A0154[3] = 0; - } - if (p[0x37] == 0) { - D_801A0154[0] = 0x140; - D_801A0154[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019E3E8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019E3E8; -extern s16 *D_8019E3EC; -extern s32 D_8019E3FC; -extern s32 D_8019E41C; -extern s32 D_8019E420; -extern s32 D_8019E424; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019E3EC != 0) { - D_8019E3FC = 0; - p = (int *)(param_1 * 12 + (int)D_8019E3E8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019E41C != x) { - flag = 1; - if (D_8019E41C < x) { - if (x - D_8019E41C < 5) { - D_8019E41C = x; - } else { - D_8019E41C = D_8019E41C + 4; - } - } else { - if (D_8019E41C - x < 5) { - D_8019E41C = x; - } else { - D_8019E41C = D_8019E41C - 4; - } - } - } - if (D_8019E420 != y) { - flag = 1; - if (D_8019E420 < y) { - if (y - D_8019E420 < 5) { - D_8019E420 = y; - } else { - D_8019E420 = D_8019E420 + 4; - } - } else { - if (D_8019E420 - y < 5) { - D_8019E420 = y; - } else { - D_8019E420 = D_8019E420 - 4; - } - } - } - if (D_8019E424 != z) { - flag = 1; - if (D_8019E424 < z) { - if (z - D_8019E424 < 5) { - D_8019E424 = z; - } else { - D_8019E424 = D_8019E424 + 4; - } - } else { - if (D_8019E424 - z < 5) { - D_8019E424 = z; - } else { - D_8019E424 = D_8019E424 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019E3FC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018583C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019E3EC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019E41C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019E420); - uVar5 = (*(int*)&D_8019E424); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018583C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019E404; - -s32 func_8013E054(void) { - return D_8019E404; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186238; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80186210; -extern s16 D_80186212; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186238; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80186210 = 2; - D_80186212 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80186212 = 0; - D_80186210 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019E438; - extern void * D_8019E43C; - extern unsigned char D_80185EB0; - extern unsigned char D_80185EC8; - extern unsigned char D_80185F3C; - extern unsigned char D_80185F44; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019E438 = &D_80185EB0; - D_8019E43C = &D_80185F3C; - } else { - D_8019E438 = &D_80185EC8; - D_8019E43C = &D_80185F44; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186238/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186238 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186238)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186214; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186214)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186214)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80186210; -extern s16 D_80186212; -extern unsigned char D_80186214; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186212` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80186210` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80186212; - if (*r < 3) { - *r = *r + 1; - } - D_80186210 = (u16)D_80186210 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186214); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186214; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186214); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_016/ov_SC06_016_jr_801380E0.c b/src/ov_SC06_016/ov_SC06_016_jr_801380E0.c new file mode 100644 index 000000000..b54412ac5 --- /dev/null +++ b/src/ov_SC06_016/ov_SC06_016_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019CFF0; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80185130[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019E2F4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A0200; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019CFF0; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184E6C)(); +extern s16 (*D_80184E70)(); +extern M2C_UNK (*D_80184E78)(); +extern s32 (*D_80184E7C)(); +extern s32 D_8019E2F0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019CFF4; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801851C4; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801886A8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801851DC; +extern M2C_UNK D_801851E4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801851EC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185208[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185214[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185228[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185278[]; +extern s16 D_801852A8[]; +extern s16 D_80185308[]; +extern s16 D_80185310[]; +extern s16 D_80185330[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80185368[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801853C0[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185408[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80185410[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185418[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80185420[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801853C8; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801853E8; +extern void func_801321B0(int param_1); +extern int D_801853F8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019E360; +extern s32 D_8019E364[]; +extern int D_8019E368; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018542C; +extern u8 D_80185428; +extern s16 *D_80185430; +extern u8 D_80185434; +extern int D_8019E360; +extern u16 D_8019E370; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80185430; /* holds a pointer value (*(u16**)&D_80185430) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185444[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185498; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018549C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018549C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801854E0; +extern u8 D_80185524; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801854E0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80185524 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80185568[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801855A4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801855A4; + if (((s16)a1) < 0xC00) { + tbl = D_80185568; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801855E0, D_801855E2, D_801855E4, D_801855E6, D_801855E8, D_801855EA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801855E2 < ang)) goto outer_else; + if (!(ang < D_801855E8)) goto inner_else; + if (ang < D_801855E4) { *(s16 *)L = D_801855E4; goto done; } + if (D_801855E6 < ang) { *(s16 *)L = D_801855E6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801855E0) { *(s16 *)L = D_801855E0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801855EA < ang) { *(s16 *)L = D_801855EA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019E3D8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019E3D8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019E3D8; +extern s8 D_8019E3DC; +extern s8 D_8019E3DD; + +void func_8013C9C4(void * arg0) +{ + D_8019E3D8 = arg0; + D_8019E3DC = 0; + D_8019E3DD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019E3D8; +extern s8 D_8019E3DC; +extern s8 D_8019E3DD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019E3D8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019E3DD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019E3DC)) * 2) + D_8019E3D8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019E3DD = (unsigned char) p[1]; + D_8019E3DC = D_8019E3DC + 1; + if (D_8019E3DD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019E3DC = 0; + *base = 0; + } + } + else + { + D_8019E3DD = c - 1; + } + } + return; +} + + + +extern s32 D_8019E3FC; +extern s32 D_8019E3F0; +extern s32 D_8019E3F4; +extern s32 D_8019E400; + +void func_8013CABC(void) { + D_8019E3FC = 1; + D_8019E3F0 = 1; + D_8019E3F4 = 0; + D_8019E400 = 1; +} + + + +extern s32 D_8019E3F0; +extern s32 D_8019E3F4; +extern s32 D_8019E3F8; +extern s32 D_8019E3FC; +extern s32 D_8019E400; + +void func_8013CAE8(void) { + D_8019E3F0 = 1; + D_8019E3FC = 0; + D_8019E3F4 = 0; + D_8019E3F8 = -1; + D_8019E400 = 0; +} + + + +extern s32 D_8019E3FC; +extern s32 D_8019E400; +extern s32 D_8019E428; +extern s32 D_8019E42C; + +void func_8013CB20(void) +{ + D_8019E428 = D_8019E400; + D_8019E42C = D_8019E3FC; + D_8019E400 = 1; + D_8019E3FC = 0; +} + + + +extern s32 D_8019E428; +extern s32 D_8019E42C; +extern s32 D_8019E400; +extern s32 D_8019E3FC; + +void func_8013CB5C(void) { + D_8019E400 = D_8019E428; + D_8019E3FC = D_8019E42C; +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A0118; + extern u8 D_801A0119; + extern u8 D_801A011A; + extern u8 D_801A011B; + extern u8 D_801A011C; + extern u8 D_801A011D; + extern u8 D_801A011E; + extern u8 D_801A011F; + extern u8 D_801A0120; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A0118; t1 = D_801A0119; t2 = D_801A011A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A011B; t1 = D_801A011C; t2 = D_801A011D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A011E; t1 = D_801A011F; t2 = D_801A0120; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019E408; +extern s32 D_8019E3F0; +extern s32 D_8019E40C; +extern s32 D_8019E3FC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019E408 != 0) { + if (D_8019E408 != 2) { + if (((D_8019E408 < 3) && (D_8019E408 == 1)) && + (D_8019E40C = D_8019E40C + 1, 0x23a < D_8019E40C)) { + D_8019E3F0 = D_8019E408; + D_8019E408 = 2; + } + } else { + D_8019E3F0 = D_8019E3F0 + -1; + if (D_8019E3F0 == 0) { + D_8019E3F0 = D_8019E408; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019E3FC == 0) { + D_8019E408 = D_8019E408 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019E3FC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019E3FC; +} + + + +extern s32 D_8019E408; + +void func_8013D164(void) { + D_8019E408 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A01FA; +extern u8 D_801A026E; +extern u8 D_801A0122; +extern u8 D_801A01DC; +extern u8 D_801A0100; +extern u8 D_801A0121; +extern s32 D_801A01E0; + +void func_8013D330(void) { + if ((D_801A01FA & 0xff) != D_801A026E) { + D_801A01FA = ((D_801A01FA & 0xff) < D_801A026E) ? (D_801A01FA + 1) : (D_801A01FA - 1); + } + if ((D_801A0122 & 0xff) != D_801A01DC) { + D_801A0122 = ((D_801A0122 & 0xff) < D_801A01DC) ? (D_801A0122 + 1) : (D_801A0122 - 1); + } + if ((D_801A0100 & 0xff) != D_801A0121) { + D_801A0100 = ((D_801A0100 & 0xff) < D_801A0121) ? (D_801A0100 + 1) : (D_801A0100 - 1); + } + D_801A01E0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019E3E0; +extern void *D_8019E3E4; +extern void *D_8019E3E8; +extern s32 D_8019E410; +extern s32 D_8019E414; +extern s32 D_8019E418; +extern s32 D_801A0154[]; + +extern u8 D_801856D8[]; +extern u8 D_80185780[]; +extern u8 D_80185630[]; +extern u8 D_8018572C[]; +extern u8 D_801857AC[]; +extern u8 D_80185684[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019E410 = param_2; + D_8019E414 = (param_2 >> 2) & 3; + D_8019E418 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019E3E0 = D_801856D8; + D_8019E3E4 = D_80185780; + D_8019E3E8 = D_80185630; + } else { + D_8019E3E0 = D_8018572C; + D_8019E3E4 = D_801857AC; + D_8019E3E8 = D_80185684; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019E418 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019E410 & 2) != 0) { + D_801A0154[0] = 0x140; + D_801A0154[3] = 0x80; + if (p[0x37] == 4) { + D_801A0154[0] = 0x140; + D_801A0154[3] = 0; + } + if (p[0x37] == 0) { + D_801A0154[0] = 0x140; + D_801A0154[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019E3E8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019E3E8; +extern s16 *D_8019E3EC; +extern s32 D_8019E3FC; +extern s32 D_8019E41C; +extern s32 D_8019E420; +extern s32 D_8019E424; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019E3EC != 0) { + D_8019E3FC = 0; + p = (int *)(param_1 * 12 + (int)D_8019E3E8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019E41C != x) { + flag = 1; + if (D_8019E41C < x) { + if (x - D_8019E41C < 5) { + D_8019E41C = x; + } else { + D_8019E41C = D_8019E41C + 4; + } + } else { + if (D_8019E41C - x < 5) { + D_8019E41C = x; + } else { + D_8019E41C = D_8019E41C - 4; + } + } + } + if (D_8019E420 != y) { + flag = 1; + if (D_8019E420 < y) { + if (y - D_8019E420 < 5) { + D_8019E420 = y; + } else { + D_8019E420 = D_8019E420 + 4; + } + } else { + if (D_8019E420 - y < 5) { + D_8019E420 = y; + } else { + D_8019E420 = D_8019E420 - 4; + } + } + } + if (D_8019E424 != z) { + flag = 1; + if (D_8019E424 < z) { + if (z - D_8019E424 < 5) { + D_8019E424 = z; + } else { + D_8019E424 = D_8019E424 + 4; + } + } else { + if (D_8019E424 - z < 5) { + D_8019E424 = z; + } else { + D_8019E424 = D_8019E424 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019E3FC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018583C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019E3EC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019E41C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019E420); + uVar5 = (*(int*)&D_8019E424); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018583C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019E404; + +s32 func_8013E054(void) { + return D_8019E404; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186238; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80186210; +extern s16 D_80186212; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186238; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80186210 = 2; + D_80186212 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80186212 = 0; + D_80186210 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019E438; + extern void * D_8019E43C; + extern unsigned char D_80185EB0; + extern unsigned char D_80185EC8; + extern unsigned char D_80185F3C; + extern unsigned char D_80185F44; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019E438 = &D_80185EB0; + D_8019E43C = &D_80185F3C; + } else { + D_8019E438 = &D_80185EC8; + D_8019E43C = &D_80185F44; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186238/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186238 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186238)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186214; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186214)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186214)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80186210; +extern s16 D_80186212; +extern unsigned char D_80186214; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80186212` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80186210` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80186212; + if (*r < 3) { + *r = *r + 1; + } + D_80186210 = (u16)D_80186210 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186214); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186214; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186214); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_018/ov_SC06_018_jr_8012ACE0.c b/src/ov_SC06_018/ov_SC06_018_jr_8012ACE0.c index ba7f938be..bb370b110 100644 --- a/src/ov_SC06_018/ov_SC06_018_jr_8012ACE0.c +++ b/src/ov_SC06_018/ov_SC06_018_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80193BD8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80193BD8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80193C1C; -extern u8 D_80193C60; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80193C1C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80193C60 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80193CA4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80193CE0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80193CE0; - if (((s16)a1) < 0xC00) { - tbl = D_80193CA4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80193D1C, D_80193D1E, D_80193D20, D_80193D22, D_80193D24, D_80193D26; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80193D1E < ang)) goto outer_else; - if (!(ang < D_80193D24)) goto inner_else; - if (ang < D_80193D20) { *(s16 *)L = D_80193D20; goto done; } - if (D_80193D22 < ang) { *(s16 *)L = D_80193D22; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80193D1C) { *(s16 *)L = D_80193D1C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80193D26 < ang) { *(s16 *)L = D_80193D26; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801D3CC0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801D3CC0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801D3CC0; -extern s8 D_801D3CC4; -extern s8 D_801D3CC5; - -void func_8013C9C4(void * arg0) -{ - D_801D3CC0 = arg0; - D_801D3CC4 = 0; - D_801D3CC5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801D3CC0; -extern s8 D_801D3CC4; -extern s8 D_801D3CC5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801D3CC0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801D3CC5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801D3CC4)) * 2) + D_801D3CC0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801D3CC5 = (unsigned char) p[1]; - D_801D3CC4 = D_801D3CC4 + 1; - if (D_801D3CC5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801D3CC4 = 0; - *base = 0; - } - } - else - { - D_801D3CC5 = c - 1; - } - } - return; -} - - - -extern s32 D_801D3CE4; -extern s32 D_801D3CD8; -extern s32 D_801D3CDC; -extern s32 D_801D3CE8; - -void func_8013CABC(void) { - D_801D3CE4 = 1; - D_801D3CD8 = 1; - D_801D3CDC = 0; - D_801D3CE8 = 1; -} - - - -extern s32 D_801D3CD8; -extern s32 D_801D3CDC; -extern s32 D_801D3CE0; -extern s32 D_801D3CE4; -extern s32 D_801D3CE8; - -void func_8013CAE8(void) { - D_801D3CD8 = 1; - D_801D3CE4 = 0; - D_801D3CDC = 0; - D_801D3CE0 = -1; - D_801D3CE8 = 0; -} - - - -extern s32 D_801D3CE4; -extern s32 D_801D3CE8; -extern s32 D_801D3D10; -extern s32 D_801D3D14; - -void func_8013CB20(void) -{ - D_801D3D10 = D_801D3CE8; - D_801D3D14 = D_801D3CE4; - D_801D3CE8 = 1; - D_801D3CE4 = 0; -} - - - -extern s32 D_801D3D10; -extern s32 D_801D3D14; -extern s32 D_801D3CE8; -extern s32 D_801D3CE4; - -void func_8013CB5C(void) { - D_801D3CE8 = D_801D3D10; - D_801D3CE4 = D_801D3D14; -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D5A48; - extern u8 D_801D5A49; - extern u8 D_801D5A4A; - extern u8 D_801D5A4B; - extern u8 D_801D5A4C; - extern u8 D_801D5A4D; - extern u8 D_801D5A4E; - extern u8 D_801D5A4F; - extern u8 D_801D5A50; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D5A48; t1 = D_801D5A49; t2 = D_801D5A4A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D5A4B; t1 = D_801D5A4C; t2 = D_801D5A4D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D5A4E; t1 = D_801D5A4F; t2 = D_801D5A50; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801D3CF0; -extern s32 D_801D3CD8; -extern s32 D_801D3CF4; -extern s32 D_801D3CE4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801D3CF0 != 0) { - if (D_801D3CF0 != 2) { - if (((D_801D3CF0 < 3) && (D_801D3CF0 == 1)) && - (D_801D3CF4 = D_801D3CF4 + 1, 0x23a < D_801D3CF4)) { - D_801D3CD8 = D_801D3CF0; - D_801D3CF0 = 2; - } - } else { - D_801D3CD8 = D_801D3CD8 + -1; - if (D_801D3CD8 == 0) { - D_801D3CD8 = D_801D3CF0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801D3CE4 == 0) { - D_801D3CF0 = D_801D3CF0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801D3CE4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801D3CE4; -} - - - -extern s32 D_801D3CF0; - -void func_8013D164(void) { - D_801D3CF0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D5B2A; -extern u8 D_801D5B9E; -extern u8 D_801D5A52; -extern u8 D_801D5B0C; -extern u8 D_801D5A30; -extern u8 D_801D5A51; -extern s32 D_801D5B10; - -void func_8013D330(void) { - if ((D_801D5B2A & 0xff) != D_801D5B9E) { - D_801D5B2A = ((D_801D5B2A & 0xff) < D_801D5B9E) ? (D_801D5B2A + 1) : (D_801D5B2A - 1); - } - if ((D_801D5A52 & 0xff) != D_801D5B0C) { - D_801D5A52 = ((D_801D5A52 & 0xff) < D_801D5B0C) ? (D_801D5A52 + 1) : (D_801D5A52 - 1); - } - if ((D_801D5A30 & 0xff) != D_801D5A51) { - D_801D5A30 = ((D_801D5A30 & 0xff) < D_801D5A51) ? (D_801D5A30 + 1) : (D_801D5A30 - 1); - } - D_801D5B10 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801D3CC8; -extern void *D_801D3CCC; -extern void *D_801D3CD0; -extern s32 D_801D3CF8; -extern s32 D_801D3CFC; -extern s32 D_801D3D00; -extern s32 D_801D5A84[]; - -extern u8 D_80193E14[]; -extern u8 D_80193EBC[]; -extern u8 D_80193D6C[]; -extern u8 D_80193E68[]; -extern u8 D_80193EE8[]; -extern u8 D_80193DC0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801D3CF8 = param_2; - D_801D3CFC = (param_2 >> 2) & 3; - D_801D3D00 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801D3CC8 = D_80193E14; - D_801D3CCC = D_80193EBC; - D_801D3CD0 = D_80193D6C; - } else { - D_801D3CC8 = D_80193E68; - D_801D3CCC = D_80193EE8; - D_801D3CD0 = D_80193DC0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801D3D00 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801D3CF8 & 2) != 0) { - D_801D5A84[0] = 0x140; - D_801D5A84[3] = 0x80; - if (p[0x37] == 4) { - D_801D5A84[0] = 0x140; - D_801D5A84[3] = 0; - } - if (p[0x37] == 0) { - D_801D5A84[0] = 0x140; - D_801D5A84[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801D3CD0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801D3CD0; -extern s16 *D_801D3CD4; -extern s32 D_801D3CE4; -extern s32 D_801D3D04; -extern s32 D_801D3D08; -extern s32 D_801D3D0C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801D3CD4 != 0) { - D_801D3CE4 = 0; - p = (int *)(param_1 * 12 + (int)D_801D3CD0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801D3D04 != x) { - flag = 1; - if (D_801D3D04 < x) { - if (x - D_801D3D04 < 5) { - D_801D3D04 = x; - } else { - D_801D3D04 = D_801D3D04 + 4; - } - } else { - if (D_801D3D04 - x < 5) { - D_801D3D04 = x; - } else { - D_801D3D04 = D_801D3D04 - 4; - } - } - } - if (D_801D3D08 != y) { - flag = 1; - if (D_801D3D08 < y) { - if (y - D_801D3D08 < 5) { - D_801D3D08 = y; - } else { - D_801D3D08 = D_801D3D08 + 4; - } - } else { - if (D_801D3D08 - y < 5) { - D_801D3D08 = y; - } else { - D_801D3D08 = D_801D3D08 - 4; - } - } - } - if (D_801D3D0C != z) { - flag = 1; - if (D_801D3D0C < z) { - if (z - D_801D3D0C < 5) { - D_801D3D0C = z; - } else { - D_801D3D0C = D_801D3D0C + 4; - } - } else { - if (D_801D3D0C - z < 5) { - D_801D3D0C = z; - } else { - D_801D3D0C = D_801D3D0C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801D3CE4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80193F78[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801D3CD4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D3D04); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D3D08); - uVar5 = (*(int*)&D_801D3D0C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80193F78); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801D3CEC; - -s32 func_8013E054(void) { - return D_801D3CEC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80194974; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8019494C; -extern s16 D_8019494E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80194974; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8019494C = 2; - D_8019494E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8019494E = 0; - D_8019494C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801D3D20; - extern void * D_801D3D24; - extern unsigned char D_801945EC; - extern unsigned char D_80194604; - extern unsigned char D_80194678; - extern unsigned char D_80194680; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801D3D20 = &D_801945EC; - D_801D3D24 = &D_80194678; - } else { - D_801D3D20 = &D_80194604; - D_801D3D24 = &D_80194680; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80194974/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80194974 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80194974)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80194950; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80194950)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80194950)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8019494C; -extern s16 D_8019494E; -extern unsigned char D_80194950; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8019494E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8019494C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8019494E; - if (*r < 3) { - *r = *r + 1; - } - D_8019494C = (u16)D_8019494C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80194950); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80194950; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80194950); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_018/ov_SC06_018_jr_801380E0.c b/src/ov_SC06_018/ov_SC06_018_jr_801380E0.c new file mode 100644 index 000000000..4e6bbfc3f --- /dev/null +++ b/src/ov_SC06_018/ov_SC06_018_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801D2880; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8019386C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801D3BDC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D5B30; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801D2880; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801935A8)(); +extern s16 (*D_801935AC)(); +extern M2C_UNK (*D_801935B4)(); +extern s32 (*D_801935B8)(); +extern s32 D_801D3BD8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801D2884; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80193900; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80196DE4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80193918; +extern M2C_UNK D_80193920; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80193928; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80193944[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80193950[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80193964[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_801939B4[]; +extern s16 D_801939E4[]; +extern s16 D_80193A44[]; +extern s16 D_80193A4C[]; +extern s16 D_80193A6C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80193AA4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80193AFC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80193B44[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80193B4C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80193B54[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80193B5C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80193B04; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80193B24; +extern void func_801321B0(int param_1); +extern int D_80193B34; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801D3C48; +extern s32 D_801D3C4C[]; +extern int D_801D3C50; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80193B68; +extern u8 D_80193B64; +extern s16 *D_80193B6C; +extern u8 D_80193B70; +extern int D_801D3C48; +extern u16 D_801D3C58; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80193B6C; /* holds a pointer value (*(u16**)&D_80193B6C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80193B80[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80193BD4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80193BD8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80193BD8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80193C1C; +extern u8 D_80193C60; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80193C1C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80193C60 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80193CA4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80193CE0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80193CE0; + if (((s16)a1) < 0xC00) { + tbl = D_80193CA4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80193D1C, D_80193D1E, D_80193D20, D_80193D22, D_80193D24, D_80193D26; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80193D1E < ang)) goto outer_else; + if (!(ang < D_80193D24)) goto inner_else; + if (ang < D_80193D20) { *(s16 *)L = D_80193D20; goto done; } + if (D_80193D22 < ang) { *(s16 *)L = D_80193D22; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80193D1C) { *(s16 *)L = D_80193D1C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80193D26 < ang) { *(s16 *)L = D_80193D26; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801D3CC0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801D3CC0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801D3CC0; +extern s8 D_801D3CC4; +extern s8 D_801D3CC5; + +void func_8013C9C4(void * arg0) +{ + D_801D3CC0 = arg0; + D_801D3CC4 = 0; + D_801D3CC5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801D3CC0; +extern s8 D_801D3CC4; +extern s8 D_801D3CC5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801D3CC0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801D3CC5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801D3CC4)) * 2) + D_801D3CC0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801D3CC5 = (unsigned char) p[1]; + D_801D3CC4 = D_801D3CC4 + 1; + if (D_801D3CC5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801D3CC4 = 0; + *base = 0; + } + } + else + { + D_801D3CC5 = c - 1; + } + } + return; +} + + + +extern s32 D_801D3CE4; +extern s32 D_801D3CD8; +extern s32 D_801D3CDC; +extern s32 D_801D3CE8; + +void func_8013CABC(void) { + D_801D3CE4 = 1; + D_801D3CD8 = 1; + D_801D3CDC = 0; + D_801D3CE8 = 1; +} + + + +extern s32 D_801D3CD8; +extern s32 D_801D3CDC; +extern s32 D_801D3CE0; +extern s32 D_801D3CE4; +extern s32 D_801D3CE8; + +void func_8013CAE8(void) { + D_801D3CD8 = 1; + D_801D3CE4 = 0; + D_801D3CDC = 0; + D_801D3CE0 = -1; + D_801D3CE8 = 0; +} + + + +extern s32 D_801D3CE4; +extern s32 D_801D3CE8; +extern s32 D_801D3D10; +extern s32 D_801D3D14; + +void func_8013CB20(void) +{ + D_801D3D10 = D_801D3CE8; + D_801D3D14 = D_801D3CE4; + D_801D3CE8 = 1; + D_801D3CE4 = 0; +} + + + +extern s32 D_801D3D10; +extern s32 D_801D3D14; +extern s32 D_801D3CE8; +extern s32 D_801D3CE4; + +void func_8013CB5C(void) { + D_801D3CE8 = D_801D3D10; + D_801D3CE4 = D_801D3D14; +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D5A48; + extern u8 D_801D5A49; + extern u8 D_801D5A4A; + extern u8 D_801D5A4B; + extern u8 D_801D5A4C; + extern u8 D_801D5A4D; + extern u8 D_801D5A4E; + extern u8 D_801D5A4F; + extern u8 D_801D5A50; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D5A48; t1 = D_801D5A49; t2 = D_801D5A4A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D5A4B; t1 = D_801D5A4C; t2 = D_801D5A4D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D5A4E; t1 = D_801D5A4F; t2 = D_801D5A50; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801D3CF0; +extern s32 D_801D3CD8; +extern s32 D_801D3CF4; +extern s32 D_801D3CE4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801D3CF0 != 0) { + if (D_801D3CF0 != 2) { + if (((D_801D3CF0 < 3) && (D_801D3CF0 == 1)) && + (D_801D3CF4 = D_801D3CF4 + 1, 0x23a < D_801D3CF4)) { + D_801D3CD8 = D_801D3CF0; + D_801D3CF0 = 2; + } + } else { + D_801D3CD8 = D_801D3CD8 + -1; + if (D_801D3CD8 == 0) { + D_801D3CD8 = D_801D3CF0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801D3CE4 == 0) { + D_801D3CF0 = D_801D3CF0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801D3CE4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801D3CE4; +} + + + +extern s32 D_801D3CF0; + +void func_8013D164(void) { + D_801D3CF0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D5B2A; +extern u8 D_801D5B9E; +extern u8 D_801D5A52; +extern u8 D_801D5B0C; +extern u8 D_801D5A30; +extern u8 D_801D5A51; +extern s32 D_801D5B10; + +void func_8013D330(void) { + if ((D_801D5B2A & 0xff) != D_801D5B9E) { + D_801D5B2A = ((D_801D5B2A & 0xff) < D_801D5B9E) ? (D_801D5B2A + 1) : (D_801D5B2A - 1); + } + if ((D_801D5A52 & 0xff) != D_801D5B0C) { + D_801D5A52 = ((D_801D5A52 & 0xff) < D_801D5B0C) ? (D_801D5A52 + 1) : (D_801D5A52 - 1); + } + if ((D_801D5A30 & 0xff) != D_801D5A51) { + D_801D5A30 = ((D_801D5A30 & 0xff) < D_801D5A51) ? (D_801D5A30 + 1) : (D_801D5A30 - 1); + } + D_801D5B10 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801D3CC8; +extern void *D_801D3CCC; +extern void *D_801D3CD0; +extern s32 D_801D3CF8; +extern s32 D_801D3CFC; +extern s32 D_801D3D00; +extern s32 D_801D5A84[]; + +extern u8 D_80193E14[]; +extern u8 D_80193EBC[]; +extern u8 D_80193D6C[]; +extern u8 D_80193E68[]; +extern u8 D_80193EE8[]; +extern u8 D_80193DC0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801D3CF8 = param_2; + D_801D3CFC = (param_2 >> 2) & 3; + D_801D3D00 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801D3CC8 = D_80193E14; + D_801D3CCC = D_80193EBC; + D_801D3CD0 = D_80193D6C; + } else { + D_801D3CC8 = D_80193E68; + D_801D3CCC = D_80193EE8; + D_801D3CD0 = D_80193DC0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801D3D00 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801D3CF8 & 2) != 0) { + D_801D5A84[0] = 0x140; + D_801D5A84[3] = 0x80; + if (p[0x37] == 4) { + D_801D5A84[0] = 0x140; + D_801D5A84[3] = 0; + } + if (p[0x37] == 0) { + D_801D5A84[0] = 0x140; + D_801D5A84[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801D3CD0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801D3CD0; +extern s16 *D_801D3CD4; +extern s32 D_801D3CE4; +extern s32 D_801D3D04; +extern s32 D_801D3D08; +extern s32 D_801D3D0C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801D3CD4 != 0) { + D_801D3CE4 = 0; + p = (int *)(param_1 * 12 + (int)D_801D3CD0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801D3D04 != x) { + flag = 1; + if (D_801D3D04 < x) { + if (x - D_801D3D04 < 5) { + D_801D3D04 = x; + } else { + D_801D3D04 = D_801D3D04 + 4; + } + } else { + if (D_801D3D04 - x < 5) { + D_801D3D04 = x; + } else { + D_801D3D04 = D_801D3D04 - 4; + } + } + } + if (D_801D3D08 != y) { + flag = 1; + if (D_801D3D08 < y) { + if (y - D_801D3D08 < 5) { + D_801D3D08 = y; + } else { + D_801D3D08 = D_801D3D08 + 4; + } + } else { + if (D_801D3D08 - y < 5) { + D_801D3D08 = y; + } else { + D_801D3D08 = D_801D3D08 - 4; + } + } + } + if (D_801D3D0C != z) { + flag = 1; + if (D_801D3D0C < z) { + if (z - D_801D3D0C < 5) { + D_801D3D0C = z; + } else { + D_801D3D0C = D_801D3D0C + 4; + } + } else { + if (D_801D3D0C - z < 5) { + D_801D3D0C = z; + } else { + D_801D3D0C = D_801D3D0C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801D3CE4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80193F78[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801D3CD4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801D3D04); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801D3D08); + uVar5 = (*(int*)&D_801D3D0C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80193F78); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801D3CEC; + +s32 func_8013E054(void) { + return D_801D3CEC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80194974; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8019494C; +extern s16 D_8019494E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80194974; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8019494C = 2; + D_8019494E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8019494E = 0; + D_8019494C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801D3D20; + extern void * D_801D3D24; + extern unsigned char D_801945EC; + extern unsigned char D_80194604; + extern unsigned char D_80194678; + extern unsigned char D_80194680; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801D3D20 = &D_801945EC; + D_801D3D24 = &D_80194678; + } else { + D_801D3D20 = &D_80194604; + D_801D3D24 = &D_80194680; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80194974/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80194974 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80194974)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80194950; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80194950)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80194950)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8019494C; +extern s16 D_8019494E; +extern unsigned char D_80194950; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8019494E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8019494C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8019494E; + if (*r < 3) { + *r = *r + 1; + } + D_8019494C = (u16)D_8019494C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80194950); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80194950; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80194950); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_020/ov_SC06_020_jr_8012ACE0.c b/src/ov_SC06_020/ov_SC06_020_jr_8012ACE0.c index 292ee3166..f274a0694 100644 --- a/src/ov_SC06_020/ov_SC06_020_jr_8012ACE0.c +++ b/src/ov_SC06_020/ov_SC06_020_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185660[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185660[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801856A4; -extern u8 D_801856E8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801856A4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801856E8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018572C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80185768[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80185768; - if (((s16)a1) < 0xC00) { - tbl = D_8018572C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801857A4, D_801857A6, D_801857A8, D_801857AA, D_801857AC, D_801857AE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801857A6 < ang)) goto outer_else; - if (!(ang < D_801857AC)) goto inner_else; - if (ang < D_801857A8) { *(s16 *)L = D_801857A8; goto done; } - if (D_801857AA < ang) { *(s16 *)L = D_801857AA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801857A4) { *(s16 *)L = D_801857A4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801857AE < ang) { *(s16 *)L = D_801857AE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B94D8; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B94D8, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B94D8; -extern s8 D_801B94DC; -extern s8 D_801B94DD; - -void func_8013C9C4(void * arg0) -{ - D_801B94D8 = arg0; - D_801B94DC = 0; - D_801B94DD = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B94D8; -extern s8 D_801B94DC; -extern s8 D_801B94DD; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B94D8; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B94DD; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B94DC)) * 2) + D_801B94D8); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B94DD = (unsigned char) p[1]; - D_801B94DC = D_801B94DC + 1; - if (D_801B94DD == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B94DC = 0; - *base = 0; - } - } - else - { - D_801B94DD = c - 1; - } - } - return; -} - - - -extern s32 D_801B94FC; -extern s32 D_801B94F0; -extern s32 D_801B94F4; -extern s32 D_801B9500; - -void func_8013CABC(void) { - D_801B94FC = 1; - D_801B94F0 = 1; - D_801B94F4 = 0; - D_801B9500 = 1; -} - - - -extern s32 D_801B94F0; -extern s32 D_801B94F4; -extern s32 D_801B94F8; -extern s32 D_801B94FC; -extern s32 D_801B9500; - -void func_8013CAE8(void) { - D_801B94F0 = 1; - D_801B94FC = 0; - D_801B94F4 = 0; - D_801B94F8 = -1; - D_801B9500 = 0; -} - - - -extern s32 D_801B94FC; -extern s32 D_801B9500; -extern s32 D_801B9528; -extern s32 D_801B952C; - -void func_8013CB20(void) -{ - D_801B9528 = D_801B9500; - D_801B952C = D_801B94FC; - D_801B9500 = 1; - D_801B94FC = 0; -} - - - -extern s32 D_801B9528; -extern s32 D_801B952C; -extern s32 D_801B9500; -extern s32 D_801B94FC; - -void func_8013CB5C(void) { - D_801B9500 = D_801B9528; - D_801B94FC = D_801B952C; -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801BA898; - extern u8 D_801BA899; - extern u8 D_801BA89A; - extern u8 D_801BA89B; - extern u8 D_801BA89C; - extern u8 D_801BA89D; - extern u8 D_801BA89E; - extern u8 D_801BA89F; - extern u8 D_801BA8A0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801BA898; t1 = D_801BA899; t2 = D_801BA89A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801BA89B; t1 = D_801BA89C; t2 = D_801BA89D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801BA89E; t1 = D_801BA89F; t2 = D_801BA8A0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B9508; -extern s32 D_801B94F0; -extern s32 D_801B950C; -extern s32 D_801B94FC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B9508 != 0) { - if (D_801B9508 != 2) { - if (((D_801B9508 < 3) && (D_801B9508 == 1)) && - (D_801B950C = D_801B950C + 1, 0x23a < D_801B950C)) { - D_801B94F0 = D_801B9508; - D_801B9508 = 2; - } - } else { - D_801B94F0 = D_801B94F0 + -1; - if (D_801B94F0 == 0) { - D_801B94F0 = D_801B9508; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B94FC == 0) { - D_801B9508 = D_801B9508 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B94FC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B94FC; -} - - - -extern s32 D_801B9508; - -void func_8013D164(void) { - D_801B9508 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801BA97A; -extern u8 D_801BA9EE; -extern u8 D_801BA8A2; -extern u8 D_801BA95C; -extern u8 D_801BA880; -extern u8 D_801BA8A1; -extern s32 D_801BA960; - -void func_8013D330(void) { - if ((D_801BA97A & 0xff) != D_801BA9EE) { - D_801BA97A = ((D_801BA97A & 0xff) < D_801BA9EE) ? (D_801BA97A + 1) : (D_801BA97A - 1); - } - if ((D_801BA8A2 & 0xff) != D_801BA95C) { - D_801BA8A2 = ((D_801BA8A2 & 0xff) < D_801BA95C) ? (D_801BA8A2 + 1) : (D_801BA8A2 - 1); - } - if ((D_801BA880 & 0xff) != D_801BA8A1) { - D_801BA880 = ((D_801BA880 & 0xff) < D_801BA8A1) ? (D_801BA880 + 1) : (D_801BA880 - 1); - } - D_801BA960 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B94E0; -extern void *D_801B94E4; -extern void *D_801B94E8; -extern s32 D_801B9510; -extern s32 D_801B9514; -extern s32 D_801B9518; -extern s32 D_801BA8D4[]; - -extern u8 D_8018589C[]; -extern u8 D_80185944[]; -extern u8 D_801857F4[]; -extern u8 D_801858F0[]; -extern u8 D_80185970[]; -extern u8 D_80185848[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B9510 = param_2; - D_801B9514 = (param_2 >> 2) & 3; - D_801B9518 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B94E0 = D_8018589C; - D_801B94E4 = D_80185944; - D_801B94E8 = D_801857F4; - } else { - D_801B94E0 = D_801858F0; - D_801B94E4 = D_80185970; - D_801B94E8 = D_80185848; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B9518 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B9510 & 2) != 0) { - D_801BA8D4[0] = 0x140; - D_801BA8D4[3] = 0x80; - if (p[0x37] == 4) { - D_801BA8D4[0] = 0x140; - D_801BA8D4[3] = 0; - } - if (p[0x37] == 0) { - D_801BA8D4[0] = 0x140; - D_801BA8D4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B94E8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B94E8; -extern s16 *D_801B94EC; -extern s32 D_801B94FC; -extern s32 D_801B951C; -extern s32 D_801B9520; -extern s32 D_801B9524; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B94EC != 0) { - D_801B94FC = 0; - p = (int *)(param_1 * 12 + (int)D_801B94E8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B951C != x) { - flag = 1; - if (D_801B951C < x) { - if (x - D_801B951C < 5) { - D_801B951C = x; - } else { - D_801B951C = D_801B951C + 4; - } - } else { - if (D_801B951C - x < 5) { - D_801B951C = x; - } else { - D_801B951C = D_801B951C - 4; - } - } - } - if (D_801B9520 != y) { - flag = 1; - if (D_801B9520 < y) { - if (y - D_801B9520 < 5) { - D_801B9520 = y; - } else { - D_801B9520 = D_801B9520 + 4; - } - } else { - if (D_801B9520 - y < 5) { - D_801B9520 = y; - } else { - D_801B9520 = D_801B9520 - 4; - } - } - } - if (D_801B9524 != z) { - flag = 1; - if (D_801B9524 < z) { - if (z - D_801B9524 < 5) { - D_801B9524 = z; - } else { - D_801B9524 = D_801B9524 + 4; - } - } else { - if (D_801B9524 - z < 5) { - D_801B9524 = z; - } else { - D_801B9524 = D_801B9524 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B94FC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185A00[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B94EC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B951C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B9520); - uVar5 = (*(int*)&D_801B9524); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185A00); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B9504; - -s32 func_8013E054(void) { - return D_801B9504; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801863FC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801863D4; -extern s16 D_801863D6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801863FC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801863D4 = 2; - D_801863D6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801863D6 = 0; - D_801863D4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B9538; - extern void * D_801B953C; - extern unsigned char D_80186074; - extern unsigned char D_8018608C; - extern unsigned char D_80186100; - extern unsigned char D_80186108; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B9538 = &D_80186074; - D_801B953C = &D_80186100; - } else { - D_801B9538 = &D_8018608C; - D_801B953C = &D_80186108; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801863FC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801863FC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801863FC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801863D8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801863D8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801863D8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801863D4; -extern s16 D_801863D6; -extern unsigned char D_801863D8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801863D6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801863D4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801863D6; - if (*r < 3) { - *r = *r + 1; - } - D_801863D4 = (u16)D_801863D4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801863D8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801863D8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801863D8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_020/ov_SC06_020_jr_801380E0.c b/src/ov_SC06_020/ov_SC06_020_jr_801380E0.c new file mode 100644 index 000000000..bb33c01f1 --- /dev/null +++ b/src/ov_SC06_020/ov_SC06_020_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B8168; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801852F4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B93F4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801BA980; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B8168; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80185030)(); +extern s16 (*D_80185034)(); +extern M2C_UNK (*D_8018503C)(); +extern s32 (*D_80185040)(); +extern s32 D_801B93F0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B816C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80185388; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018886C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801853A0; +extern M2C_UNK D_801853A8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801853B0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801853CC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801853D8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801853EC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018543C[]; +extern s16 D_8018546C[]; +extern s16 D_801854CC[]; +extern s16 D_801854D4[]; +extern s16 D_801854F4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018552C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80185584[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801855CC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801855D4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801855DC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801855E4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018558C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801855AC; +extern void func_801321B0(int param_1); +extern int D_801855BC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B9460; +extern s32 D_801B9464[]; +extern int D_801B9468; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801855F0; +extern u8 D_801855EC; +extern s16 *D_801855F4; +extern u8 D_801855F8; +extern int D_801B9460; +extern u16 D_801B9470; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801855F4; /* holds a pointer value (*(u16**)&D_801855F4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185608[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018565C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185660[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185660[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801856A4; +extern u8 D_801856E8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801856A4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801856E8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018572C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80185768[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80185768; + if (((s16)a1) < 0xC00) { + tbl = D_8018572C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801857A4, D_801857A6, D_801857A8, D_801857AA, D_801857AC, D_801857AE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801857A6 < ang)) goto outer_else; + if (!(ang < D_801857AC)) goto inner_else; + if (ang < D_801857A8) { *(s16 *)L = D_801857A8; goto done; } + if (D_801857AA < ang) { *(s16 *)L = D_801857AA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801857A4) { *(s16 *)L = D_801857A4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801857AE < ang) { *(s16 *)L = D_801857AE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B94D8; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B94D8, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B94D8; +extern s8 D_801B94DC; +extern s8 D_801B94DD; + +void func_8013C9C4(void * arg0) +{ + D_801B94D8 = arg0; + D_801B94DC = 0; + D_801B94DD = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B94D8; +extern s8 D_801B94DC; +extern s8 D_801B94DD; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B94D8; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B94DD; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B94DC)) * 2) + D_801B94D8); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B94DD = (unsigned char) p[1]; + D_801B94DC = D_801B94DC + 1; + if (D_801B94DD == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B94DC = 0; + *base = 0; + } + } + else + { + D_801B94DD = c - 1; + } + } + return; +} + + + +extern s32 D_801B94FC; +extern s32 D_801B94F0; +extern s32 D_801B94F4; +extern s32 D_801B9500; + +void func_8013CABC(void) { + D_801B94FC = 1; + D_801B94F0 = 1; + D_801B94F4 = 0; + D_801B9500 = 1; +} + + + +extern s32 D_801B94F0; +extern s32 D_801B94F4; +extern s32 D_801B94F8; +extern s32 D_801B94FC; +extern s32 D_801B9500; + +void func_8013CAE8(void) { + D_801B94F0 = 1; + D_801B94FC = 0; + D_801B94F4 = 0; + D_801B94F8 = -1; + D_801B9500 = 0; +} + + + +extern s32 D_801B94FC; +extern s32 D_801B9500; +extern s32 D_801B9528; +extern s32 D_801B952C; + +void func_8013CB20(void) +{ + D_801B9528 = D_801B9500; + D_801B952C = D_801B94FC; + D_801B9500 = 1; + D_801B94FC = 0; +} + + + +extern s32 D_801B9528; +extern s32 D_801B952C; +extern s32 D_801B9500; +extern s32 D_801B94FC; + +void func_8013CB5C(void) { + D_801B9500 = D_801B9528; + D_801B94FC = D_801B952C; +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801BA898; + extern u8 D_801BA899; + extern u8 D_801BA89A; + extern u8 D_801BA89B; + extern u8 D_801BA89C; + extern u8 D_801BA89D; + extern u8 D_801BA89E; + extern u8 D_801BA89F; + extern u8 D_801BA8A0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801BA898; t1 = D_801BA899; t2 = D_801BA89A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801BA89B; t1 = D_801BA89C; t2 = D_801BA89D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801BA89E; t1 = D_801BA89F; t2 = D_801BA8A0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B9508; +extern s32 D_801B94F0; +extern s32 D_801B950C; +extern s32 D_801B94FC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B9508 != 0) { + if (D_801B9508 != 2) { + if (((D_801B9508 < 3) && (D_801B9508 == 1)) && + (D_801B950C = D_801B950C + 1, 0x23a < D_801B950C)) { + D_801B94F0 = D_801B9508; + D_801B9508 = 2; + } + } else { + D_801B94F0 = D_801B94F0 + -1; + if (D_801B94F0 == 0) { + D_801B94F0 = D_801B9508; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B94FC == 0) { + D_801B9508 = D_801B9508 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B94FC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B94FC; +} + + + +extern s32 D_801B9508; + +void func_8013D164(void) { + D_801B9508 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801BA97A; +extern u8 D_801BA9EE; +extern u8 D_801BA8A2; +extern u8 D_801BA95C; +extern u8 D_801BA880; +extern u8 D_801BA8A1; +extern s32 D_801BA960; + +void func_8013D330(void) { + if ((D_801BA97A & 0xff) != D_801BA9EE) { + D_801BA97A = ((D_801BA97A & 0xff) < D_801BA9EE) ? (D_801BA97A + 1) : (D_801BA97A - 1); + } + if ((D_801BA8A2 & 0xff) != D_801BA95C) { + D_801BA8A2 = ((D_801BA8A2 & 0xff) < D_801BA95C) ? (D_801BA8A2 + 1) : (D_801BA8A2 - 1); + } + if ((D_801BA880 & 0xff) != D_801BA8A1) { + D_801BA880 = ((D_801BA880 & 0xff) < D_801BA8A1) ? (D_801BA880 + 1) : (D_801BA880 - 1); + } + D_801BA960 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B94E0; +extern void *D_801B94E4; +extern void *D_801B94E8; +extern s32 D_801B9510; +extern s32 D_801B9514; +extern s32 D_801B9518; +extern s32 D_801BA8D4[]; + +extern u8 D_8018589C[]; +extern u8 D_80185944[]; +extern u8 D_801857F4[]; +extern u8 D_801858F0[]; +extern u8 D_80185970[]; +extern u8 D_80185848[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B9510 = param_2; + D_801B9514 = (param_2 >> 2) & 3; + D_801B9518 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B94E0 = D_8018589C; + D_801B94E4 = D_80185944; + D_801B94E8 = D_801857F4; + } else { + D_801B94E0 = D_801858F0; + D_801B94E4 = D_80185970; + D_801B94E8 = D_80185848; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B9518 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B9510 & 2) != 0) { + D_801BA8D4[0] = 0x140; + D_801BA8D4[3] = 0x80; + if (p[0x37] == 4) { + D_801BA8D4[0] = 0x140; + D_801BA8D4[3] = 0; + } + if (p[0x37] == 0) { + D_801BA8D4[0] = 0x140; + D_801BA8D4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B94E8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B94E8; +extern s16 *D_801B94EC; +extern s32 D_801B94FC; +extern s32 D_801B951C; +extern s32 D_801B9520; +extern s32 D_801B9524; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B94EC != 0) { + D_801B94FC = 0; + p = (int *)(param_1 * 12 + (int)D_801B94E8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B951C != x) { + flag = 1; + if (D_801B951C < x) { + if (x - D_801B951C < 5) { + D_801B951C = x; + } else { + D_801B951C = D_801B951C + 4; + } + } else { + if (D_801B951C - x < 5) { + D_801B951C = x; + } else { + D_801B951C = D_801B951C - 4; + } + } + } + if (D_801B9520 != y) { + flag = 1; + if (D_801B9520 < y) { + if (y - D_801B9520 < 5) { + D_801B9520 = y; + } else { + D_801B9520 = D_801B9520 + 4; + } + } else { + if (D_801B9520 - y < 5) { + D_801B9520 = y; + } else { + D_801B9520 = D_801B9520 - 4; + } + } + } + if (D_801B9524 != z) { + flag = 1; + if (D_801B9524 < z) { + if (z - D_801B9524 < 5) { + D_801B9524 = z; + } else { + D_801B9524 = D_801B9524 + 4; + } + } else { + if (D_801B9524 - z < 5) { + D_801B9524 = z; + } else { + D_801B9524 = D_801B9524 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B94FC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185A00[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B94EC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B951C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B9520); + uVar5 = (*(int*)&D_801B9524); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185A00); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B9504; + +s32 func_8013E054(void) { + return D_801B9504; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801863FC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801863D4; +extern s16 D_801863D6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801863FC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801863D4 = 2; + D_801863D6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801863D6 = 0; + D_801863D4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B9538; + extern void * D_801B953C; + extern unsigned char D_80186074; + extern unsigned char D_8018608C; + extern unsigned char D_80186100; + extern unsigned char D_80186108; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B9538 = &D_80186074; + D_801B953C = &D_80186100; + } else { + D_801B9538 = &D_8018608C; + D_801B953C = &D_80186108; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801863FC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801863FC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801863FC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801863D8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801863D8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801863D8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801863D4; +extern s16 D_801863D6; +extern unsigned char D_801863D8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801863D6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801863D4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801863D6; + if (*r < 3) { + *r = *r + 1; + } + D_801863D4 = (u16)D_801863D4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801863D8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801863D8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801863D8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_022/ov_SC06_022_jr_8012ACE0.c b/src/ov_SC06_022/ov_SC06_022_jr_8012ACE0.c index bc05e576f..80acaa5f9 100644 --- a/src/ov_SC06_022/ov_SC06_022_jr_8012ACE0.c +++ b/src/ov_SC06_022/ov_SC06_022_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018D91C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018D91C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018D960; -extern u8 D_8018D9A4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018D960; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018D9A4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018D9E8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018DA24[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018DA24; - if (((s16)a1) < 0xC00) { - tbl = D_8018D9E8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018DA60, D_8018DA62, D_8018DA64, D_8018DA66, D_8018DA68, D_8018DA6A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018DA62 < ang)) goto outer_else; - if (!(ang < D_8018DA68)) goto inner_else; - if (ang < D_8018DA64) { *(s16 *)L = D_8018DA64; goto done; } - if (D_8018DA66 < ang) { *(s16 *)L = D_8018DA66; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018DA60) { *(s16 *)L = D_8018DA60; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018DA6A < ang) { *(s16 *)L = D_8018DA6A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801E0D40; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801E0D40, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801E0D40; -extern s8 D_801E0D44; -extern s8 D_801E0D45; - -void func_8013C9C4(void * arg0) -{ - D_801E0D40 = arg0; - D_801E0D44 = 0; - D_801E0D45 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801E0D40; -extern s8 D_801E0D44; -extern s8 D_801E0D45; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801E0D40; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801E0D45; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801E0D44)) * 2) + D_801E0D40); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801E0D45 = (unsigned char) p[1]; - D_801E0D44 = D_801E0D44 + 1; - if (D_801E0D45 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801E0D44 = 0; - *base = 0; - } - } - else - { - D_801E0D45 = c - 1; - } - } - return; -} - - - -extern s32 D_801E0D64; -extern s32 D_801E0D58; -extern s32 D_801E0D5C; -extern s32 D_801E0D68; - -void func_8013CABC(void) { - D_801E0D64 = 1; - D_801E0D58 = 1; - D_801E0D5C = 0; - D_801E0D68 = 1; -} - - - -extern s32 D_801E0D58; -extern s32 D_801E0D5C; -extern s32 D_801E0D60; -extern s32 D_801E0D64; -extern s32 D_801E0D68; - -void func_8013CAE8(void) { - D_801E0D58 = 1; - D_801E0D64 = 0; - D_801E0D5C = 0; - D_801E0D60 = -1; - D_801E0D68 = 0; -} - - - -extern s32 D_801E0D64; -extern s32 D_801E0D68; -extern s32 D_801E0D90; -extern s32 D_801E0D94; - -void func_8013CB20(void) -{ - D_801E0D90 = D_801E0D68; - D_801E0D94 = D_801E0D64; - D_801E0D68 = 1; - D_801E0D64 = 0; -} - - - -extern s32 D_801E0D90; -extern s32 D_801E0D94; -extern s32 D_801E0D68; -extern s32 D_801E0D64; - -void func_8013CB5C(void) { - D_801E0D68 = D_801E0D90; - D_801E0D64 = D_801E0D94; -} - - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E2118; - extern u8 D_801E2119; - extern u8 D_801E211A; - extern u8 D_801E211B; - extern u8 D_801E211C; - extern u8 D_801E211D; - extern u8 D_801E211E; - extern u8 D_801E211F; - extern u8 D_801E2120; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E2118; t1 = D_801E2119; t2 = D_801E211A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E211B; t1 = D_801E211C; t2 = D_801E211D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E211E; t1 = D_801E211F; t2 = D_801E2120; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801E0D70; -extern s32 D_801E0D58; -extern s32 D_801E0D74; -extern s32 D_801E0D64; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801E0D70 != 0) { - if (D_801E0D70 != 2) { - if (((D_801E0D70 < 3) && (D_801E0D70 == 1)) && - (D_801E0D74 = D_801E0D74 + 1, 0x23a < D_801E0D74)) { - D_801E0D58 = D_801E0D70; - D_801E0D70 = 2; - } - } else { - D_801E0D58 = D_801E0D58 + -1; - if (D_801E0D58 == 0) { - D_801E0D58 = D_801E0D70; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801E0D64 == 0) { - D_801E0D70 = D_801E0D70 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801E0D64; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801E0D64; -} - - - -extern s32 D_801E0D70; - -void func_8013D164(void) { - D_801E0D70 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E21FA; -extern u8 D_801E226E; -extern u8 D_801E2122; -extern u8 D_801E21DC; -extern u8 D_801E2100; -extern u8 D_801E2121; -extern s32 D_801E21E0; - -void func_8013D330(void) { - if ((D_801E21FA & 0xff) != D_801E226E) { - D_801E21FA = ((D_801E21FA & 0xff) < D_801E226E) ? (D_801E21FA + 1) : (D_801E21FA - 1); - } - if ((D_801E2122 & 0xff) != D_801E21DC) { - D_801E2122 = ((D_801E2122 & 0xff) < D_801E21DC) ? (D_801E2122 + 1) : (D_801E2122 - 1); - } - if ((D_801E2100 & 0xff) != D_801E2121) { - D_801E2100 = ((D_801E2100 & 0xff) < D_801E2121) ? (D_801E2100 + 1) : (D_801E2100 - 1); - } - D_801E21E0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801E0D48; -extern void *D_801E0D4C; -extern void *D_801E0D50; -extern s32 D_801E0D78; -extern s32 D_801E0D7C; -extern s32 D_801E0D80; -extern s32 D_801E2154[]; - -extern u8 D_8018DB58[]; -extern u8 D_8018DC00[]; -extern u8 D_8018DAB0[]; -extern u8 D_8018DBAC[]; -extern u8 D_8018DC2C[]; -extern u8 D_8018DB04[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801E0D78 = param_2; - D_801E0D7C = (param_2 >> 2) & 3; - D_801E0D80 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801E0D48 = D_8018DB58; - D_801E0D4C = D_8018DC00; - D_801E0D50 = D_8018DAB0; - } else { - D_801E0D48 = D_8018DBAC; - D_801E0D4C = D_8018DC2C; - D_801E0D50 = D_8018DB04; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801E0D80 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801E0D78 & 2) != 0) { - D_801E2154[0] = 0x140; - D_801E2154[3] = 0x80; - if (p[0x37] == 4) { - D_801E2154[0] = 0x140; - D_801E2154[3] = 0; - } - if (p[0x37] == 0) { - D_801E2154[0] = 0x140; - D_801E2154[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801E0D50)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801E0D50; -extern s16 *D_801E0D54; -extern s32 D_801E0D64; -extern s32 D_801E0D84; -extern s32 D_801E0D88; -extern s32 D_801E0D8C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801E0D54 != 0) { - D_801E0D64 = 0; - p = (int *)(param_1 * 12 + (int)D_801E0D50); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801E0D84 != x) { - flag = 1; - if (D_801E0D84 < x) { - if (x - D_801E0D84 < 5) { - D_801E0D84 = x; - } else { - D_801E0D84 = D_801E0D84 + 4; - } - } else { - if (D_801E0D84 - x < 5) { - D_801E0D84 = x; - } else { - D_801E0D84 = D_801E0D84 - 4; - } - } - } - if (D_801E0D88 != y) { - flag = 1; - if (D_801E0D88 < y) { - if (y - D_801E0D88 < 5) { - D_801E0D88 = y; - } else { - D_801E0D88 = D_801E0D88 + 4; - } - } else { - if (D_801E0D88 - y < 5) { - D_801E0D88 = y; - } else { - D_801E0D88 = D_801E0D88 - 4; - } - } - } - if (D_801E0D8C != z) { - flag = 1; - if (D_801E0D8C < z) { - if (z - D_801E0D8C < 5) { - D_801E0D8C = z; - } else { - D_801E0D8C = D_801E0D8C + 4; - } - } else { - if (D_801E0D8C - z < 5) { - D_801E0D8C = z; - } else { - D_801E0D8C = D_801E0D8C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801E0D64 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018DCBC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801E0D54); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E0D84); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E0D88); - uVar5 = (*(int*)&D_801E0D8C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018DCBC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801E0D6C; - -s32 func_8013E054(void) { - return D_801E0D6C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018E6B8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018E690; -extern s16 D_8018E692; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018E6B8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018E690 = 2; - D_8018E692 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018E692 = 0; - D_8018E690 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801E0DA0; - extern void * D_801E0DA4; - extern unsigned char D_8018E330; - extern unsigned char D_8018E348; - extern unsigned char D_8018E3BC; - extern unsigned char D_8018E3C4; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801E0DA0 = &D_8018E330; - D_801E0DA4 = &D_8018E3BC; - } else { - D_801E0DA0 = &D_8018E348; - D_801E0DA4 = &D_8018E3C4; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018E6B8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E6B8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018E6B8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018E694; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E694)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E694)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018E690; -extern s16 D_8018E692; -extern unsigned char D_8018E694; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E692` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018E690` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018E692; - if (*r < 3) { - *r = *r + 1; - } - D_8018E690 = (u16)D_8018E690 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E694); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018E694; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E694); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_022/ov_SC06_022_jr_801380E0.c b/src/ov_SC06_022/ov_SC06_022_jr_801380E0.c new file mode 100644 index 000000000..4e3300180 --- /dev/null +++ b/src/ov_SC06_022/ov_SC06_022_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801DF978; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018D5B0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801E0C5C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E2200; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801DF978; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018D2EC)(); +extern s16 (*D_8018D2F0)(); +extern M2C_UNK (*D_8018D2F8)(); +extern s32 (*D_8018D2FC)(); +extern s32 D_801E0C58; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801DF97C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018D644; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80190B28; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018D65C; +extern M2C_UNK D_8018D664; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018D66C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018D688[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018D694[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018D6A8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018D6F8[]; +extern s16 D_8018D728[]; +extern s16 D_8018D788[]; +extern s16 D_8018D790[]; +extern s16 D_8018D7B0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018D7E8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018D840[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018D888[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018D890[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018D898[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018D8A0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018D848; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018D868; +extern void func_801321B0(int param_1); +extern int D_8018D878; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801E0CC8; +extern s32 D_801E0CCC[]; +extern int D_801E0CD0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018D8AC; +extern u8 D_8018D8A8; +extern s16 *D_8018D8B0; +extern u8 D_8018D8B4; +extern int D_801E0CC8; +extern u16 D_801E0CD8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018D8B0; /* holds a pointer value (*(u16**)&D_8018D8B0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018D8C4[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018D918; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018D91C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018D91C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018D960; +extern u8 D_8018D9A4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018D960; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018D9A4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018D9E8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018DA24[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018DA24; + if (((s16)a1) < 0xC00) { + tbl = D_8018D9E8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018DA60, D_8018DA62, D_8018DA64, D_8018DA66, D_8018DA68, D_8018DA6A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018DA62 < ang)) goto outer_else; + if (!(ang < D_8018DA68)) goto inner_else; + if (ang < D_8018DA64) { *(s16 *)L = D_8018DA64; goto done; } + if (D_8018DA66 < ang) { *(s16 *)L = D_8018DA66; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018DA60) { *(s16 *)L = D_8018DA60; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018DA6A < ang) { *(s16 *)L = D_8018DA6A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801E0D40; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801E0D40, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801E0D40; +extern s8 D_801E0D44; +extern s8 D_801E0D45; + +void func_8013C9C4(void * arg0) +{ + D_801E0D40 = arg0; + D_801E0D44 = 0; + D_801E0D45 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801E0D40; +extern s8 D_801E0D44; +extern s8 D_801E0D45; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801E0D40; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801E0D45; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801E0D44)) * 2) + D_801E0D40); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801E0D45 = (unsigned char) p[1]; + D_801E0D44 = D_801E0D44 + 1; + if (D_801E0D45 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801E0D44 = 0; + *base = 0; + } + } + else + { + D_801E0D45 = c - 1; + } + } + return; +} + + + +extern s32 D_801E0D64; +extern s32 D_801E0D58; +extern s32 D_801E0D5C; +extern s32 D_801E0D68; + +void func_8013CABC(void) { + D_801E0D64 = 1; + D_801E0D58 = 1; + D_801E0D5C = 0; + D_801E0D68 = 1; +} + + + +extern s32 D_801E0D58; +extern s32 D_801E0D5C; +extern s32 D_801E0D60; +extern s32 D_801E0D64; +extern s32 D_801E0D68; + +void func_8013CAE8(void) { + D_801E0D58 = 1; + D_801E0D64 = 0; + D_801E0D5C = 0; + D_801E0D60 = -1; + D_801E0D68 = 0; +} + + + +extern s32 D_801E0D64; +extern s32 D_801E0D68; +extern s32 D_801E0D90; +extern s32 D_801E0D94; + +void func_8013CB20(void) +{ + D_801E0D90 = D_801E0D68; + D_801E0D94 = D_801E0D64; + D_801E0D68 = 1; + D_801E0D64 = 0; +} + + + +extern s32 D_801E0D90; +extern s32 D_801E0D94; +extern s32 D_801E0D68; +extern s32 D_801E0D64; + +void func_8013CB5C(void) { + D_801E0D68 = D_801E0D90; + D_801E0D64 = D_801E0D94; +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E2118; + extern u8 D_801E2119; + extern u8 D_801E211A; + extern u8 D_801E211B; + extern u8 D_801E211C; + extern u8 D_801E211D; + extern u8 D_801E211E; + extern u8 D_801E211F; + extern u8 D_801E2120; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E2118; t1 = D_801E2119; t2 = D_801E211A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E211B; t1 = D_801E211C; t2 = D_801E211D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E211E; t1 = D_801E211F; t2 = D_801E2120; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801E0D70; +extern s32 D_801E0D58; +extern s32 D_801E0D74; +extern s32 D_801E0D64; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801E0D70 != 0) { + if (D_801E0D70 != 2) { + if (((D_801E0D70 < 3) && (D_801E0D70 == 1)) && + (D_801E0D74 = D_801E0D74 + 1, 0x23a < D_801E0D74)) { + D_801E0D58 = D_801E0D70; + D_801E0D70 = 2; + } + } else { + D_801E0D58 = D_801E0D58 + -1; + if (D_801E0D58 == 0) { + D_801E0D58 = D_801E0D70; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801E0D64 == 0) { + D_801E0D70 = D_801E0D70 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801E0D64; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801E0D64; +} + + + +extern s32 D_801E0D70; + +void func_8013D164(void) { + D_801E0D70 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E21FA; +extern u8 D_801E226E; +extern u8 D_801E2122; +extern u8 D_801E21DC; +extern u8 D_801E2100; +extern u8 D_801E2121; +extern s32 D_801E21E0; + +void func_8013D330(void) { + if ((D_801E21FA & 0xff) != D_801E226E) { + D_801E21FA = ((D_801E21FA & 0xff) < D_801E226E) ? (D_801E21FA + 1) : (D_801E21FA - 1); + } + if ((D_801E2122 & 0xff) != D_801E21DC) { + D_801E2122 = ((D_801E2122 & 0xff) < D_801E21DC) ? (D_801E2122 + 1) : (D_801E2122 - 1); + } + if ((D_801E2100 & 0xff) != D_801E2121) { + D_801E2100 = ((D_801E2100 & 0xff) < D_801E2121) ? (D_801E2100 + 1) : (D_801E2100 - 1); + } + D_801E21E0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801E0D48; +extern void *D_801E0D4C; +extern void *D_801E0D50; +extern s32 D_801E0D78; +extern s32 D_801E0D7C; +extern s32 D_801E0D80; +extern s32 D_801E2154[]; + +extern u8 D_8018DB58[]; +extern u8 D_8018DC00[]; +extern u8 D_8018DAB0[]; +extern u8 D_8018DBAC[]; +extern u8 D_8018DC2C[]; +extern u8 D_8018DB04[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801E0D78 = param_2; + D_801E0D7C = (param_2 >> 2) & 3; + D_801E0D80 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801E0D48 = D_8018DB58; + D_801E0D4C = D_8018DC00; + D_801E0D50 = D_8018DAB0; + } else { + D_801E0D48 = D_8018DBAC; + D_801E0D4C = D_8018DC2C; + D_801E0D50 = D_8018DB04; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801E0D80 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801E0D78 & 2) != 0) { + D_801E2154[0] = 0x140; + D_801E2154[3] = 0x80; + if (p[0x37] == 4) { + D_801E2154[0] = 0x140; + D_801E2154[3] = 0; + } + if (p[0x37] == 0) { + D_801E2154[0] = 0x140; + D_801E2154[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801E0D50)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801E0D50; +extern s16 *D_801E0D54; +extern s32 D_801E0D64; +extern s32 D_801E0D84; +extern s32 D_801E0D88; +extern s32 D_801E0D8C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801E0D54 != 0) { + D_801E0D64 = 0; + p = (int *)(param_1 * 12 + (int)D_801E0D50); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801E0D84 != x) { + flag = 1; + if (D_801E0D84 < x) { + if (x - D_801E0D84 < 5) { + D_801E0D84 = x; + } else { + D_801E0D84 = D_801E0D84 + 4; + } + } else { + if (D_801E0D84 - x < 5) { + D_801E0D84 = x; + } else { + D_801E0D84 = D_801E0D84 - 4; + } + } + } + if (D_801E0D88 != y) { + flag = 1; + if (D_801E0D88 < y) { + if (y - D_801E0D88 < 5) { + D_801E0D88 = y; + } else { + D_801E0D88 = D_801E0D88 + 4; + } + } else { + if (D_801E0D88 - y < 5) { + D_801E0D88 = y; + } else { + D_801E0D88 = D_801E0D88 - 4; + } + } + } + if (D_801E0D8C != z) { + flag = 1; + if (D_801E0D8C < z) { + if (z - D_801E0D8C < 5) { + D_801E0D8C = z; + } else { + D_801E0D8C = D_801E0D8C + 4; + } + } else { + if (D_801E0D8C - z < 5) { + D_801E0D8C = z; + } else { + D_801E0D8C = D_801E0D8C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801E0D64 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018DCBC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801E0D54); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801E0D84); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801E0D88); + uVar5 = (*(int*)&D_801E0D8C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018DCBC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801E0D6C; + +s32 func_8013E054(void) { + return D_801E0D6C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018E6B8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018E690; +extern s16 D_8018E692; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018E6B8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018E690 = 2; + D_8018E692 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018E692 = 0; + D_8018E690 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801E0DA0; + extern void * D_801E0DA4; + extern unsigned char D_8018E330; + extern unsigned char D_8018E348; + extern unsigned char D_8018E3BC; + extern unsigned char D_8018E3C4; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801E0DA0 = &D_8018E330; + D_801E0DA4 = &D_8018E3BC; + } else { + D_801E0DA0 = &D_8018E348; + D_801E0DA4 = &D_8018E3C4; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018E6B8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018E6B8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018E6B8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018E694; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018E694)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018E694)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018E690; +extern s16 D_8018E692; +extern unsigned char D_8018E694; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018E692` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018E690` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018E692; + if (*r < 3) { + *r = *r + 1; + } + D_8018E690 = (u16)D_8018E690 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E694); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018E694; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018E694); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_024/ov_SC06_024_jr_8012ACE0.c b/src/ov_SC06_024/ov_SC06_024_jr_8012ACE0.c index baa35351c..9071e8333 100644 --- a/src/ov_SC06_024/ov_SC06_024_jr_8012ACE0.c +++ b/src/ov_SC06_024/ov_SC06_024_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018FDF4[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018FDF4[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018FE38; -extern u8 D_8018FE7C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018FE38; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018FE7C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018FEC0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018FEFC[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018FEFC; - if (((s16)a1) < 0xC00) { - tbl = D_8018FEC0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018FF38, D_8018FF3A, D_8018FF3C, D_8018FF3E, D_8018FF40, D_8018FF42; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018FF3A < ang)) goto outer_else; - if (!(ang < D_8018FF40)) goto inner_else; - if (ang < D_8018FF3C) { *(s16 *)L = D_8018FF3C; goto done; } - if (D_8018FF3E < ang) { *(s16 *)L = D_8018FF3E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018FF38) { *(s16 *)L = D_8018FF38; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018FF42 < ang) { *(s16 *)L = D_8018FF42; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801DFEC0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801DFEC0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801DFEC0; -extern s8 D_801DFEC4; -extern s8 D_801DFEC5; - -void func_8013C9C4(void * arg0) -{ - D_801DFEC0 = arg0; - D_801DFEC4 = 0; - D_801DFEC5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801DFEC0; -extern s8 D_801DFEC4; -extern s8 D_801DFEC5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801DFEC0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801DFEC5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801DFEC4)) * 2) + D_801DFEC0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801DFEC5 = (unsigned char) p[1]; - D_801DFEC4 = D_801DFEC4 + 1; - if (D_801DFEC5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801DFEC4 = 0; - *base = 0; - } - } - else - { - D_801DFEC5 = c - 1; - } - } - return; -} - - - -extern s32 D_801DFEE4; -extern s32 D_801DFED8; -extern s32 D_801DFEDC; -extern s32 D_801DFEE8; - -void func_8013CABC(void) { - D_801DFEE4 = 1; - D_801DFED8 = 1; - D_801DFEDC = 0; - D_801DFEE8 = 1; -} - - - -extern s32 D_801DFED8; -extern s32 D_801DFEDC; -extern s32 D_801DFEE0; -extern s32 D_801DFEE4; -extern s32 D_801DFEE8; - -void func_8013CAE8(void) { - D_801DFED8 = 1; - D_801DFEE4 = 0; - D_801DFEDC = 0; - D_801DFEE0 = -1; - D_801DFEE8 = 0; -} - - - -extern s32 D_801DFEE4; -extern s32 D_801DFEE8; -extern s32 D_801DFF10; -extern s32 D_801DFF14; - -void func_8013CB20(void) -{ - D_801DFF10 = D_801DFEE8; - D_801DFF14 = D_801DFEE4; - D_801DFEE8 = 1; - D_801DFEE4 = 0; -} - - - -extern s32 D_801DFF10; -extern s32 D_801DFF14; -extern s32 D_801DFEE8; -extern s32 D_801DFEE4; - -void func_8013CB5C(void) { - D_801DFEE8 = D_801DFF10; - D_801DFEE4 = D_801DFF14; -} - - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E1810; - extern u8 D_801E1811; - extern u8 D_801E1812; - extern u8 D_801E1813; - extern u8 D_801E1814; - extern u8 D_801E1815; - extern u8 D_801E1816; - extern u8 D_801E1817; - extern u8 D_801E1818; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E1810; t1 = D_801E1811; t2 = D_801E1812; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E1813; t1 = D_801E1814; t2 = D_801E1815; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E1816; t1 = D_801E1817; t2 = D_801E1818; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801DFEF0; -extern s32 D_801DFED8; -extern s32 D_801DFEF4; -extern s32 D_801DFEE4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801DFEF0 != 0) { - if (D_801DFEF0 != 2) { - if (((D_801DFEF0 < 3) && (D_801DFEF0 == 1)) && - (D_801DFEF4 = D_801DFEF4 + 1, 0x23a < D_801DFEF4)) { - D_801DFED8 = D_801DFEF0; - D_801DFEF0 = 2; - } - } else { - D_801DFED8 = D_801DFED8 + -1; - if (D_801DFED8 == 0) { - D_801DFED8 = D_801DFEF0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801DFEE4 == 0) { - D_801DFEF0 = D_801DFEF0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801DFEE4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801DFEE4; -} - - - -extern s32 D_801DFEF0; - -void func_8013D164(void) { - D_801DFEF0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E18F2; -extern u8 D_801E1966; -extern u8 D_801E181A; -extern u8 D_801E18D4; -extern u8 D_801E17F8; -extern u8 D_801E1819; -extern s32 D_801E18D8; - -void func_8013D330(void) { - if ((D_801E18F2 & 0xff) != D_801E1966) { - D_801E18F2 = ((D_801E18F2 & 0xff) < D_801E1966) ? (D_801E18F2 + 1) : (D_801E18F2 - 1); - } - if ((D_801E181A & 0xff) != D_801E18D4) { - D_801E181A = ((D_801E181A & 0xff) < D_801E18D4) ? (D_801E181A + 1) : (D_801E181A - 1); - } - if ((D_801E17F8 & 0xff) != D_801E1819) { - D_801E17F8 = ((D_801E17F8 & 0xff) < D_801E1819) ? (D_801E17F8 + 1) : (D_801E17F8 - 1); - } - D_801E18D8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801DFEC8; -extern void *D_801DFECC; -extern void *D_801DFED0; -extern s32 D_801DFEF8; -extern s32 D_801DFEFC; -extern s32 D_801DFF00; -extern s32 D_801E184C[]; - -extern u8 D_80190030[]; -extern u8 D_801900D8[]; -extern u8 D_8018FF88[]; -extern u8 D_80190084[]; -extern u8 D_80190104[]; -extern u8 D_8018FFDC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801DFEF8 = param_2; - D_801DFEFC = (param_2 >> 2) & 3; - D_801DFF00 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801DFEC8 = D_80190030; - D_801DFECC = D_801900D8; - D_801DFED0 = D_8018FF88; - } else { - D_801DFEC8 = D_80190084; - D_801DFECC = D_80190104; - D_801DFED0 = D_8018FFDC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801DFF00 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801DFEF8 & 2) != 0) { - D_801E184C[0] = 0x140; - D_801E184C[3] = 0x80; - if (p[0x37] == 4) { - D_801E184C[0] = 0x140; - D_801E184C[3] = 0; - } - if (p[0x37] == 0) { - D_801E184C[0] = 0x140; - D_801E184C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801DFED0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801DFED0; -extern s16 *D_801DFED4; -extern s32 D_801DFEE4; -extern s32 D_801DFF04; -extern s32 D_801DFF08; -extern s32 D_801DFF0C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801DFED4 != 0) { - D_801DFEE4 = 0; - p = (int *)(param_1 * 12 + (int)D_801DFED0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801DFF04 != x) { - flag = 1; - if (D_801DFF04 < x) { - if (x - D_801DFF04 < 5) { - D_801DFF04 = x; - } else { - D_801DFF04 = D_801DFF04 + 4; - } - } else { - if (D_801DFF04 - x < 5) { - D_801DFF04 = x; - } else { - D_801DFF04 = D_801DFF04 - 4; - } - } - } - if (D_801DFF08 != y) { - flag = 1; - if (D_801DFF08 < y) { - if (y - D_801DFF08 < 5) { - D_801DFF08 = y; - } else { - D_801DFF08 = D_801DFF08 + 4; - } - } else { - if (D_801DFF08 - y < 5) { - D_801DFF08 = y; - } else { - D_801DFF08 = D_801DFF08 - 4; - } - } - } - if (D_801DFF0C != z) { - flag = 1; - if (D_801DFF0C < z) { - if (z - D_801DFF0C < 5) { - D_801DFF0C = z; - } else { - D_801DFF0C = D_801DFF0C + 4; - } - } else { - if (D_801DFF0C - z < 5) { - D_801DFF0C = z; - } else { - D_801DFF0C = D_801DFF0C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801DFEE4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80190194[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801DFED4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801DFF04); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801DFF08); - uVar5 = (*(int*)&D_801DFF0C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80190194); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801DFEEC; - -s32 func_8013E054(void) { - return D_801DFEEC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80190B90; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80190B68; -extern s16 D_80190B6A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80190B90; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80190B68 = 2; - D_80190B6A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80190B6A = 0; - D_80190B68 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801DFF20; - extern void * D_801DFF24; - extern unsigned char D_80190808; - extern unsigned char D_80190820; - extern unsigned char D_80190894; - extern unsigned char D_8019089C; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801DFF20 = &D_80190808; - D_801DFF24 = &D_80190894; - } else { - D_801DFF20 = &D_80190820; - D_801DFF24 = &D_8019089C; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80190B90/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80190B90 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80190B90)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80190B6C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80190B6C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80190B6C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80190B68; -extern s16 D_80190B6A; -extern unsigned char D_80190B6C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80190B6A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80190B68` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80190B6A; - if (*r < 3) { - *r = *r + 1; - } - D_80190B68 = (u16)D_80190B68 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80190B6C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80190B6C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80190B6C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_024/ov_SC06_024_jr_801380E0.c b/src/ov_SC06_024/ov_SC06_024_jr_801380E0.c new file mode 100644 index 000000000..17bcf409d --- /dev/null +++ b/src/ov_SC06_024/ov_SC06_024_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801DEABC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018FA88[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801DFDDC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E18F8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801DEABC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018F7C4)(); +extern s16 (*D_8018F7C8)(); +extern M2C_UNK (*D_8018F7D0)(); +extern s32 (*D_8018F7D4)(); +extern s32 D_801DFDD8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801DEAC0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018FB1C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80193000; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018FB34; +extern M2C_UNK D_8018FB3C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018FB44; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018FB60[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018FB6C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018FB80[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018FBD0[]; +extern s16 D_8018FC00[]; +extern s16 D_8018FC60[]; +extern s16 D_8018FC68[]; +extern s16 D_8018FC88[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018FCC0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018FD18[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018FD60[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018FD68[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018FD70[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018FD78[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018FD20; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018FD40; +extern void func_801321B0(int param_1); +extern int D_8018FD50; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801DFE48; +extern s32 D_801DFE4C[]; +extern int D_801DFE50; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018FD84; +extern u8 D_8018FD80; +extern s16 *D_8018FD88; +extern u8 D_8018FD8C; +extern int D_801DFE48; +extern u16 D_801DFE58; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018FD88; /* holds a pointer value (*(u16**)&D_8018FD88) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018FD9C[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018FDF0; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018FDF4[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018FDF4[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018FE38; +extern u8 D_8018FE7C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018FE38; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018FE7C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018FEC0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018FEFC[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018FEFC; + if (((s16)a1) < 0xC00) { + tbl = D_8018FEC0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018FF38, D_8018FF3A, D_8018FF3C, D_8018FF3E, D_8018FF40, D_8018FF42; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018FF3A < ang)) goto outer_else; + if (!(ang < D_8018FF40)) goto inner_else; + if (ang < D_8018FF3C) { *(s16 *)L = D_8018FF3C; goto done; } + if (D_8018FF3E < ang) { *(s16 *)L = D_8018FF3E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018FF38) { *(s16 *)L = D_8018FF38; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018FF42 < ang) { *(s16 *)L = D_8018FF42; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801DFEC0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801DFEC0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801DFEC0; +extern s8 D_801DFEC4; +extern s8 D_801DFEC5; + +void func_8013C9C4(void * arg0) +{ + D_801DFEC0 = arg0; + D_801DFEC4 = 0; + D_801DFEC5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801DFEC0; +extern s8 D_801DFEC4; +extern s8 D_801DFEC5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801DFEC0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801DFEC5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801DFEC4)) * 2) + D_801DFEC0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801DFEC5 = (unsigned char) p[1]; + D_801DFEC4 = D_801DFEC4 + 1; + if (D_801DFEC5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801DFEC4 = 0; + *base = 0; + } + } + else + { + D_801DFEC5 = c - 1; + } + } + return; +} + + + +extern s32 D_801DFEE4; +extern s32 D_801DFED8; +extern s32 D_801DFEDC; +extern s32 D_801DFEE8; + +void func_8013CABC(void) { + D_801DFEE4 = 1; + D_801DFED8 = 1; + D_801DFEDC = 0; + D_801DFEE8 = 1; +} + + + +extern s32 D_801DFED8; +extern s32 D_801DFEDC; +extern s32 D_801DFEE0; +extern s32 D_801DFEE4; +extern s32 D_801DFEE8; + +void func_8013CAE8(void) { + D_801DFED8 = 1; + D_801DFEE4 = 0; + D_801DFEDC = 0; + D_801DFEE0 = -1; + D_801DFEE8 = 0; +} + + + +extern s32 D_801DFEE4; +extern s32 D_801DFEE8; +extern s32 D_801DFF10; +extern s32 D_801DFF14; + +void func_8013CB20(void) +{ + D_801DFF10 = D_801DFEE8; + D_801DFF14 = D_801DFEE4; + D_801DFEE8 = 1; + D_801DFEE4 = 0; +} + + + +extern s32 D_801DFF10; +extern s32 D_801DFF14; +extern s32 D_801DFEE8; +extern s32 D_801DFEE4; + +void func_8013CB5C(void) { + D_801DFEE8 = D_801DFF10; + D_801DFEE4 = D_801DFF14; +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E1810; + extern u8 D_801E1811; + extern u8 D_801E1812; + extern u8 D_801E1813; + extern u8 D_801E1814; + extern u8 D_801E1815; + extern u8 D_801E1816; + extern u8 D_801E1817; + extern u8 D_801E1818; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E1810; t1 = D_801E1811; t2 = D_801E1812; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E1813; t1 = D_801E1814; t2 = D_801E1815; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E1816; t1 = D_801E1817; t2 = D_801E1818; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801DFEF0; +extern s32 D_801DFED8; +extern s32 D_801DFEF4; +extern s32 D_801DFEE4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801DFEF0 != 0) { + if (D_801DFEF0 != 2) { + if (((D_801DFEF0 < 3) && (D_801DFEF0 == 1)) && + (D_801DFEF4 = D_801DFEF4 + 1, 0x23a < D_801DFEF4)) { + D_801DFED8 = D_801DFEF0; + D_801DFEF0 = 2; + } + } else { + D_801DFED8 = D_801DFED8 + -1; + if (D_801DFED8 == 0) { + D_801DFED8 = D_801DFEF0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801DFEE4 == 0) { + D_801DFEF0 = D_801DFEF0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801DFEE4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801DFEE4; +} + + + +extern s32 D_801DFEF0; + +void func_8013D164(void) { + D_801DFEF0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E18F2; +extern u8 D_801E1966; +extern u8 D_801E181A; +extern u8 D_801E18D4; +extern u8 D_801E17F8; +extern u8 D_801E1819; +extern s32 D_801E18D8; + +void func_8013D330(void) { + if ((D_801E18F2 & 0xff) != D_801E1966) { + D_801E18F2 = ((D_801E18F2 & 0xff) < D_801E1966) ? (D_801E18F2 + 1) : (D_801E18F2 - 1); + } + if ((D_801E181A & 0xff) != D_801E18D4) { + D_801E181A = ((D_801E181A & 0xff) < D_801E18D4) ? (D_801E181A + 1) : (D_801E181A - 1); + } + if ((D_801E17F8 & 0xff) != D_801E1819) { + D_801E17F8 = ((D_801E17F8 & 0xff) < D_801E1819) ? (D_801E17F8 + 1) : (D_801E17F8 - 1); + } + D_801E18D8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801DFEC8; +extern void *D_801DFECC; +extern void *D_801DFED0; +extern s32 D_801DFEF8; +extern s32 D_801DFEFC; +extern s32 D_801DFF00; +extern s32 D_801E184C[]; + +extern u8 D_80190030[]; +extern u8 D_801900D8[]; +extern u8 D_8018FF88[]; +extern u8 D_80190084[]; +extern u8 D_80190104[]; +extern u8 D_8018FFDC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801DFEF8 = param_2; + D_801DFEFC = (param_2 >> 2) & 3; + D_801DFF00 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801DFEC8 = D_80190030; + D_801DFECC = D_801900D8; + D_801DFED0 = D_8018FF88; + } else { + D_801DFEC8 = D_80190084; + D_801DFECC = D_80190104; + D_801DFED0 = D_8018FFDC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801DFF00 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801DFEF8 & 2) != 0) { + D_801E184C[0] = 0x140; + D_801E184C[3] = 0x80; + if (p[0x37] == 4) { + D_801E184C[0] = 0x140; + D_801E184C[3] = 0; + } + if (p[0x37] == 0) { + D_801E184C[0] = 0x140; + D_801E184C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801DFED0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801DFED0; +extern s16 *D_801DFED4; +extern s32 D_801DFEE4; +extern s32 D_801DFF04; +extern s32 D_801DFF08; +extern s32 D_801DFF0C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801DFED4 != 0) { + D_801DFEE4 = 0; + p = (int *)(param_1 * 12 + (int)D_801DFED0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801DFF04 != x) { + flag = 1; + if (D_801DFF04 < x) { + if (x - D_801DFF04 < 5) { + D_801DFF04 = x; + } else { + D_801DFF04 = D_801DFF04 + 4; + } + } else { + if (D_801DFF04 - x < 5) { + D_801DFF04 = x; + } else { + D_801DFF04 = D_801DFF04 - 4; + } + } + } + if (D_801DFF08 != y) { + flag = 1; + if (D_801DFF08 < y) { + if (y - D_801DFF08 < 5) { + D_801DFF08 = y; + } else { + D_801DFF08 = D_801DFF08 + 4; + } + } else { + if (D_801DFF08 - y < 5) { + D_801DFF08 = y; + } else { + D_801DFF08 = D_801DFF08 - 4; + } + } + } + if (D_801DFF0C != z) { + flag = 1; + if (D_801DFF0C < z) { + if (z - D_801DFF0C < 5) { + D_801DFF0C = z; + } else { + D_801DFF0C = D_801DFF0C + 4; + } + } else { + if (D_801DFF0C - z < 5) { + D_801DFF0C = z; + } else { + D_801DFF0C = D_801DFF0C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801DFEE4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80190194[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801DFED4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801DFF04); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801DFF08); + uVar5 = (*(int*)&D_801DFF0C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80190194); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801DFEEC; + +s32 func_8013E054(void) { + return D_801DFEEC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80190B90; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80190B68; +extern s16 D_80190B6A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80190B90; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80190B68 = 2; + D_80190B6A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80190B6A = 0; + D_80190B68 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801DFF20; + extern void * D_801DFF24; + extern unsigned char D_80190808; + extern unsigned char D_80190820; + extern unsigned char D_80190894; + extern unsigned char D_8019089C; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801DFF20 = &D_80190808; + D_801DFF24 = &D_80190894; + } else { + D_801DFF20 = &D_80190820; + D_801DFF24 = &D_8019089C; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80190B90/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80190B90 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80190B90)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80190B6C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80190B6C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80190B6C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80190B68; +extern s16 D_80190B6A; +extern unsigned char D_80190B6C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80190B6A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80190B68` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80190B6A; + if (*r < 3) { + *r = *r + 1; + } + D_80190B68 = (u16)D_80190B68 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80190B6C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80190B6C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80190B6C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_025/ov_SC06_025_jr_8012ACE0.c b/src/ov_SC06_025/ov_SC06_025_jr_8012ACE0.c index 74a8f26d3..5e5e1c633 100644 --- a/src/ov_SC06_025/ov_SC06_025_jr_8012ACE0.c +++ b/src/ov_SC06_025/ov_SC06_025_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80185298[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80185298[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801852DC; -extern u8 D_80185320; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801852DC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80185320 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80185364[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_801853A0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_801853A0; - if (((s16)a1) < 0xC00) { - tbl = D_80185364; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801853DC, D_801853DE, D_801853E0, D_801853E2, D_801853E4, D_801853E6; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801853DE < ang)) goto outer_else; - if (!(ang < D_801853E4)) goto inner_else; - if (ang < D_801853E0) { *(s16 *)L = D_801853E0; goto done; } - if (D_801853E2 < ang) { *(s16 *)L = D_801853E2; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801853DC) { *(s16 *)L = D_801853DC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801853E6 < ang) { *(s16 *)L = D_801853E6; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B0088; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B0088, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B0088; -extern s8 D_801B008C; -extern s8 D_801B008D; - -void func_8013C9C4(void * arg0) -{ - D_801B0088 = arg0; - D_801B008C = 0; - D_801B008D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B0088; -extern s8 D_801B008C; -extern s8 D_801B008D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B0088; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B008D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B008C)) * 2) + D_801B0088); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B008D = (unsigned char) p[1]; - D_801B008C = D_801B008C + 1; - if (D_801B008D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B008C = 0; - *base = 0; - } - } - else - { - D_801B008D = c - 1; - } - } - return; -} - - - -extern s32 D_801B00AC; -extern s32 D_801B00A0; -extern s32 D_801B00A4; -extern s32 D_801B00B0; - -void func_8013CABC(void) { - D_801B00AC = 1; - D_801B00A0 = 1; - D_801B00A4 = 0; - D_801B00B0 = 1; -} - - - -extern s32 D_801B00A0; -extern s32 D_801B00A4; -extern s32 D_801B00A8; -extern s32 D_801B00AC; -extern s32 D_801B00B0; - -void func_8013CAE8(void) { - D_801B00A0 = 1; - D_801B00AC = 0; - D_801B00A4 = 0; - D_801B00A8 = -1; - D_801B00B0 = 0; -} - - - -extern s32 D_801B00AC; -extern s32 D_801B00B0; -extern s32 D_801B00D8; -extern s32 D_801B00DC; - -void func_8013CB20(void) -{ - D_801B00D8 = D_801B00B0; - D_801B00DC = D_801B00AC; - D_801B00B0 = 1; - D_801B00AC = 0; -} - - - -extern s32 D_801B00D8; -extern s32 D_801B00DC; -extern s32 D_801B00B0; -extern s32 D_801B00AC; - -void func_8013CB5C(void) { - D_801B00B0 = D_801B00D8; - D_801B00AC = D_801B00DC; -} - - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B2130; - extern u8 D_801B2131; - extern u8 D_801B2132; - extern u8 D_801B2133; - extern u8 D_801B2134; - extern u8 D_801B2135; - extern u8 D_801B2136; - extern u8 D_801B2137; - extern u8 D_801B2138; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B2130; t1 = D_801B2131; t2 = D_801B2132; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B2133; t1 = D_801B2134; t2 = D_801B2135; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B2136; t1 = D_801B2137; t2 = D_801B2138; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B00B8; -extern s32 D_801B00A0; -extern s32 D_801B00BC; -extern s32 D_801B00AC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B00B8 != 0) { - if (D_801B00B8 != 2) { - if (((D_801B00B8 < 3) && (D_801B00B8 == 1)) && - (D_801B00BC = D_801B00BC + 1, 0x23a < D_801B00BC)) { - D_801B00A0 = D_801B00B8; - D_801B00B8 = 2; - } - } else { - D_801B00A0 = D_801B00A0 + -1; - if (D_801B00A0 == 0) { - D_801B00A0 = D_801B00B8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B00AC == 0) { - D_801B00B8 = D_801B00B8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B00AC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B00AC; -} - - - -extern s32 D_801B00B8; - -void func_8013D164(void) { - D_801B00B8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801B2212; -extern u8 D_801B2286; -extern u8 D_801B213A; -extern u8 D_801B21F4; -extern u8 D_801B2118; -extern u8 D_801B2139; -extern s32 D_801B21F8; - -void func_8013D330(void) { - if ((D_801B2212 & 0xff) != D_801B2286) { - D_801B2212 = ((D_801B2212 & 0xff) < D_801B2286) ? (D_801B2212 + 1) : (D_801B2212 - 1); - } - if ((D_801B213A & 0xff) != D_801B21F4) { - D_801B213A = ((D_801B213A & 0xff) < D_801B21F4) ? (D_801B213A + 1) : (D_801B213A - 1); - } - if ((D_801B2118 & 0xff) != D_801B2139) { - D_801B2118 = ((D_801B2118 & 0xff) < D_801B2139) ? (D_801B2118 + 1) : (D_801B2118 - 1); - } - D_801B21F8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B0090; -extern void *D_801B0094; -extern void *D_801B0098; -extern s32 D_801B00C0; -extern s32 D_801B00C4; -extern s32 D_801B00C8; -extern s32 D_801B216C[]; - -extern u8 D_801854D4[]; -extern u8 D_8018557C[]; -extern u8 D_8018542C[]; -extern u8 D_80185528[]; -extern u8 D_801855A8[]; -extern u8 D_80185480[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B00C0 = param_2; - D_801B00C4 = (param_2 >> 2) & 3; - D_801B00C8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B0090 = D_801854D4; - D_801B0094 = D_8018557C; - D_801B0098 = D_8018542C; - } else { - D_801B0090 = D_80185528; - D_801B0094 = D_801855A8; - D_801B0098 = D_80185480; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B00C8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B00C0 & 2) != 0) { - D_801B216C[0] = 0x140; - D_801B216C[3] = 0x80; - if (p[0x37] == 4) { - D_801B216C[0] = 0x140; - D_801B216C[3] = 0; - } - if (p[0x37] == 0) { - D_801B216C[0] = 0x140; - D_801B216C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B0098)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B0098; -extern s16 *D_801B009C; -extern s32 D_801B00AC; -extern s32 D_801B00CC; -extern s32 D_801B00D0; -extern s32 D_801B00D4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B009C != 0) { - D_801B00AC = 0; - p = (int *)(param_1 * 12 + (int)D_801B0098); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B00CC != x) { - flag = 1; - if (D_801B00CC < x) { - if (x - D_801B00CC < 5) { - D_801B00CC = x; - } else { - D_801B00CC = D_801B00CC + 4; - } - } else { - if (D_801B00CC - x < 5) { - D_801B00CC = x; - } else { - D_801B00CC = D_801B00CC - 4; - } - } - } - if (D_801B00D0 != y) { - flag = 1; - if (D_801B00D0 < y) { - if (y - D_801B00D0 < 5) { - D_801B00D0 = y; - } else { - D_801B00D0 = D_801B00D0 + 4; - } - } else { - if (D_801B00D0 - y < 5) { - D_801B00D0 = y; - } else { - D_801B00D0 = D_801B00D0 - 4; - } - } - } - if (D_801B00D4 != z) { - flag = 1; - if (D_801B00D4 < z) { - if (z - D_801B00D4 < 5) { - D_801B00D4 = z; - } else { - D_801B00D4 = D_801B00D4 + 4; - } - } else { - if (D_801B00D4 - z < 5) { - D_801B00D4 = z; - } else { - D_801B00D4 = D_801B00D4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B00AC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80185638[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B009C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B00CC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B00D0); - uVar5 = (*(int*)&D_801B00D4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80185638); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B00B4; - -s32 func_8013E054(void) { - return D_801B00B4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80186034; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018600C; -extern s16 D_8018600E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80186034; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018600C = 2; - D_8018600E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018600E = 0; - D_8018600C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B00E8; - extern void * D_801B00EC; - extern unsigned char D_80185CAC; - extern unsigned char D_80185CC4; - extern unsigned char D_80185D38; - extern unsigned char D_80185D40; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B00E8 = &D_80185CAC; - D_801B00EC = &D_80185D38; - } else { - D_801B00E8 = &D_80185CC4; - D_801B00EC = &D_80185D40; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80186034/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186034 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80186034)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80186010; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186010)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186010)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018600C; -extern s16 D_8018600E; -extern unsigned char D_80186010; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018600E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018600C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018600E; - if (*r < 3) { - *r = *r + 1; - } - D_8018600C = (u16)D_8018600C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186010); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80186010; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186010); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_025/ov_SC06_025_jr_801380E0.c b/src/ov_SC06_025/ov_SC06_025_jr_801380E0.c new file mode 100644 index 000000000..1192d3e34 --- /dev/null +++ b/src/ov_SC06_025/ov_SC06_025_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801AEDDC; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80184F2C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801AFFA4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801B2218; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801AEDDC; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80184C68)(); +extern s16 (*D_80184C6C)(); +extern M2C_UNK (*D_80184C74)(); +extern s32 (*D_80184C78)(); +extern s32 D_801AFFA0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801AEDE0; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80184FC0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801884A4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80184FD8; +extern M2C_UNK D_80184FE0; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80184FE8; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80185004[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80185010[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80185024[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80185074[]; +extern s16 D_801850A4[]; +extern s16 D_80185104[]; +extern s16 D_8018510C[]; +extern s16 D_8018512C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80185164[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_801851BC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80185204[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018520C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80185214[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018521C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_801851C4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801851E4; +extern void func_801321B0(int param_1); +extern int D_801851F4; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B0010; +extern s32 D_801B0014[]; +extern int D_801B0018; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80185228; +extern u8 D_80185224; +extern s16 *D_8018522C; +extern u8 D_80185230; +extern int D_801B0010; +extern u16 D_801B0020; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018522C; /* holds a pointer value (*(u16**)&D_8018522C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80185240[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80185294; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80185298[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80185298[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801852DC; +extern u8 D_80185320; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801852DC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80185320 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80185364[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_801853A0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_801853A0; + if (((s16)a1) < 0xC00) { + tbl = D_80185364; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801853DC, D_801853DE, D_801853E0, D_801853E2, D_801853E4, D_801853E6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801853DE < ang)) goto outer_else; + if (!(ang < D_801853E4)) goto inner_else; + if (ang < D_801853E0) { *(s16 *)L = D_801853E0; goto done; } + if (D_801853E2 < ang) { *(s16 *)L = D_801853E2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801853DC) { *(s16 *)L = D_801853DC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801853E6 < ang) { *(s16 *)L = D_801853E6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B0088; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B0088, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B0088; +extern s8 D_801B008C; +extern s8 D_801B008D; + +void func_8013C9C4(void * arg0) +{ + D_801B0088 = arg0; + D_801B008C = 0; + D_801B008D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B0088; +extern s8 D_801B008C; +extern s8 D_801B008D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B0088; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B008D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B008C)) * 2) + D_801B0088); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B008D = (unsigned char) p[1]; + D_801B008C = D_801B008C + 1; + if (D_801B008D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B008C = 0; + *base = 0; + } + } + else + { + D_801B008D = c - 1; + } + } + return; +} + + + +extern s32 D_801B00AC; +extern s32 D_801B00A0; +extern s32 D_801B00A4; +extern s32 D_801B00B0; + +void func_8013CABC(void) { + D_801B00AC = 1; + D_801B00A0 = 1; + D_801B00A4 = 0; + D_801B00B0 = 1; +} + + + +extern s32 D_801B00A0; +extern s32 D_801B00A4; +extern s32 D_801B00A8; +extern s32 D_801B00AC; +extern s32 D_801B00B0; + +void func_8013CAE8(void) { + D_801B00A0 = 1; + D_801B00AC = 0; + D_801B00A4 = 0; + D_801B00A8 = -1; + D_801B00B0 = 0; +} + + + +extern s32 D_801B00AC; +extern s32 D_801B00B0; +extern s32 D_801B00D8; +extern s32 D_801B00DC; + +void func_8013CB20(void) +{ + D_801B00D8 = D_801B00B0; + D_801B00DC = D_801B00AC; + D_801B00B0 = 1; + D_801B00AC = 0; +} + + + +extern s32 D_801B00D8; +extern s32 D_801B00DC; +extern s32 D_801B00B0; +extern s32 D_801B00AC; + +void func_8013CB5C(void) { + D_801B00B0 = D_801B00D8; + D_801B00AC = D_801B00DC; +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B2130; + extern u8 D_801B2131; + extern u8 D_801B2132; + extern u8 D_801B2133; + extern u8 D_801B2134; + extern u8 D_801B2135; + extern u8 D_801B2136; + extern u8 D_801B2137; + extern u8 D_801B2138; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B2130; t1 = D_801B2131; t2 = D_801B2132; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B2133; t1 = D_801B2134; t2 = D_801B2135; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B2136; t1 = D_801B2137; t2 = D_801B2138; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B00B8; +extern s32 D_801B00A0; +extern s32 D_801B00BC; +extern s32 D_801B00AC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B00B8 != 0) { + if (D_801B00B8 != 2) { + if (((D_801B00B8 < 3) && (D_801B00B8 == 1)) && + (D_801B00BC = D_801B00BC + 1, 0x23a < D_801B00BC)) { + D_801B00A0 = D_801B00B8; + D_801B00B8 = 2; + } + } else { + D_801B00A0 = D_801B00A0 + -1; + if (D_801B00A0 == 0) { + D_801B00A0 = D_801B00B8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B00AC == 0) { + D_801B00B8 = D_801B00B8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B00AC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B00AC; +} + + + +extern s32 D_801B00B8; + +void func_8013D164(void) { + D_801B00B8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801B2212; +extern u8 D_801B2286; +extern u8 D_801B213A; +extern u8 D_801B21F4; +extern u8 D_801B2118; +extern u8 D_801B2139; +extern s32 D_801B21F8; + +void func_8013D330(void) { + if ((D_801B2212 & 0xff) != D_801B2286) { + D_801B2212 = ((D_801B2212 & 0xff) < D_801B2286) ? (D_801B2212 + 1) : (D_801B2212 - 1); + } + if ((D_801B213A & 0xff) != D_801B21F4) { + D_801B213A = ((D_801B213A & 0xff) < D_801B21F4) ? (D_801B213A + 1) : (D_801B213A - 1); + } + if ((D_801B2118 & 0xff) != D_801B2139) { + D_801B2118 = ((D_801B2118 & 0xff) < D_801B2139) ? (D_801B2118 + 1) : (D_801B2118 - 1); + } + D_801B21F8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B0090; +extern void *D_801B0094; +extern void *D_801B0098; +extern s32 D_801B00C0; +extern s32 D_801B00C4; +extern s32 D_801B00C8; +extern s32 D_801B216C[]; + +extern u8 D_801854D4[]; +extern u8 D_8018557C[]; +extern u8 D_8018542C[]; +extern u8 D_80185528[]; +extern u8 D_801855A8[]; +extern u8 D_80185480[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B00C0 = param_2; + D_801B00C4 = (param_2 >> 2) & 3; + D_801B00C8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B0090 = D_801854D4; + D_801B0094 = D_8018557C; + D_801B0098 = D_8018542C; + } else { + D_801B0090 = D_80185528; + D_801B0094 = D_801855A8; + D_801B0098 = D_80185480; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B00C8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B00C0 & 2) != 0) { + D_801B216C[0] = 0x140; + D_801B216C[3] = 0x80; + if (p[0x37] == 4) { + D_801B216C[0] = 0x140; + D_801B216C[3] = 0; + } + if (p[0x37] == 0) { + D_801B216C[0] = 0x140; + D_801B216C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B0098)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B0098; +extern s16 *D_801B009C; +extern s32 D_801B00AC; +extern s32 D_801B00CC; +extern s32 D_801B00D0; +extern s32 D_801B00D4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B009C != 0) { + D_801B00AC = 0; + p = (int *)(param_1 * 12 + (int)D_801B0098); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B00CC != x) { + flag = 1; + if (D_801B00CC < x) { + if (x - D_801B00CC < 5) { + D_801B00CC = x; + } else { + D_801B00CC = D_801B00CC + 4; + } + } else { + if (D_801B00CC - x < 5) { + D_801B00CC = x; + } else { + D_801B00CC = D_801B00CC - 4; + } + } + } + if (D_801B00D0 != y) { + flag = 1; + if (D_801B00D0 < y) { + if (y - D_801B00D0 < 5) { + D_801B00D0 = y; + } else { + D_801B00D0 = D_801B00D0 + 4; + } + } else { + if (D_801B00D0 - y < 5) { + D_801B00D0 = y; + } else { + D_801B00D0 = D_801B00D0 - 4; + } + } + } + if (D_801B00D4 != z) { + flag = 1; + if (D_801B00D4 < z) { + if (z - D_801B00D4 < 5) { + D_801B00D4 = z; + } else { + D_801B00D4 = D_801B00D4 + 4; + } + } else { + if (D_801B00D4 - z < 5) { + D_801B00D4 = z; + } else { + D_801B00D4 = D_801B00D4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B00AC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80185638[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B009C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B00CC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B00D0); + uVar5 = (*(int*)&D_801B00D4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80185638); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B00B4; + +s32 func_8013E054(void) { + return D_801B00B4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80186034; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018600C; +extern s16 D_8018600E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80186034; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018600C = 2; + D_8018600E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018600E = 0; + D_8018600C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B00E8; + extern void * D_801B00EC; + extern unsigned char D_80185CAC; + extern unsigned char D_80185CC4; + extern unsigned char D_80185D38; + extern unsigned char D_80185D40; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B00E8 = &D_80185CAC; + D_801B00EC = &D_80185D38; + } else { + D_801B00E8 = &D_80185CC4; + D_801B00EC = &D_80185D40; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80186034/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80186034 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80186034)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80186010; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80186010)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80186010)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018600C; +extern s16 D_8018600E; +extern unsigned char D_80186010; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018600E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018600C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018600E; + if (*r < 3) { + *r = *r + 1; + } + D_8018600C = (u16)D_8018600C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186010); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80186010; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80186010); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_025/nonmatchings/ov_SC06_025_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_027/ov_SC06_027_jr_8012ACE0.c b/src/ov_SC06_027/ov_SC06_027_jr_8012ACE0.c index c58787496..c2950c7e9 100644 --- a/src/ov_SC06_027/ov_SC06_027_jr_8012ACE0.c +++ b/src/ov_SC06_027/ov_SC06_027_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E5D8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E5D8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E61C; -extern u8 D_8017E660; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E61C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E660 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E6A4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E6E0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E6E0; - if (((s16)a1) < 0xC00) { - tbl = D_8017E6A4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E71C, D_8017E71E, D_8017E720, D_8017E722, D_8017E724, D_8017E726; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E71E < ang)) goto outer_else; - if (!(ang < D_8017E724)) goto inner_else; - if (ang < D_8017E720) { *(s16 *)L = D_8017E720; goto done; } - if (D_8017E722 < ang) { *(s16 *)L = D_8017E722; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E71C) { *(s16 *)L = D_8017E71C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E726 < ang) { *(s16 *)L = D_8017E726; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019C060; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019C060, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019C060; -extern s8 D_8019C064; -extern s8 D_8019C065; - -void func_8013C9C4(void * arg0) -{ - D_8019C060 = arg0; - D_8019C064 = 0; - D_8019C065 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019C060; -extern s8 D_8019C064; -extern s8 D_8019C065; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019C060; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019C065; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019C064)) * 2) + D_8019C060); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019C065 = (unsigned char) p[1]; - D_8019C064 = D_8019C064 + 1; - if (D_8019C065 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019C064 = 0; - *base = 0; - } - } - else - { - D_8019C065 = c - 1; - } - } - return; -} - - - -extern s32 D_8019C084; -extern s32 D_8019C078; -extern s32 D_8019C07C; -extern s32 D_8019C088; - -void func_8013CABC(void) { - D_8019C084 = 1; - D_8019C078 = 1; - D_8019C07C = 0; - D_8019C088 = 1; -} - - - -extern s32 D_8019C078; -extern s32 D_8019C07C; -extern s32 D_8019C080; -extern s32 D_8019C084; -extern s32 D_8019C088; - -void func_8013CAE8(void) { - D_8019C078 = 1; - D_8019C084 = 0; - D_8019C07C = 0; - D_8019C080 = -1; - D_8019C088 = 0; -} - - - -extern s32 D_8019C084; -extern s32 D_8019C088; -extern s32 D_8019C0B0; -extern s32 D_8019C0B4; - -void func_8013CB20(void) -{ - D_8019C0B0 = D_8019C088; - D_8019C0B4 = D_8019C084; - D_8019C088 = 1; - D_8019C084 = 0; -} - - - -extern s32 D_8019C0B0; -extern s32 D_8019C0B4; -extern s32 D_8019C088; -extern s32 D_8019C084; - -void func_8013CB5C(void) { - D_8019C088 = D_8019C0B0; - D_8019C084 = D_8019C0B4; -} - - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019D2D8; - extern u8 D_8019D2D9; - extern u8 D_8019D2DA; - extern u8 D_8019D2DB; - extern u8 D_8019D2DC; - extern u8 D_8019D2DD; - extern u8 D_8019D2DE; - extern u8 D_8019D2DF; - extern u8 D_8019D2E0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019D2D8; t1 = D_8019D2D9; t2 = D_8019D2DA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019D2DB; t1 = D_8019D2DC; t2 = D_8019D2DD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019D2DE; t1 = D_8019D2DF; t2 = D_8019D2E0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019C090; -extern s32 D_8019C078; -extern s32 D_8019C094; -extern s32 D_8019C084; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019C090 != 0) { - if (D_8019C090 != 2) { - if (((D_8019C090 < 3) && (D_8019C090 == 1)) && - (D_8019C094 = D_8019C094 + 1, 0x23a < D_8019C094)) { - D_8019C078 = D_8019C090; - D_8019C090 = 2; - } - } else { - D_8019C078 = D_8019C078 + -1; - if (D_8019C078 == 0) { - D_8019C078 = D_8019C090; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019C084 == 0) { - D_8019C090 = D_8019C090 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019C084; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019C084; -} - - - -extern s32 D_8019C090; - -void func_8013D164(void) { - D_8019C090 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_8019D3BA; -extern u8 D_8019D42E; -extern u8 D_8019D2E2; -extern u8 D_8019D39C; -extern u8 D_8019D2C0; -extern u8 D_8019D2E1; -extern s32 D_8019D3A0; - -void func_8013D330(void) { - if ((D_8019D3BA & 0xff) != D_8019D42E) { - D_8019D3BA = ((D_8019D3BA & 0xff) < D_8019D42E) ? (D_8019D3BA + 1) : (D_8019D3BA - 1); - } - if ((D_8019D2E2 & 0xff) != D_8019D39C) { - D_8019D2E2 = ((D_8019D2E2 & 0xff) < D_8019D39C) ? (D_8019D2E2 + 1) : (D_8019D2E2 - 1); - } - if ((D_8019D2C0 & 0xff) != D_8019D2E1) { - D_8019D2C0 = ((D_8019D2C0 & 0xff) < D_8019D2E1) ? (D_8019D2C0 + 1) : (D_8019D2C0 - 1); - } - D_8019D3A0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019C068; -extern void *D_8019C06C; -extern void *D_8019C070; -extern s32 D_8019C098; -extern s32 D_8019C09C; -extern s32 D_8019C0A0; -extern s32 D_8019D314[]; - -extern u8 D_8017E814[]; -extern u8 D_8017E8BC[]; -extern u8 D_8017E76C[]; -extern u8 D_8017E868[]; -extern u8 D_8017E8E8[]; -extern u8 D_8017E7C0[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019C098 = param_2; - D_8019C09C = (param_2 >> 2) & 3; - D_8019C0A0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019C068 = D_8017E814; - D_8019C06C = D_8017E8BC; - D_8019C070 = D_8017E76C; - } else { - D_8019C068 = D_8017E868; - D_8019C06C = D_8017E8E8; - D_8019C070 = D_8017E7C0; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019C0A0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019C098 & 2) != 0) { - D_8019D314[0] = 0x140; - D_8019D314[3] = 0x80; - if (p[0x37] == 4) { - D_8019D314[0] = 0x140; - D_8019D314[3] = 0; - } - if (p[0x37] == 0) { - D_8019D314[0] = 0x140; - D_8019D314[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019C070)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019C070; -extern s16 *D_8019C074; -extern s32 D_8019C084; -extern s32 D_8019C0A4; -extern s32 D_8019C0A8; -extern s32 D_8019C0AC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019C074 != 0) { - D_8019C084 = 0; - p = (int *)(param_1 * 12 + (int)D_8019C070); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019C0A4 != x) { - flag = 1; - if (D_8019C0A4 < x) { - if (x - D_8019C0A4 < 5) { - D_8019C0A4 = x; - } else { - D_8019C0A4 = D_8019C0A4 + 4; - } - } else { - if (D_8019C0A4 - x < 5) { - D_8019C0A4 = x; - } else { - D_8019C0A4 = D_8019C0A4 - 4; - } - } - } - if (D_8019C0A8 != y) { - flag = 1; - if (D_8019C0A8 < y) { - if (y - D_8019C0A8 < 5) { - D_8019C0A8 = y; - } else { - D_8019C0A8 = D_8019C0A8 + 4; - } - } else { - if (D_8019C0A8 - y < 5) { - D_8019C0A8 = y; - } else { - D_8019C0A8 = D_8019C0A8 - 4; - } - } - } - if (D_8019C0AC != z) { - flag = 1; - if (D_8019C0AC < z) { - if (z - D_8019C0AC < 5) { - D_8019C0AC = z; - } else { - D_8019C0AC = D_8019C0AC + 4; - } - } else { - if (D_8019C0AC - z < 5) { - D_8019C0AC = z; - } else { - D_8019C0AC = D_8019C0AC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019C084 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017E978[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019C074); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019C0A4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019C0A8); - uVar5 = (*(int*)&D_8019C0AC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017E978); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019C08C; - -s32 func_8013E054(void) { - return D_8019C08C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F374; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F34C; -extern s16 D_8017F34E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F374; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F34C = 2; - D_8017F34E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F34E = 0; - D_8017F34C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019C0C0; - extern void * D_8019C0C4; - extern unsigned char D_8017EFEC; - extern unsigned char D_8017F004; - extern unsigned char D_8017F078; - extern unsigned char D_8017F080; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019C0C0 = &D_8017EFEC; - D_8019C0C4 = &D_8017F078; - } else { - D_8019C0C0 = &D_8017F004; - D_8019C0C4 = &D_8017F080; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F374/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F374 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F374)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F350; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F350)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F350)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F34C; -extern s16 D_8017F34E; -extern unsigned char D_8017F350; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F34E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F34C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F34E; - if (*r < 3) { - *r = *r + 1; - } - D_8017F34C = (u16)D_8017F34C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F350); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F350; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F350); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_027/ov_SC06_027_jr_801380E0.c b/src/ov_SC06_027/ov_SC06_027_jr_801380E0.c new file mode 100644 index 000000000..770b7949d --- /dev/null +++ b/src/ov_SC06_027/ov_SC06_027_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_8019AE18; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E26C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019BF7C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_8019D3C0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_8019AE18; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017DFA8)(); +extern s16 (*D_8017DFAC)(); +extern M2C_UNK (*D_8017DFB4)(); +extern s32 (*D_8017DFB8)(); +extern s32 D_8019BF78; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019AE1C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E300; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801817E4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E318; +extern M2C_UNK D_8017E320; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E328; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E344[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E350[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E364[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E3B4[]; +extern s16 D_8017E3E4[]; +extern s16 D_8017E444[]; +extern s16 D_8017E44C[]; +extern s16 D_8017E46C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E4A4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E4FC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E544[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E54C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E554[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E55C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E504; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E524; +extern void func_801321B0(int param_1); +extern int D_8017E534; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019BFE8; +extern s32 D_8019BFEC[]; +extern int D_8019BFF0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E568; +extern u8 D_8017E564; +extern s16 *D_8017E56C; +extern u8 D_8017E570; +extern int D_8019BFE8; +extern u16 D_8019BFF8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E56C; /* holds a pointer value (*(u16**)&D_8017E56C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E580[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E5D4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E5D8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E5D8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E61C; +extern u8 D_8017E660; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E61C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E660 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E6A4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E6E0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E6E0; + if (((s16)a1) < 0xC00) { + tbl = D_8017E6A4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E71C, D_8017E71E, D_8017E720, D_8017E722, D_8017E724, D_8017E726; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E71E < ang)) goto outer_else; + if (!(ang < D_8017E724)) goto inner_else; + if (ang < D_8017E720) { *(s16 *)L = D_8017E720; goto done; } + if (D_8017E722 < ang) { *(s16 *)L = D_8017E722; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E71C) { *(s16 *)L = D_8017E71C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E726 < ang) { *(s16 *)L = D_8017E726; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019C060; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019C060, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019C060; +extern s8 D_8019C064; +extern s8 D_8019C065; + +void func_8013C9C4(void * arg0) +{ + D_8019C060 = arg0; + D_8019C064 = 0; + D_8019C065 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019C060; +extern s8 D_8019C064; +extern s8 D_8019C065; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019C060; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019C065; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019C064)) * 2) + D_8019C060); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019C065 = (unsigned char) p[1]; + D_8019C064 = D_8019C064 + 1; + if (D_8019C065 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019C064 = 0; + *base = 0; + } + } + else + { + D_8019C065 = c - 1; + } + } + return; +} + + + +extern s32 D_8019C084; +extern s32 D_8019C078; +extern s32 D_8019C07C; +extern s32 D_8019C088; + +void func_8013CABC(void) { + D_8019C084 = 1; + D_8019C078 = 1; + D_8019C07C = 0; + D_8019C088 = 1; +} + + + +extern s32 D_8019C078; +extern s32 D_8019C07C; +extern s32 D_8019C080; +extern s32 D_8019C084; +extern s32 D_8019C088; + +void func_8013CAE8(void) { + D_8019C078 = 1; + D_8019C084 = 0; + D_8019C07C = 0; + D_8019C080 = -1; + D_8019C088 = 0; +} + + + +extern s32 D_8019C084; +extern s32 D_8019C088; +extern s32 D_8019C0B0; +extern s32 D_8019C0B4; + +void func_8013CB20(void) +{ + D_8019C0B0 = D_8019C088; + D_8019C0B4 = D_8019C084; + D_8019C088 = 1; + D_8019C084 = 0; +} + + + +extern s32 D_8019C0B0; +extern s32 D_8019C0B4; +extern s32 D_8019C088; +extern s32 D_8019C084; + +void func_8013CB5C(void) { + D_8019C088 = D_8019C0B0; + D_8019C084 = D_8019C0B4; +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019D2D8; + extern u8 D_8019D2D9; + extern u8 D_8019D2DA; + extern u8 D_8019D2DB; + extern u8 D_8019D2DC; + extern u8 D_8019D2DD; + extern u8 D_8019D2DE; + extern u8 D_8019D2DF; + extern u8 D_8019D2E0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019D2D8; t1 = D_8019D2D9; t2 = D_8019D2DA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019D2DB; t1 = D_8019D2DC; t2 = D_8019D2DD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019D2DE; t1 = D_8019D2DF; t2 = D_8019D2E0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019C090; +extern s32 D_8019C078; +extern s32 D_8019C094; +extern s32 D_8019C084; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019C090 != 0) { + if (D_8019C090 != 2) { + if (((D_8019C090 < 3) && (D_8019C090 == 1)) && + (D_8019C094 = D_8019C094 + 1, 0x23a < D_8019C094)) { + D_8019C078 = D_8019C090; + D_8019C090 = 2; + } + } else { + D_8019C078 = D_8019C078 + -1; + if (D_8019C078 == 0) { + D_8019C078 = D_8019C090; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019C084 == 0) { + D_8019C090 = D_8019C090 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019C084; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019C084; +} + + + +extern s32 D_8019C090; + +void func_8013D164(void) { + D_8019C090 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_8019D3BA; +extern u8 D_8019D42E; +extern u8 D_8019D2E2; +extern u8 D_8019D39C; +extern u8 D_8019D2C0; +extern u8 D_8019D2E1; +extern s32 D_8019D3A0; + +void func_8013D330(void) { + if ((D_8019D3BA & 0xff) != D_8019D42E) { + D_8019D3BA = ((D_8019D3BA & 0xff) < D_8019D42E) ? (D_8019D3BA + 1) : (D_8019D3BA - 1); + } + if ((D_8019D2E2 & 0xff) != D_8019D39C) { + D_8019D2E2 = ((D_8019D2E2 & 0xff) < D_8019D39C) ? (D_8019D2E2 + 1) : (D_8019D2E2 - 1); + } + if ((D_8019D2C0 & 0xff) != D_8019D2E1) { + D_8019D2C0 = ((D_8019D2C0 & 0xff) < D_8019D2E1) ? (D_8019D2C0 + 1) : (D_8019D2C0 - 1); + } + D_8019D3A0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019C068; +extern void *D_8019C06C; +extern void *D_8019C070; +extern s32 D_8019C098; +extern s32 D_8019C09C; +extern s32 D_8019C0A0; +extern s32 D_8019D314[]; + +extern u8 D_8017E814[]; +extern u8 D_8017E8BC[]; +extern u8 D_8017E76C[]; +extern u8 D_8017E868[]; +extern u8 D_8017E8E8[]; +extern u8 D_8017E7C0[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019C098 = param_2; + D_8019C09C = (param_2 >> 2) & 3; + D_8019C0A0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019C068 = D_8017E814; + D_8019C06C = D_8017E8BC; + D_8019C070 = D_8017E76C; + } else { + D_8019C068 = D_8017E868; + D_8019C06C = D_8017E8E8; + D_8019C070 = D_8017E7C0; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019C0A0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019C098 & 2) != 0) { + D_8019D314[0] = 0x140; + D_8019D314[3] = 0x80; + if (p[0x37] == 4) { + D_8019D314[0] = 0x140; + D_8019D314[3] = 0; + } + if (p[0x37] == 0) { + D_8019D314[0] = 0x140; + D_8019D314[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019C070)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019C070; +extern s16 *D_8019C074; +extern s32 D_8019C084; +extern s32 D_8019C0A4; +extern s32 D_8019C0A8; +extern s32 D_8019C0AC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019C074 != 0) { + D_8019C084 = 0; + p = (int *)(param_1 * 12 + (int)D_8019C070); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019C0A4 != x) { + flag = 1; + if (D_8019C0A4 < x) { + if (x - D_8019C0A4 < 5) { + D_8019C0A4 = x; + } else { + D_8019C0A4 = D_8019C0A4 + 4; + } + } else { + if (D_8019C0A4 - x < 5) { + D_8019C0A4 = x; + } else { + D_8019C0A4 = D_8019C0A4 - 4; + } + } + } + if (D_8019C0A8 != y) { + flag = 1; + if (D_8019C0A8 < y) { + if (y - D_8019C0A8 < 5) { + D_8019C0A8 = y; + } else { + D_8019C0A8 = D_8019C0A8 + 4; + } + } else { + if (D_8019C0A8 - y < 5) { + D_8019C0A8 = y; + } else { + D_8019C0A8 = D_8019C0A8 - 4; + } + } + } + if (D_8019C0AC != z) { + flag = 1; + if (D_8019C0AC < z) { + if (z - D_8019C0AC < 5) { + D_8019C0AC = z; + } else { + D_8019C0AC = D_8019C0AC + 4; + } + } else { + if (D_8019C0AC - z < 5) { + D_8019C0AC = z; + } else { + D_8019C0AC = D_8019C0AC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019C084 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017E978[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019C074); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019C0A4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019C0A8); + uVar5 = (*(int*)&D_8019C0AC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017E978); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019C08C; + +s32 func_8013E054(void) { + return D_8019C08C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F374; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F34C; +extern s16 D_8017F34E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F374; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F34C = 2; + D_8017F34E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F34E = 0; + D_8017F34C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019C0C0; + extern void * D_8019C0C4; + extern unsigned char D_8017EFEC; + extern unsigned char D_8017F004; + extern unsigned char D_8017F078; + extern unsigned char D_8017F080; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019C0C0 = &D_8017EFEC; + D_8019C0C4 = &D_8017F078; + } else { + D_8019C0C0 = &D_8017F004; + D_8019C0C4 = &D_8017F080; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F374/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F374 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F374)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F350; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F350)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F350)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F34C; +extern s16 D_8017F34E; +extern unsigned char D_8017F350; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F34E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F34C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F34E; + if (*r < 3) { + *r = *r + 1; + } + D_8017F34C = (u16)D_8017F34C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F350); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F350; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F350); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_027/nonmatchings/ov_SC06_027_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_029/ov_SC06_029_jr_8012ACE0.c b/src/ov_SC06_029/ov_SC06_029_jr_8012ACE0.c index 19a5b0934..f36a98515 100644 --- a/src/ov_SC06_029/ov_SC06_029_jr_8012ACE0.c +++ b/src/ov_SC06_029/ov_SC06_029_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018CB6C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018CB6C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8018CBB0; -extern u8 D_8018CBF4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8018CBB0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8018CBF4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8018CC38[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8018CC74[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8018CC74; - if (((s16)a1) < 0xC00) { - tbl = D_8018CC38; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8018CCB0, D_8018CCB2, D_8018CCB4, D_8018CCB6, D_8018CCB8, D_8018CCBA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8018CCB2 < ang)) goto outer_else; - if (!(ang < D_8018CCB8)) goto inner_else; - if (ang < D_8018CCB4) { *(s16 *)L = D_8018CCB4; goto done; } - if (D_8018CCB6 < ang) { *(s16 *)L = D_8018CCB6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8018CCB0) { *(s16 *)L = D_8018CCB0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8018CCBA < ang) { *(s16 *)L = D_8018CCBA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801DB980; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801DB980, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801DB980; -extern s8 D_801DB984; -extern s8 D_801DB985; - -void func_8013C9C4(void * arg0) -{ - D_801DB980 = arg0; - D_801DB984 = 0; - D_801DB985 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801DB980; -extern s8 D_801DB984; -extern s8 D_801DB985; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801DB980; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801DB985; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801DB984)) * 2) + D_801DB980); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801DB985 = (unsigned char) p[1]; - D_801DB984 = D_801DB984 + 1; - if (D_801DB985 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801DB984 = 0; - *base = 0; - } - } - else - { - D_801DB985 = c - 1; - } - } - return; -} - - - -extern s32 D_801DB9A4; -extern s32 D_801DB998; -extern s32 D_801DB99C; -extern s32 D_801DB9A8; - -void func_8013CABC(void) { - D_801DB9A4 = 1; - D_801DB998 = 1; - D_801DB99C = 0; - D_801DB9A8 = 1; -} - - - -extern s32 D_801DB998; -extern s32 D_801DB99C; -extern s32 D_801DB9A0; -extern s32 D_801DB9A4; -extern s32 D_801DB9A8; - -void func_8013CAE8(void) { - D_801DB998 = 1; - D_801DB9A4 = 0; - D_801DB99C = 0; - D_801DB9A0 = -1; - D_801DB9A8 = 0; -} - - - -extern s32 D_801DB9A4; -extern s32 D_801DB9A8; -extern s32 D_801DB9D0; -extern s32 D_801DB9D4; - -void func_8013CB20(void) -{ - D_801DB9D0 = D_801DB9A8; - D_801DB9D4 = D_801DB9A4; - D_801DB9A8 = 1; - D_801DB9A4 = 0; -} - - - -extern s32 D_801DB9D0; -extern s32 D_801DB9D4; -extern s32 D_801DB9A8; -extern s32 D_801DB9A4; - -void func_8013CB5C(void) { - D_801DB9A8 = D_801DB9D0; - D_801DB9A4 = D_801DB9D4; -} - - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801E2038; - extern u8 D_801E2039; - extern u8 D_801E203A; - extern u8 D_801E203B; - extern u8 D_801E203C; - extern u8 D_801E203D; - extern u8 D_801E203E; - extern u8 D_801E203F; - extern u8 D_801E2040; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801E2038; t1 = D_801E2039; t2 = D_801E203A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801E203B; t1 = D_801E203C; t2 = D_801E203D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801E203E; t1 = D_801E203F; t2 = D_801E2040; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801DB9B0; -extern s32 D_801DB998; -extern s32 D_801DB9B4; -extern s32 D_801DB9A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801DB9B0 != 0) { - if (D_801DB9B0 != 2) { - if (((D_801DB9B0 < 3) && (D_801DB9B0 == 1)) && - (D_801DB9B4 = D_801DB9B4 + 1, 0x23a < D_801DB9B4)) { - D_801DB998 = D_801DB9B0; - D_801DB9B0 = 2; - } - } else { - D_801DB998 = D_801DB998 + -1; - if (D_801DB998 == 0) { - D_801DB998 = D_801DB9B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801DB9A4 == 0) { - D_801DB9B0 = D_801DB9B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801DB9A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801DB9A4; -} - - - -extern s32 D_801DB9B0; - -void func_8013D164(void) { - D_801DB9B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801E211A; -extern u8 D_801E218E; -extern u8 D_801E2042; -extern u8 D_801E20FC; -extern u8 D_801E2020; -extern u8 D_801E2041; -extern s32 D_801E2100; - -void func_8013D330(void) { - if ((D_801E211A & 0xff) != D_801E218E) { - D_801E211A = ((D_801E211A & 0xff) < D_801E218E) ? (D_801E211A + 1) : (D_801E211A - 1); - } - if ((D_801E2042 & 0xff) != D_801E20FC) { - D_801E2042 = ((D_801E2042 & 0xff) < D_801E20FC) ? (D_801E2042 + 1) : (D_801E2042 - 1); - } - if ((D_801E2020 & 0xff) != D_801E2041) { - D_801E2020 = ((D_801E2020 & 0xff) < D_801E2041) ? (D_801E2020 + 1) : (D_801E2020 - 1); - } - D_801E2100 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801DB988; -extern void *D_801DB98C; -extern void *D_801DB990; -extern s32 D_801DB9B8; -extern s32 D_801DB9BC; -extern s32 D_801DB9C0; -extern s32 D_801E2074[]; - -extern u8 D_8018CDA8[]; -extern u8 D_8018CE50[]; -extern u8 D_8018CD00[]; -extern u8 D_8018CDFC[]; -extern u8 D_8018CE7C[]; -extern u8 D_8018CD54[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801DB9B8 = param_2; - D_801DB9BC = (param_2 >> 2) & 3; - D_801DB9C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801DB988 = D_8018CDA8; - D_801DB98C = D_8018CE50; - D_801DB990 = D_8018CD00; - } else { - D_801DB988 = D_8018CDFC; - D_801DB98C = D_8018CE7C; - D_801DB990 = D_8018CD54; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801DB9C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801DB9B8 & 2) != 0) { - D_801E2074[0] = 0x140; - D_801E2074[3] = 0x80; - if (p[0x37] == 4) { - D_801E2074[0] = 0x140; - D_801E2074[3] = 0; - } - if (p[0x37] == 0) { - D_801E2074[0] = 0x140; - D_801E2074[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801DB990)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801DB990; -extern s16 *D_801DB994; -extern s32 D_801DB9A4; -extern s32 D_801DB9C4; -extern s32 D_801DB9C8; -extern s32 D_801DB9CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801DB994 != 0) { - D_801DB9A4 = 0; - p = (int *)(param_1 * 12 + (int)D_801DB990); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801DB9C4 != x) { - flag = 1; - if (D_801DB9C4 < x) { - if (x - D_801DB9C4 < 5) { - D_801DB9C4 = x; - } else { - D_801DB9C4 = D_801DB9C4 + 4; - } - } else { - if (D_801DB9C4 - x < 5) { - D_801DB9C4 = x; - } else { - D_801DB9C4 = D_801DB9C4 - 4; - } - } - } - if (D_801DB9C8 != y) { - flag = 1; - if (D_801DB9C8 < y) { - if (y - D_801DB9C8 < 5) { - D_801DB9C8 = y; - } else { - D_801DB9C8 = D_801DB9C8 + 4; - } - } else { - if (D_801DB9C8 - y < 5) { - D_801DB9C8 = y; - } else { - D_801DB9C8 = D_801DB9C8 - 4; - } - } - } - if (D_801DB9CC != z) { - flag = 1; - if (D_801DB9CC < z) { - if (z - D_801DB9CC < 5) { - D_801DB9CC = z; - } else { - D_801DB9CC = D_801DB9CC + 4; - } - } else { - if (D_801DB9CC - z < 5) { - D_801DB9CC = z; - } else { - D_801DB9CC = D_801DB9CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801DB9A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018CF0C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801DB994); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801DB9C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801DB9C8); - uVar5 = (*(int*)&D_801DB9CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018CF0C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801DB9AC; - -s32 func_8013E054(void) { - return D_801DB9AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8018D908; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8018D8E0; -extern s16 D_8018D8E2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8018D908; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8018D8E0 = 2; - D_8018D8E2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8018D8E2 = 0; - D_8018D8E0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801DB9E0; - extern void * D_801DB9E4; - extern unsigned char D_8018D580; - extern unsigned char D_8018D598; - extern unsigned char D_8018D60C; - extern unsigned char D_8018D614; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801DB9E0 = &D_8018D580; - D_801DB9E4 = &D_8018D60C; - } else { - D_801DB9E0 = &D_8018D598; - D_801DB9E4 = &D_8018D614; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8018D908/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018D908 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8018D908)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8018D8E4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018D8E4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018D8E4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8018D8E0; -extern s16 D_8018D8E2; -extern unsigned char D_8018D8E4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018D8E2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8018D8E0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8018D8E2; - if (*r < 3) { - *r = *r + 1; - } - D_8018D8E0 = (u16)D_8018D8E0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D8E4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8018D8E4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D8E4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_029/ov_SC06_029_jr_801380E0.c b/src/ov_SC06_029/ov_SC06_029_jr_801380E0.c new file mode 100644 index 000000000..fb6cbe3ac --- /dev/null +++ b/src/ov_SC06_029/ov_SC06_029_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801DA494; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8018C800[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801DB89C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801E2120; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801DA494; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8018C538)(); +extern s16 (*D_8018C53C)(); +extern M2C_UNK (*D_8018C544)(); +extern s32 (*D_8018C548)(); +extern s32 D_801DB898; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801DA498; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8018C894; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_8018FD78; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018C8AC; +extern M2C_UNK D_8018C8B4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8018C8BC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018C8D8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8018C8E4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8018C8F8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018C948[]; +extern s16 D_8018C978[]; +extern s16 D_8018C9D8[]; +extern s16 D_8018C9E0[]; +extern s16 D_8018CA00[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8018CA38[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8018CA90[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8018CAD8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8018CAE0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8018CAE8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8018CAF0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8018CA98; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8018CAB8; +extern void func_801321B0(int param_1); +extern int D_8018CAC8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801DB908; +extern s32 D_801DB90C[]; +extern int D_801DB910; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8018CAFC; +extern u8 D_8018CAF8; +extern s16 *D_8018CB00; +extern u8 D_8018CB04; +extern int D_801DB908; +extern u16 D_801DB918; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8018CB00; /* holds a pointer value (*(u16**)&D_8018CB00) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8018CB14[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8018CB68; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018CB6C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018CB6C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8018CBB0; +extern u8 D_8018CBF4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8018CBB0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8018CBF4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8018CC38[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8018CC74[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8018CC74; + if (((s16)a1) < 0xC00) { + tbl = D_8018CC38; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8018CCB0, D_8018CCB2, D_8018CCB4, D_8018CCB6, D_8018CCB8, D_8018CCBA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8018CCB2 < ang)) goto outer_else; + if (!(ang < D_8018CCB8)) goto inner_else; + if (ang < D_8018CCB4) { *(s16 *)L = D_8018CCB4; goto done; } + if (D_8018CCB6 < ang) { *(s16 *)L = D_8018CCB6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8018CCB0) { *(s16 *)L = D_8018CCB0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8018CCBA < ang) { *(s16 *)L = D_8018CCBA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801DB980; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801DB980, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801DB980; +extern s8 D_801DB984; +extern s8 D_801DB985; + +void func_8013C9C4(void * arg0) +{ + D_801DB980 = arg0; + D_801DB984 = 0; + D_801DB985 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801DB980; +extern s8 D_801DB984; +extern s8 D_801DB985; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801DB980; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801DB985; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801DB984)) * 2) + D_801DB980); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801DB985 = (unsigned char) p[1]; + D_801DB984 = D_801DB984 + 1; + if (D_801DB985 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801DB984 = 0; + *base = 0; + } + } + else + { + D_801DB985 = c - 1; + } + } + return; +} + + + +extern s32 D_801DB9A4; +extern s32 D_801DB998; +extern s32 D_801DB99C; +extern s32 D_801DB9A8; + +void func_8013CABC(void) { + D_801DB9A4 = 1; + D_801DB998 = 1; + D_801DB99C = 0; + D_801DB9A8 = 1; +} + + + +extern s32 D_801DB998; +extern s32 D_801DB99C; +extern s32 D_801DB9A0; +extern s32 D_801DB9A4; +extern s32 D_801DB9A8; + +void func_8013CAE8(void) { + D_801DB998 = 1; + D_801DB9A4 = 0; + D_801DB99C = 0; + D_801DB9A0 = -1; + D_801DB9A8 = 0; +} + + + +extern s32 D_801DB9A4; +extern s32 D_801DB9A8; +extern s32 D_801DB9D0; +extern s32 D_801DB9D4; + +void func_8013CB20(void) +{ + D_801DB9D0 = D_801DB9A8; + D_801DB9D4 = D_801DB9A4; + D_801DB9A8 = 1; + D_801DB9A4 = 0; +} + + + +extern s32 D_801DB9D0; +extern s32 D_801DB9D4; +extern s32 D_801DB9A8; +extern s32 D_801DB9A4; + +void func_8013CB5C(void) { + D_801DB9A8 = D_801DB9D0; + D_801DB9A4 = D_801DB9D4; +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801E2038; + extern u8 D_801E2039; + extern u8 D_801E203A; + extern u8 D_801E203B; + extern u8 D_801E203C; + extern u8 D_801E203D; + extern u8 D_801E203E; + extern u8 D_801E203F; + extern u8 D_801E2040; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801E2038; t1 = D_801E2039; t2 = D_801E203A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801E203B; t1 = D_801E203C; t2 = D_801E203D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801E203E; t1 = D_801E203F; t2 = D_801E2040; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801DB9B0; +extern s32 D_801DB998; +extern s32 D_801DB9B4; +extern s32 D_801DB9A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801DB9B0 != 0) { + if (D_801DB9B0 != 2) { + if (((D_801DB9B0 < 3) && (D_801DB9B0 == 1)) && + (D_801DB9B4 = D_801DB9B4 + 1, 0x23a < D_801DB9B4)) { + D_801DB998 = D_801DB9B0; + D_801DB9B0 = 2; + } + } else { + D_801DB998 = D_801DB998 + -1; + if (D_801DB998 == 0) { + D_801DB998 = D_801DB9B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801DB9A4 == 0) { + D_801DB9B0 = D_801DB9B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801DB9A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801DB9A4; +} + + + +extern s32 D_801DB9B0; + +void func_8013D164(void) { + D_801DB9B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801E211A; +extern u8 D_801E218E; +extern u8 D_801E2042; +extern u8 D_801E20FC; +extern u8 D_801E2020; +extern u8 D_801E2041; +extern s32 D_801E2100; + +void func_8013D330(void) { + if ((D_801E211A & 0xff) != D_801E218E) { + D_801E211A = ((D_801E211A & 0xff) < D_801E218E) ? (D_801E211A + 1) : (D_801E211A - 1); + } + if ((D_801E2042 & 0xff) != D_801E20FC) { + D_801E2042 = ((D_801E2042 & 0xff) < D_801E20FC) ? (D_801E2042 + 1) : (D_801E2042 - 1); + } + if ((D_801E2020 & 0xff) != D_801E2041) { + D_801E2020 = ((D_801E2020 & 0xff) < D_801E2041) ? (D_801E2020 + 1) : (D_801E2020 - 1); + } + D_801E2100 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801DB988; +extern void *D_801DB98C; +extern void *D_801DB990; +extern s32 D_801DB9B8; +extern s32 D_801DB9BC; +extern s32 D_801DB9C0; +extern s32 D_801E2074[]; + +extern u8 D_8018CDA8[]; +extern u8 D_8018CE50[]; +extern u8 D_8018CD00[]; +extern u8 D_8018CDFC[]; +extern u8 D_8018CE7C[]; +extern u8 D_8018CD54[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801DB9B8 = param_2; + D_801DB9BC = (param_2 >> 2) & 3; + D_801DB9C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801DB988 = D_8018CDA8; + D_801DB98C = D_8018CE50; + D_801DB990 = D_8018CD00; + } else { + D_801DB988 = D_8018CDFC; + D_801DB98C = D_8018CE7C; + D_801DB990 = D_8018CD54; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801DB9C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801DB9B8 & 2) != 0) { + D_801E2074[0] = 0x140; + D_801E2074[3] = 0x80; + if (p[0x37] == 4) { + D_801E2074[0] = 0x140; + D_801E2074[3] = 0; + } + if (p[0x37] == 0) { + D_801E2074[0] = 0x140; + D_801E2074[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801DB990)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801DB990; +extern s16 *D_801DB994; +extern s32 D_801DB9A4; +extern s32 D_801DB9C4; +extern s32 D_801DB9C8; +extern s32 D_801DB9CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801DB994 != 0) { + D_801DB9A4 = 0; + p = (int *)(param_1 * 12 + (int)D_801DB990); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801DB9C4 != x) { + flag = 1; + if (D_801DB9C4 < x) { + if (x - D_801DB9C4 < 5) { + D_801DB9C4 = x; + } else { + D_801DB9C4 = D_801DB9C4 + 4; + } + } else { + if (D_801DB9C4 - x < 5) { + D_801DB9C4 = x; + } else { + D_801DB9C4 = D_801DB9C4 - 4; + } + } + } + if (D_801DB9C8 != y) { + flag = 1; + if (D_801DB9C8 < y) { + if (y - D_801DB9C8 < 5) { + D_801DB9C8 = y; + } else { + D_801DB9C8 = D_801DB9C8 + 4; + } + } else { + if (D_801DB9C8 - y < 5) { + D_801DB9C8 = y; + } else { + D_801DB9C8 = D_801DB9C8 - 4; + } + } + } + if (D_801DB9CC != z) { + flag = 1; + if (D_801DB9CC < z) { + if (z - D_801DB9CC < 5) { + D_801DB9CC = z; + } else { + D_801DB9CC = D_801DB9CC + 4; + } + } else { + if (D_801DB9CC - z < 5) { + D_801DB9CC = z; + } else { + D_801DB9CC = D_801DB9CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801DB9A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018CF0C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801DB994); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801DB9C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801DB9C8); + uVar5 = (*(int*)&D_801DB9CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018CF0C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801DB9AC; + +s32 func_8013E054(void) { + return D_801DB9AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8018D908; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8018D8E0; +extern s16 D_8018D8E2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8018D908; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8018D8E0 = 2; + D_8018D8E2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8018D8E2 = 0; + D_8018D8E0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801DB9E0; + extern void * D_801DB9E4; + extern unsigned char D_8018D580; + extern unsigned char D_8018D598; + extern unsigned char D_8018D60C; + extern unsigned char D_8018D614; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801DB9E0 = &D_8018D580; + D_801DB9E4 = &D_8018D60C; + } else { + D_801DB9E0 = &D_8018D598; + D_801DB9E4 = &D_8018D614; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8018D908/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8018D908 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8018D908)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8018D8E4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8018D8E4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8018D8E4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8018D8E0; +extern s16 D_8018D8E2; +extern unsigned char D_8018D8E4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8018D8E2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8018D8E0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8018D8E2; + if (*r < 3) { + *r = *r + 1; + } + D_8018D8E0 = (u16)D_8018D8E0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D8E4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8018D8E4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8018D8E4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_030/ov_SC06_030_jr_8012ACE0.c b/src/ov_SC06_030/ov_SC06_030_jr_8012ACE0.c index 0c90acebf..dd0078c69 100644 --- a/src/ov_SC06_030/ov_SC06_030_jr_8012ACE0.c +++ b/src/ov_SC06_030/ov_SC06_030_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8018245C[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8018245C[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_801824A0; -extern u8 D_801824E4; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_801824A0; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801824E4 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182528[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182564[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182564; - if (((s16)a1) < 0xC00) { - tbl = D_80182528; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_801825A0, D_801825A2, D_801825A4, D_801825A6, D_801825A8, D_801825AA; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_801825A2 < ang)) goto outer_else; - if (!(ang < D_801825A8)) goto inner_else; - if (ang < D_801825A4) { *(s16 *)L = D_801825A4; goto done; } - if (D_801825A6 < ang) { *(s16 *)L = D_801825A6; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_801825A0) { *(s16 *)L = D_801825A0; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_801825AA < ang) { *(s16 *)L = D_801825AA; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801B8BE0; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801B8BE0, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801B8BE0; -extern s8 D_801B8BE4; -extern s8 D_801B8BE5; - -void func_8013C9C4(void * arg0) -{ - D_801B8BE0 = arg0; - D_801B8BE4 = 0; - D_801B8BE5 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801B8BE0; -extern s8 D_801B8BE4; -extern s8 D_801B8BE5; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801B8BE0; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801B8BE5; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801B8BE4)) * 2) + D_801B8BE0); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801B8BE5 = (unsigned char) p[1]; - D_801B8BE4 = D_801B8BE4 + 1; - if (D_801B8BE5 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801B8BE4 = 0; - *base = 0; - } - } - else - { - D_801B8BE5 = c - 1; - } - } - return; -} - - - -extern s32 D_801B8C04; -extern s32 D_801B8BF8; -extern s32 D_801B8BFC; -extern s32 D_801B8C08; - -void func_8013CABC(void) { - D_801B8C04 = 1; - D_801B8BF8 = 1; - D_801B8BFC = 0; - D_801B8C08 = 1; -} - - - -extern s32 D_801B8BF8; -extern s32 D_801B8BFC; -extern s32 D_801B8C00; -extern s32 D_801B8C04; -extern s32 D_801B8C08; - -void func_8013CAE8(void) { - D_801B8BF8 = 1; - D_801B8C04 = 0; - D_801B8BFC = 0; - D_801B8C00 = -1; - D_801B8C08 = 0; -} - - - -extern s32 D_801B8C04; -extern s32 D_801B8C08; -extern s32 D_801B8C30; -extern s32 D_801B8C34; - -void func_8013CB20(void) -{ - D_801B8C30 = D_801B8C08; - D_801B8C34 = D_801B8C04; - D_801B8C08 = 1; - D_801B8C04 = 0; -} - - - -extern s32 D_801B8C30; -extern s32 D_801B8C34; -extern s32 D_801B8C08; -extern s32 D_801B8C04; - -void func_8013CB5C(void) { - D_801B8C08 = D_801B8C30; - D_801B8C04 = D_801B8C34; -} - - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801B9F30; - extern u8 D_801B9F31; - extern u8 D_801B9F32; - extern u8 D_801B9F33; - extern u8 D_801B9F34; - extern u8 D_801B9F35; - extern u8 D_801B9F36; - extern u8 D_801B9F37; - extern u8 D_801B9F38; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801B9F30; t1 = D_801B9F31; t2 = D_801B9F32; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801B9F33; t1 = D_801B9F34; t2 = D_801B9F35; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801B9F36; t1 = D_801B9F37; t2 = D_801B9F38; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801B8C10; -extern s32 D_801B8BF8; -extern s32 D_801B8C14; -extern s32 D_801B8C04; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801B8C10 != 0) { - if (D_801B8C10 != 2) { - if (((D_801B8C10 < 3) && (D_801B8C10 == 1)) && - (D_801B8C14 = D_801B8C14 + 1, 0x23a < D_801B8C14)) { - D_801B8BF8 = D_801B8C10; - D_801B8C10 = 2; - } - } else { - D_801B8BF8 = D_801B8BF8 + -1; - if (D_801B8BF8 == 0) { - D_801B8BF8 = D_801B8C10; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801B8C04 == 0) { - D_801B8C10 = D_801B8C10 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801B8C04; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801B8C04; -} - - - -extern s32 D_801B8C10; - -void func_8013D164(void) { - D_801B8C10 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801BA012; -extern u8 D_801BA086; -extern u8 D_801B9F3A; -extern u8 D_801B9FF4; -extern u8 D_801B9F18; -extern u8 D_801B9F39; -extern s32 D_801B9FF8; - -void func_8013D330(void) { - if ((D_801BA012 & 0xff) != D_801BA086) { - D_801BA012 = ((D_801BA012 & 0xff) < D_801BA086) ? (D_801BA012 + 1) : (D_801BA012 - 1); - } - if ((D_801B9F3A & 0xff) != D_801B9FF4) { - D_801B9F3A = ((D_801B9F3A & 0xff) < D_801B9FF4) ? (D_801B9F3A + 1) : (D_801B9F3A - 1); - } - if ((D_801B9F18 & 0xff) != D_801B9F39) { - D_801B9F18 = ((D_801B9F18 & 0xff) < D_801B9F39) ? (D_801B9F18 + 1) : (D_801B9F18 - 1); - } - D_801B9FF8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801B8BE8; -extern void *D_801B8BEC; -extern void *D_801B8BF0; -extern s32 D_801B8C18; -extern s32 D_801B8C1C; -extern s32 D_801B8C20; -extern s32 D_801B9F6C[]; - -extern u8 D_80182698[]; -extern u8 D_80182740[]; -extern u8 D_801825F0[]; -extern u8 D_801826EC[]; -extern u8 D_8018276C[]; -extern u8 D_80182644[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801B8C18 = param_2; - D_801B8C1C = (param_2 >> 2) & 3; - D_801B8C20 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801B8BE8 = D_80182698; - D_801B8BEC = D_80182740; - D_801B8BF0 = D_801825F0; - } else { - D_801B8BE8 = D_801826EC; - D_801B8BEC = D_8018276C; - D_801B8BF0 = D_80182644; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801B8C20 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801B8C18 & 2) != 0) { - D_801B9F6C[0] = 0x140; - D_801B9F6C[3] = 0x80; - if (p[0x37] == 4) { - D_801B9F6C[0] = 0x140; - D_801B9F6C[3] = 0; - } - if (p[0x37] == 0) { - D_801B9F6C[0] = 0x140; - D_801B9F6C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801B8BF0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801B8BF0; -extern s16 *D_801B8BF4; -extern s32 D_801B8C04; -extern s32 D_801B8C24; -extern s32 D_801B8C28; -extern s32 D_801B8C2C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801B8BF4 != 0) { - D_801B8C04 = 0; - p = (int *)(param_1 * 12 + (int)D_801B8BF0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801B8C24 != x) { - flag = 1; - if (D_801B8C24 < x) { - if (x - D_801B8C24 < 5) { - D_801B8C24 = x; - } else { - D_801B8C24 = D_801B8C24 + 4; - } - } else { - if (D_801B8C24 - x < 5) { - D_801B8C24 = x; - } else { - D_801B8C24 = D_801B8C24 - 4; - } - } - } - if (D_801B8C28 != y) { - flag = 1; - if (D_801B8C28 < y) { - if (y - D_801B8C28 < 5) { - D_801B8C28 = y; - } else { - D_801B8C28 = D_801B8C28 + 4; - } - } else { - if (D_801B8C28 - y < 5) { - D_801B8C28 = y; - } else { - D_801B8C28 = D_801B8C28 - 4; - } - } - } - if (D_801B8C2C != z) { - flag = 1; - if (D_801B8C2C < z) { - if (z - D_801B8C2C < 5) { - D_801B8C2C = z; - } else { - D_801B8C2C = D_801B8C2C + 4; - } - } else { - if (D_801B8C2C - z < 5) { - D_801B8C2C = z; - } else { - D_801B8C2C = D_801B8C2C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801B8C04 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801827FC[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801B8BF4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B8C24); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B8C28); - uVar5 = (*(int*)&D_801B8C2C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801827FC); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801B8C0C; - -s32 func_8013E054(void) { - return D_801B8C0C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801831F8; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801831D0; -extern s16 D_801831D2; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801831F8; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801831D0 = 2; - D_801831D2 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801831D2 = 0; - D_801831D0 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801B8C40; - extern void * D_801B8C44; - extern unsigned char D_80182E70; - extern unsigned char D_80182E88; - extern unsigned char D_80182EFC; - extern unsigned char D_80182F04; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801B8C40 = &D_80182E70; - D_801B8C44 = &D_80182EFC; - } else { - D_801B8C40 = &D_80182E88; - D_801B8C44 = &D_80182F04; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801831F8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801831F8 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801831F8)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801831D4; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801831D4)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801831D4)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801831D0; -extern s16 D_801831D2; -extern unsigned char D_801831D4; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801831D2` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801831D0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801831D2; - if (*r < 3) { - *r = *r + 1; - } - D_801831D0 = (u16)D_801831D0 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831D4); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801831D4; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831D4); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_030/ov_SC06_030_jr_801380E0.c b/src/ov_SC06_030/ov_SC06_030_jr_801380E0.c new file mode 100644 index 000000000..f9681294d --- /dev/null +++ b/src/ov_SC06_030/ov_SC06_030_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801B77F8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801820F0[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801B8AFC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801BA018; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801B77F8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181E2C)(); +extern s16 (*D_80181E30)(); +extern M2C_UNK (*D_80181E38)(); +extern s32 (*D_80181E3C)(); +extern s32 D_801B8AF8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801B77FC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80182184; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185668; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8018219C; +extern M2C_UNK D_801821A4; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801821AC; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801821C8[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801821D4[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801821E8[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182238[]; +extern s16 D_80182268[]; +extern s16 D_801822C8[]; +extern s16 D_801822D0[]; +extern s16 D_801822F0[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182328[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182380[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_801823C8[])(void); +extern void func_80131F28(void *a0); +extern void (*D_801823D0[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801823D8[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801823E0[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182388; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_801823A8; +extern void func_801321B0(int param_1); +extern int D_801823B8; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801B8B68; +extern s32 D_801B8B6C[]; +extern int D_801B8B70; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801823EC; +extern u8 D_801823E8; +extern s16 *D_801823F0; +extern u8 D_801823F4; +extern int D_801B8B68; +extern u16 D_801B8B78; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801823F0; /* holds a pointer value (*(u16**)&D_801823F0) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182404[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182458; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8018245C[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8018245C[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_801824A0; +extern u8 D_801824E4; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_801824A0; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801824E4 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182528[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182564[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182564; + if (((s16)a1) < 0xC00) { + tbl = D_80182528; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_801825A0, D_801825A2, D_801825A4, D_801825A6, D_801825A8, D_801825AA; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_801825A2 < ang)) goto outer_else; + if (!(ang < D_801825A8)) goto inner_else; + if (ang < D_801825A4) { *(s16 *)L = D_801825A4; goto done; } + if (D_801825A6 < ang) { *(s16 *)L = D_801825A6; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_801825A0) { *(s16 *)L = D_801825A0; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_801825AA < ang) { *(s16 *)L = D_801825AA; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801B8BE0; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801B8BE0, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801B8BE0; +extern s8 D_801B8BE4; +extern s8 D_801B8BE5; + +void func_8013C9C4(void * arg0) +{ + D_801B8BE0 = arg0; + D_801B8BE4 = 0; + D_801B8BE5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801B8BE0; +extern s8 D_801B8BE4; +extern s8 D_801B8BE5; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801B8BE0; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801B8BE5; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801B8BE4)) * 2) + D_801B8BE0); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801B8BE5 = (unsigned char) p[1]; + D_801B8BE4 = D_801B8BE4 + 1; + if (D_801B8BE5 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801B8BE4 = 0; + *base = 0; + } + } + else + { + D_801B8BE5 = c - 1; + } + } + return; +} + + + +extern s32 D_801B8C04; +extern s32 D_801B8BF8; +extern s32 D_801B8BFC; +extern s32 D_801B8C08; + +void func_8013CABC(void) { + D_801B8C04 = 1; + D_801B8BF8 = 1; + D_801B8BFC = 0; + D_801B8C08 = 1; +} + + + +extern s32 D_801B8BF8; +extern s32 D_801B8BFC; +extern s32 D_801B8C00; +extern s32 D_801B8C04; +extern s32 D_801B8C08; + +void func_8013CAE8(void) { + D_801B8BF8 = 1; + D_801B8C04 = 0; + D_801B8BFC = 0; + D_801B8C00 = -1; + D_801B8C08 = 0; +} + + + +extern s32 D_801B8C04; +extern s32 D_801B8C08; +extern s32 D_801B8C30; +extern s32 D_801B8C34; + +void func_8013CB20(void) +{ + D_801B8C30 = D_801B8C08; + D_801B8C34 = D_801B8C04; + D_801B8C08 = 1; + D_801B8C04 = 0; +} + + + +extern s32 D_801B8C30; +extern s32 D_801B8C34; +extern s32 D_801B8C08; +extern s32 D_801B8C04; + +void func_8013CB5C(void) { + D_801B8C08 = D_801B8C30; + D_801B8C04 = D_801B8C34; +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801B9F30; + extern u8 D_801B9F31; + extern u8 D_801B9F32; + extern u8 D_801B9F33; + extern u8 D_801B9F34; + extern u8 D_801B9F35; + extern u8 D_801B9F36; + extern u8 D_801B9F37; + extern u8 D_801B9F38; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801B9F30; t1 = D_801B9F31; t2 = D_801B9F32; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801B9F33; t1 = D_801B9F34; t2 = D_801B9F35; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801B9F36; t1 = D_801B9F37; t2 = D_801B9F38; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801B8C10; +extern s32 D_801B8BF8; +extern s32 D_801B8C14; +extern s32 D_801B8C04; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801B8C10 != 0) { + if (D_801B8C10 != 2) { + if (((D_801B8C10 < 3) && (D_801B8C10 == 1)) && + (D_801B8C14 = D_801B8C14 + 1, 0x23a < D_801B8C14)) { + D_801B8BF8 = D_801B8C10; + D_801B8C10 = 2; + } + } else { + D_801B8BF8 = D_801B8BF8 + -1; + if (D_801B8BF8 == 0) { + D_801B8BF8 = D_801B8C10; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801B8C04 == 0) { + D_801B8C10 = D_801B8C10 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801B8C04; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801B8C04; +} + + + +extern s32 D_801B8C10; + +void func_8013D164(void) { + D_801B8C10 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801BA012; +extern u8 D_801BA086; +extern u8 D_801B9F3A; +extern u8 D_801B9FF4; +extern u8 D_801B9F18; +extern u8 D_801B9F39; +extern s32 D_801B9FF8; + +void func_8013D330(void) { + if ((D_801BA012 & 0xff) != D_801BA086) { + D_801BA012 = ((D_801BA012 & 0xff) < D_801BA086) ? (D_801BA012 + 1) : (D_801BA012 - 1); + } + if ((D_801B9F3A & 0xff) != D_801B9FF4) { + D_801B9F3A = ((D_801B9F3A & 0xff) < D_801B9FF4) ? (D_801B9F3A + 1) : (D_801B9F3A - 1); + } + if ((D_801B9F18 & 0xff) != D_801B9F39) { + D_801B9F18 = ((D_801B9F18 & 0xff) < D_801B9F39) ? (D_801B9F18 + 1) : (D_801B9F18 - 1); + } + D_801B9FF8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801B8BE8; +extern void *D_801B8BEC; +extern void *D_801B8BF0; +extern s32 D_801B8C18; +extern s32 D_801B8C1C; +extern s32 D_801B8C20; +extern s32 D_801B9F6C[]; + +extern u8 D_80182698[]; +extern u8 D_80182740[]; +extern u8 D_801825F0[]; +extern u8 D_801826EC[]; +extern u8 D_8018276C[]; +extern u8 D_80182644[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801B8C18 = param_2; + D_801B8C1C = (param_2 >> 2) & 3; + D_801B8C20 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801B8BE8 = D_80182698; + D_801B8BEC = D_80182740; + D_801B8BF0 = D_801825F0; + } else { + D_801B8BE8 = D_801826EC; + D_801B8BEC = D_8018276C; + D_801B8BF0 = D_80182644; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801B8C20 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801B8C18 & 2) != 0) { + D_801B9F6C[0] = 0x140; + D_801B9F6C[3] = 0x80; + if (p[0x37] == 4) { + D_801B9F6C[0] = 0x140; + D_801B9F6C[3] = 0; + } + if (p[0x37] == 0) { + D_801B9F6C[0] = 0x140; + D_801B9F6C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801B8BF0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801B8BF0; +extern s16 *D_801B8BF4; +extern s32 D_801B8C04; +extern s32 D_801B8C24; +extern s32 D_801B8C28; +extern s32 D_801B8C2C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801B8BF4 != 0) { + D_801B8C04 = 0; + p = (int *)(param_1 * 12 + (int)D_801B8BF0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801B8C24 != x) { + flag = 1; + if (D_801B8C24 < x) { + if (x - D_801B8C24 < 5) { + D_801B8C24 = x; + } else { + D_801B8C24 = D_801B8C24 + 4; + } + } else { + if (D_801B8C24 - x < 5) { + D_801B8C24 = x; + } else { + D_801B8C24 = D_801B8C24 - 4; + } + } + } + if (D_801B8C28 != y) { + flag = 1; + if (D_801B8C28 < y) { + if (y - D_801B8C28 < 5) { + D_801B8C28 = y; + } else { + D_801B8C28 = D_801B8C28 + 4; + } + } else { + if (D_801B8C28 - y < 5) { + D_801B8C28 = y; + } else { + D_801B8C28 = D_801B8C28 - 4; + } + } + } + if (D_801B8C2C != z) { + flag = 1; + if (D_801B8C2C < z) { + if (z - D_801B8C2C < 5) { + D_801B8C2C = z; + } else { + D_801B8C2C = D_801B8C2C + 4; + } + } else { + if (D_801B8C2C - z < 5) { + D_801B8C2C = z; + } else { + D_801B8C2C = D_801B8C2C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801B8C04 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801827FC[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801B8BF4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801B8C24); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801B8C28); + uVar5 = (*(int*)&D_801B8C2C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801827FC); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801B8C0C; + +s32 func_8013E054(void) { + return D_801B8C0C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801831F8; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801831D0; +extern s16 D_801831D2; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801831F8; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801831D0 = 2; + D_801831D2 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801831D2 = 0; + D_801831D0 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801B8C40; + extern void * D_801B8C44; + extern unsigned char D_80182E70; + extern unsigned char D_80182E88; + extern unsigned char D_80182EFC; + extern unsigned char D_80182F04; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801B8C40 = &D_80182E70; + D_801B8C44 = &D_80182EFC; + } else { + D_801B8C40 = &D_80182E88; + D_801B8C44 = &D_80182F04; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801831F8/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801831F8 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801831F8)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801831D4; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801831D4)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801831D4)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801831D0; +extern s16 D_801831D2; +extern unsigned char D_801831D4; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801831D2` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801831D0` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801831D2; + if (*r < 3) { + *r = *r + 1; + } + D_801831D0 = (u16)D_801831D0 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831D4); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801831D4; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801831D4); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_032/ov_SC06_032_jr_8012ACE0.c b/src/ov_SC06_032/ov_SC06_032_jr_8012ACE0.c index 7ec8964f4..95877ddde 100644 --- a/src/ov_SC06_032/ov_SC06_032_jr_8012ACE0.c +++ b/src/ov_SC06_032/ov_SC06_032_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80193928[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80193928[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8019396C; -extern u8 D_801939B0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8019396C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_801939B0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_801939F4[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80193A30[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80193A30; - if (((s16)a1) < 0xC00) { - tbl = D_801939F4; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80193A6C, D_80193A6E, D_80193A70, D_80193A72, D_80193A74, D_80193A76; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80193A6E < ang)) goto outer_else; - if (!(ang < D_80193A74)) goto inner_else; - if (ang < D_80193A70) { *(s16 *)L = D_80193A70; goto done; } - if (D_80193A72 < ang) { *(s16 *)L = D_80193A72; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80193A6C) { *(s16 *)L = D_80193A6C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80193A76 < ang) { *(s16 *)L = D_80193A76; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CF290; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CF290, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CF290; -extern s8 D_801CF294; -extern s8 D_801CF295; - -void func_8013C9C4(void * arg0) -{ - D_801CF290 = arg0; - D_801CF294 = 0; - D_801CF295 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CF290; -extern s8 D_801CF294; -extern s8 D_801CF295; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CF290; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CF295; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CF294)) * 2) + D_801CF290); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CF295 = (unsigned char) p[1]; - D_801CF294 = D_801CF294 + 1; - if (D_801CF295 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CF294 = 0; - *base = 0; - } - } - else - { - D_801CF295 = c - 1; - } - } - return; -} - - - -extern s32 D_801CF2B4; -extern s32 D_801CF2A8; -extern s32 D_801CF2AC; -extern s32 D_801CF2B8; - -void func_8013CABC(void) { - D_801CF2B4 = 1; - D_801CF2A8 = 1; - D_801CF2AC = 0; - D_801CF2B8 = 1; -} - - - -extern s32 D_801CF2A8; -extern s32 D_801CF2AC; -extern s32 D_801CF2B0; -extern s32 D_801CF2B4; -extern s32 D_801CF2B8; - -void func_8013CAE8(void) { - D_801CF2A8 = 1; - D_801CF2B4 = 0; - D_801CF2AC = 0; - D_801CF2B0 = -1; - D_801CF2B8 = 0; -} - - - -extern s32 D_801CF2B4; -extern s32 D_801CF2B8; -extern s32 D_801CF2E0; -extern s32 D_801CF2E4; - -void func_8013CB20(void) -{ - D_801CF2E0 = D_801CF2B8; - D_801CF2E4 = D_801CF2B4; - D_801CF2B8 = 1; - D_801CF2B4 = 0; -} - - - -extern s32 D_801CF2E0; -extern s32 D_801CF2E4; -extern s32 D_801CF2B8; -extern s32 D_801CF2B4; - -void func_8013CB5C(void) { - D_801CF2B8 = D_801CF2E0; - D_801CF2B4 = D_801CF2E4; -} - - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D1018; - extern u8 D_801D1019; - extern u8 D_801D101A; - extern u8 D_801D101B; - extern u8 D_801D101C; - extern u8 D_801D101D; - extern u8 D_801D101E; - extern u8 D_801D101F; - extern u8 D_801D1020; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D1018; t1 = D_801D1019; t2 = D_801D101A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D101B; t1 = D_801D101C; t2 = D_801D101D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D101E; t1 = D_801D101F; t2 = D_801D1020; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CF2C0; -extern s32 D_801CF2A8; -extern s32 D_801CF2C4; -extern s32 D_801CF2B4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CF2C0 != 0) { - if (D_801CF2C0 != 2) { - if (((D_801CF2C0 < 3) && (D_801CF2C0 == 1)) && - (D_801CF2C4 = D_801CF2C4 + 1, 0x23a < D_801CF2C4)) { - D_801CF2A8 = D_801CF2C0; - D_801CF2C0 = 2; - } - } else { - D_801CF2A8 = D_801CF2A8 + -1; - if (D_801CF2A8 == 0) { - D_801CF2A8 = D_801CF2C0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CF2B4 == 0) { - D_801CF2C0 = D_801CF2C0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CF2B4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CF2B4; -} - - - -extern s32 D_801CF2C0; - -void func_8013D164(void) { - D_801CF2C0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D10FA; -extern u8 D_801D116E; -extern u8 D_801D1022; -extern u8 D_801D10DC; -extern u8 D_801D1000; -extern u8 D_801D1021; -extern s32 D_801D10E0; - -void func_8013D330(void) { - if ((D_801D10FA & 0xff) != D_801D116E) { - D_801D10FA = ((D_801D10FA & 0xff) < D_801D116E) ? (D_801D10FA + 1) : (D_801D10FA - 1); - } - if ((D_801D1022 & 0xff) != D_801D10DC) { - D_801D1022 = ((D_801D1022 & 0xff) < D_801D10DC) ? (D_801D1022 + 1) : (D_801D1022 - 1); - } - if ((D_801D1000 & 0xff) != D_801D1021) { - D_801D1000 = ((D_801D1000 & 0xff) < D_801D1021) ? (D_801D1000 + 1) : (D_801D1000 - 1); - } - D_801D10E0 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CF298; -extern void *D_801CF29C; -extern void *D_801CF2A0; -extern s32 D_801CF2C8; -extern s32 D_801CF2CC; -extern s32 D_801CF2D0; -extern s32 D_801D1054[]; - -extern u8 D_80193B64[]; -extern u8 D_80193C0C[]; -extern u8 D_80193ABC[]; -extern u8 D_80193BB8[]; -extern u8 D_80193C38[]; -extern u8 D_80193B10[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CF2C8 = param_2; - D_801CF2CC = (param_2 >> 2) & 3; - D_801CF2D0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CF298 = D_80193B64; - D_801CF29C = D_80193C0C; - D_801CF2A0 = D_80193ABC; - } else { - D_801CF298 = D_80193BB8; - D_801CF29C = D_80193C38; - D_801CF2A0 = D_80193B10; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CF2D0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CF2C8 & 2) != 0) { - D_801D1054[0] = 0x140; - D_801D1054[3] = 0x80; - if (p[0x37] == 4) { - D_801D1054[0] = 0x140; - D_801D1054[3] = 0; - } - if (p[0x37] == 0) { - D_801D1054[0] = 0x140; - D_801D1054[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CF2A0)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CF2A0; -extern s16 *D_801CF2A4; -extern s32 D_801CF2B4; -extern s32 D_801CF2D4; -extern s32 D_801CF2D8; -extern s32 D_801CF2DC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CF2A4 != 0) { - D_801CF2B4 = 0; - p = (int *)(param_1 * 12 + (int)D_801CF2A0); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CF2D4 != x) { - flag = 1; - if (D_801CF2D4 < x) { - if (x - D_801CF2D4 < 5) { - D_801CF2D4 = x; - } else { - D_801CF2D4 = D_801CF2D4 + 4; - } - } else { - if (D_801CF2D4 - x < 5) { - D_801CF2D4 = x; - } else { - D_801CF2D4 = D_801CF2D4 - 4; - } - } - } - if (D_801CF2D8 != y) { - flag = 1; - if (D_801CF2D8 < y) { - if (y - D_801CF2D8 < 5) { - D_801CF2D8 = y; - } else { - D_801CF2D8 = D_801CF2D8 + 4; - } - } else { - if (D_801CF2D8 - y < 5) { - D_801CF2D8 = y; - } else { - D_801CF2D8 = D_801CF2D8 - 4; - } - } - } - if (D_801CF2DC != z) { - flag = 1; - if (D_801CF2DC < z) { - if (z - D_801CF2DC < 5) { - D_801CF2DC = z; - } else { - D_801CF2DC = D_801CF2DC + 4; - } - } else { - if (D_801CF2DC - z < 5) { - D_801CF2DC = z; - } else { - D_801CF2DC = D_801CF2DC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CF2B4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80193CC8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CF2A4); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CF2D4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CF2D8); - uVar5 = (*(int*)&D_801CF2DC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80193CC8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CF2BC; - -s32 func_8013E054(void) { - return D_801CF2BC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801946C4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8019469C; -extern s16 D_8019469E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801946C4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8019469C = 2; - D_8019469E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8019469E = 0; - D_8019469C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CF2F0; - extern void * D_801CF2F4; - extern unsigned char D_8019433C; - extern unsigned char D_80194354; - extern unsigned char D_801943C8; - extern unsigned char D_801943D0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CF2F0 = &D_8019433C; - D_801CF2F4 = &D_801943C8; - } else { - D_801CF2F0 = &D_80194354; - D_801CF2F4 = &D_801943D0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801946C4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801946C4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801946C4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801946A0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801946A0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801946A0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8019469C; -extern s16 D_8019469E; -extern unsigned char D_801946A0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8019469E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8019469C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8019469E; - if (*r < 3) { - *r = *r + 1; - } - D_8019469C = (u16)D_8019469C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801946A0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801946A0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801946A0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_032/ov_SC06_032_jr_801380E0.c b/src/ov_SC06_032/ov_SC06_032_jr_801380E0.c new file mode 100644 index 000000000..2618dc4a3 --- /dev/null +++ b/src/ov_SC06_032/ov_SC06_032_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CDE54; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801935BC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CF1AC; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D1100; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CDE54; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801932F8)(); +extern s16 (*D_801932FC)(); +extern M2C_UNK (*D_80193304)(); +extern s32 (*D_80193308)(); +extern s32 D_801CF1A8; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CDE58; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80193650; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80196B34; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80193668; +extern M2C_UNK D_80193670; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80193678; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80193694[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801936A0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801936B4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80193704[]; +extern s16 D_80193734[]; +extern s16 D_80193794[]; +extern s16 D_8019379C[]; +extern s16 D_801937BC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801937F4[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8019384C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80193894[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8019389C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_801938A4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_801938AC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80193854; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80193874; +extern void func_801321B0(int param_1); +extern int D_80193884; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CF218; +extern s32 D_801CF21C[]; +extern int D_801CF220; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_801938B8; +extern u8 D_801938B4; +extern s16 *D_801938BC; +extern u8 D_801938C0; +extern int D_801CF218; +extern u16 D_801CF228; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_801938BC; /* holds a pointer value (*(u16**)&D_801938BC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_801938D0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80193924; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80193928[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80193928[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8019396C; +extern u8 D_801939B0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8019396C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_801939B0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_801939F4[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80193A30[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80193A30; + if (((s16)a1) < 0xC00) { + tbl = D_801939F4; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80193A6C, D_80193A6E, D_80193A70, D_80193A72, D_80193A74, D_80193A76; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80193A6E < ang)) goto outer_else; + if (!(ang < D_80193A74)) goto inner_else; + if (ang < D_80193A70) { *(s16 *)L = D_80193A70; goto done; } + if (D_80193A72 < ang) { *(s16 *)L = D_80193A72; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80193A6C) { *(s16 *)L = D_80193A6C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80193A76 < ang) { *(s16 *)L = D_80193A76; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CF290; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CF290, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CF290; +extern s8 D_801CF294; +extern s8 D_801CF295; + +void func_8013C9C4(void * arg0) +{ + D_801CF290 = arg0; + D_801CF294 = 0; + D_801CF295 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CF290; +extern s8 D_801CF294; +extern s8 D_801CF295; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CF290; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CF295; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CF294)) * 2) + D_801CF290); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CF295 = (unsigned char) p[1]; + D_801CF294 = D_801CF294 + 1; + if (D_801CF295 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CF294 = 0; + *base = 0; + } + } + else + { + D_801CF295 = c - 1; + } + } + return; +} + + + +extern s32 D_801CF2B4; +extern s32 D_801CF2A8; +extern s32 D_801CF2AC; +extern s32 D_801CF2B8; + +void func_8013CABC(void) { + D_801CF2B4 = 1; + D_801CF2A8 = 1; + D_801CF2AC = 0; + D_801CF2B8 = 1; +} + + + +extern s32 D_801CF2A8; +extern s32 D_801CF2AC; +extern s32 D_801CF2B0; +extern s32 D_801CF2B4; +extern s32 D_801CF2B8; + +void func_8013CAE8(void) { + D_801CF2A8 = 1; + D_801CF2B4 = 0; + D_801CF2AC = 0; + D_801CF2B0 = -1; + D_801CF2B8 = 0; +} + + + +extern s32 D_801CF2B4; +extern s32 D_801CF2B8; +extern s32 D_801CF2E0; +extern s32 D_801CF2E4; + +void func_8013CB20(void) +{ + D_801CF2E0 = D_801CF2B8; + D_801CF2E4 = D_801CF2B4; + D_801CF2B8 = 1; + D_801CF2B4 = 0; +} + + + +extern s32 D_801CF2E0; +extern s32 D_801CF2E4; +extern s32 D_801CF2B8; +extern s32 D_801CF2B4; + +void func_8013CB5C(void) { + D_801CF2B8 = D_801CF2E0; + D_801CF2B4 = D_801CF2E4; +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D1018; + extern u8 D_801D1019; + extern u8 D_801D101A; + extern u8 D_801D101B; + extern u8 D_801D101C; + extern u8 D_801D101D; + extern u8 D_801D101E; + extern u8 D_801D101F; + extern u8 D_801D1020; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D1018; t1 = D_801D1019; t2 = D_801D101A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D101B; t1 = D_801D101C; t2 = D_801D101D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D101E; t1 = D_801D101F; t2 = D_801D1020; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CF2C0; +extern s32 D_801CF2A8; +extern s32 D_801CF2C4; +extern s32 D_801CF2B4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CF2C0 != 0) { + if (D_801CF2C0 != 2) { + if (((D_801CF2C0 < 3) && (D_801CF2C0 == 1)) && + (D_801CF2C4 = D_801CF2C4 + 1, 0x23a < D_801CF2C4)) { + D_801CF2A8 = D_801CF2C0; + D_801CF2C0 = 2; + } + } else { + D_801CF2A8 = D_801CF2A8 + -1; + if (D_801CF2A8 == 0) { + D_801CF2A8 = D_801CF2C0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CF2B4 == 0) { + D_801CF2C0 = D_801CF2C0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CF2B4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CF2B4; +} + + + +extern s32 D_801CF2C0; + +void func_8013D164(void) { + D_801CF2C0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D10FA; +extern u8 D_801D116E; +extern u8 D_801D1022; +extern u8 D_801D10DC; +extern u8 D_801D1000; +extern u8 D_801D1021; +extern s32 D_801D10E0; + +void func_8013D330(void) { + if ((D_801D10FA & 0xff) != D_801D116E) { + D_801D10FA = ((D_801D10FA & 0xff) < D_801D116E) ? (D_801D10FA + 1) : (D_801D10FA - 1); + } + if ((D_801D1022 & 0xff) != D_801D10DC) { + D_801D1022 = ((D_801D1022 & 0xff) < D_801D10DC) ? (D_801D1022 + 1) : (D_801D1022 - 1); + } + if ((D_801D1000 & 0xff) != D_801D1021) { + D_801D1000 = ((D_801D1000 & 0xff) < D_801D1021) ? (D_801D1000 + 1) : (D_801D1000 - 1); + } + D_801D10E0 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CF298; +extern void *D_801CF29C; +extern void *D_801CF2A0; +extern s32 D_801CF2C8; +extern s32 D_801CF2CC; +extern s32 D_801CF2D0; +extern s32 D_801D1054[]; + +extern u8 D_80193B64[]; +extern u8 D_80193C0C[]; +extern u8 D_80193ABC[]; +extern u8 D_80193BB8[]; +extern u8 D_80193C38[]; +extern u8 D_80193B10[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CF2C8 = param_2; + D_801CF2CC = (param_2 >> 2) & 3; + D_801CF2D0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CF298 = D_80193B64; + D_801CF29C = D_80193C0C; + D_801CF2A0 = D_80193ABC; + } else { + D_801CF298 = D_80193BB8; + D_801CF29C = D_80193C38; + D_801CF2A0 = D_80193B10; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CF2D0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CF2C8 & 2) != 0) { + D_801D1054[0] = 0x140; + D_801D1054[3] = 0x80; + if (p[0x37] == 4) { + D_801D1054[0] = 0x140; + D_801D1054[3] = 0; + } + if (p[0x37] == 0) { + D_801D1054[0] = 0x140; + D_801D1054[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CF2A0)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CF2A0; +extern s16 *D_801CF2A4; +extern s32 D_801CF2B4; +extern s32 D_801CF2D4; +extern s32 D_801CF2D8; +extern s32 D_801CF2DC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CF2A4 != 0) { + D_801CF2B4 = 0; + p = (int *)(param_1 * 12 + (int)D_801CF2A0); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CF2D4 != x) { + flag = 1; + if (D_801CF2D4 < x) { + if (x - D_801CF2D4 < 5) { + D_801CF2D4 = x; + } else { + D_801CF2D4 = D_801CF2D4 + 4; + } + } else { + if (D_801CF2D4 - x < 5) { + D_801CF2D4 = x; + } else { + D_801CF2D4 = D_801CF2D4 - 4; + } + } + } + if (D_801CF2D8 != y) { + flag = 1; + if (D_801CF2D8 < y) { + if (y - D_801CF2D8 < 5) { + D_801CF2D8 = y; + } else { + D_801CF2D8 = D_801CF2D8 + 4; + } + } else { + if (D_801CF2D8 - y < 5) { + D_801CF2D8 = y; + } else { + D_801CF2D8 = D_801CF2D8 - 4; + } + } + } + if (D_801CF2DC != z) { + flag = 1; + if (D_801CF2DC < z) { + if (z - D_801CF2DC < 5) { + D_801CF2DC = z; + } else { + D_801CF2DC = D_801CF2DC + 4; + } + } else { + if (D_801CF2DC - z < 5) { + D_801CF2DC = z; + } else { + D_801CF2DC = D_801CF2DC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CF2B4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80193CC8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CF2A4); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CF2D4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CF2D8); + uVar5 = (*(int*)&D_801CF2DC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80193CC8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CF2BC; + +s32 func_8013E054(void) { + return D_801CF2BC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801946C4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8019469C; +extern s16 D_8019469E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801946C4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8019469C = 2; + D_8019469E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8019469E = 0; + D_8019469C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CF2F0; + extern void * D_801CF2F4; + extern unsigned char D_8019433C; + extern unsigned char D_80194354; + extern unsigned char D_801943C8; + extern unsigned char D_801943D0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CF2F0 = &D_8019433C; + D_801CF2F4 = &D_801943C8; + } else { + D_801CF2F0 = &D_80194354; + D_801CF2F4 = &D_801943D0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801946C4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801946C4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801946C4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801946A0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801946A0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801946A0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8019469C; +extern s16 D_8019469E; +extern unsigned char D_801946A0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8019469E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8019469C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8019469E; + if (*r < 3) { + *r = *r + 1; + } + D_8019469C = (u16)D_8019469C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801946A0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801946A0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801946A0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_032/nonmatchings/ov_SC06_032_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC06_033/ov_SC06_033_jr_8012ACE0.c b/src/ov_SC06_033/ov_SC06_033_jr_8012ACE0.c index b0c1f7453..df910d7bb 100644 --- a/src/ov_SC06_033/ov_SC06_033_jr_8012ACE0.c +++ b/src/ov_SC06_033/ov_SC06_033_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80191E38[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80191E38[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80191E7C; -extern u8 D_80191EC0; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80191E7C; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80191EC0 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80191F04[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80191F40[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80191F40; - if (((s16)a1) < 0xC00) { - tbl = D_80191F04; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80191F7C, D_80191F7E, D_80191F80, D_80191F82, D_80191F84, D_80191F86; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80191F7E < ang)) goto outer_else; - if (!(ang < D_80191F84)) goto inner_else; - if (ang < D_80191F80) { *(s16 *)L = D_80191F80; goto done; } - if (D_80191F82 < ang) { *(s16 *)L = D_80191F82; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80191F7C) { *(s16 *)L = D_80191F7C; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80191F86 < ang) { *(s16 *)L = D_80191F86; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CF350; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CF350, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CF350; -extern s8 D_801CF354; -extern s8 D_801CF355; - -void func_8013C9C4(void * arg0) -{ - D_801CF350 = arg0; - D_801CF354 = 0; - D_801CF355 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CF350; -extern s8 D_801CF354; -extern s8 D_801CF355; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CF350; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CF355; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CF354)) * 2) + D_801CF350); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CF355 = (unsigned char) p[1]; - D_801CF354 = D_801CF354 + 1; - if (D_801CF355 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CF354 = 0; - *base = 0; - } - } - else - { - D_801CF355 = c - 1; - } - } - return; -} - - - -extern s32 D_801CF374; -extern s32 D_801CF368; -extern s32 D_801CF36C; -extern s32 D_801CF378; - -void func_8013CABC(void) { - D_801CF374 = 1; - D_801CF368 = 1; - D_801CF36C = 0; - D_801CF378 = 1; -} - - - -extern s32 D_801CF368; -extern s32 D_801CF36C; -extern s32 D_801CF370; -extern s32 D_801CF374; -extern s32 D_801CF378; - -void func_8013CAE8(void) { - D_801CF368 = 1; - D_801CF374 = 0; - D_801CF36C = 0; - D_801CF370 = -1; - D_801CF378 = 0; -} - - - -extern s32 D_801CF374; -extern s32 D_801CF378; -extern s32 D_801CF3A0; -extern s32 D_801CF3A4; - -void func_8013CB20(void) -{ - D_801CF3A0 = D_801CF378; - D_801CF3A4 = D_801CF374; - D_801CF378 = 1; - D_801CF374 = 0; -} - - - -extern s32 D_801CF3A0; -extern s32 D_801CF3A4; -extern s32 D_801CF378; -extern s32 D_801CF374; - -void func_8013CB5C(void) { - D_801CF378 = D_801CF3A0; - D_801CF374 = D_801CF3A4; -} - - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D0E98; - extern u8 D_801D0E99; - extern u8 D_801D0E9A; - extern u8 D_801D0E9B; - extern u8 D_801D0E9C; - extern u8 D_801D0E9D; - extern u8 D_801D0E9E; - extern u8 D_801D0E9F; - extern u8 D_801D0EA0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D0E98; t1 = D_801D0E99; t2 = D_801D0E9A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D0E9B; t1 = D_801D0E9C; t2 = D_801D0E9D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D0E9E; t1 = D_801D0E9F; t2 = D_801D0EA0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CF380; -extern s32 D_801CF368; -extern s32 D_801CF384; -extern s32 D_801CF374; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CF380 != 0) { - if (D_801CF380 != 2) { - if (((D_801CF380 < 3) && (D_801CF380 == 1)) && - (D_801CF384 = D_801CF384 + 1, 0x23a < D_801CF384)) { - D_801CF368 = D_801CF380; - D_801CF380 = 2; - } - } else { - D_801CF368 = D_801CF368 + -1; - if (D_801CF368 == 0) { - D_801CF368 = D_801CF380; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CF374 == 0) { - D_801CF380 = D_801CF380 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CF374; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CF374; -} - - - -extern s32 D_801CF380; - -void func_8013D164(void) { - D_801CF380 = 1; -} - - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D0F7A; -extern u8 D_801D0FEE; -extern u8 D_801D0EA2; -extern u8 D_801D0F5C; -extern u8 D_801D0E80; -extern u8 D_801D0EA1; -extern s32 D_801D0F60; - -void func_8013D330(void) { - if ((D_801D0F7A & 0xff) != D_801D0FEE) { - D_801D0F7A = ((D_801D0F7A & 0xff) < D_801D0FEE) ? (D_801D0F7A + 1) : (D_801D0F7A - 1); - } - if ((D_801D0EA2 & 0xff) != D_801D0F5C) { - D_801D0EA2 = ((D_801D0EA2 & 0xff) < D_801D0F5C) ? (D_801D0EA2 + 1) : (D_801D0EA2 - 1); - } - if ((D_801D0E80 & 0xff) != D_801D0EA1) { - D_801D0E80 = ((D_801D0E80 & 0xff) < D_801D0EA1) ? (D_801D0E80 + 1) : (D_801D0E80 - 1); - } - D_801D0F60 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CF358; -extern void *D_801CF35C; -extern void *D_801CF360; -extern s32 D_801CF388; -extern s32 D_801CF38C; -extern s32 D_801CF390; -extern s32 D_801D0ED4[]; - -extern u8 D_80192074[]; -extern u8 D_8019211C[]; -extern u8 D_80191FCC[]; -extern u8 D_801920C8[]; -extern u8 D_80192148[]; -extern u8 D_80192020[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CF388 = param_2; - D_801CF38C = (param_2 >> 2) & 3; - D_801CF390 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CF358 = D_80192074; - D_801CF35C = D_8019211C; - D_801CF360 = D_80191FCC; - } else { - D_801CF358 = D_801920C8; - D_801CF35C = D_80192148; - D_801CF360 = D_80192020; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CF390 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CF388 & 2) != 0) { - D_801D0ED4[0] = 0x140; - D_801D0ED4[3] = 0x80; - if (p[0x37] == 4) { - D_801D0ED4[0] = 0x140; - D_801D0ED4[3] = 0; - } - if (p[0x37] == 0) { - D_801D0ED4[0] = 0x140; - D_801D0ED4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CF360)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CF360; -extern s16 *D_801CF364; -extern s32 D_801CF374; -extern s32 D_801CF394; -extern s32 D_801CF398; -extern s32 D_801CF39C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CF364 != 0) { - D_801CF374 = 0; - p = (int *)(param_1 * 12 + (int)D_801CF360); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CF394 != x) { - flag = 1; - if (D_801CF394 < x) { - if (x - D_801CF394 < 5) { - D_801CF394 = x; - } else { - D_801CF394 = D_801CF394 + 4; - } - } else { - if (D_801CF394 - x < 5) { - D_801CF394 = x; - } else { - D_801CF394 = D_801CF394 - 4; - } - } - } - if (D_801CF398 != y) { - flag = 1; - if (D_801CF398 < y) { - if (y - D_801CF398 < 5) { - D_801CF398 = y; - } else { - D_801CF398 = D_801CF398 + 4; - } - } else { - if (D_801CF398 - y < 5) { - D_801CF398 = y; - } else { - D_801CF398 = D_801CF398 - 4; - } - } - } - if (D_801CF39C != z) { - flag = 1; - if (D_801CF39C < z) { - if (z - D_801CF39C < 5) { - D_801CF39C = z; - } else { - D_801CF39C = D_801CF39C + 4; - } - } else { - if (D_801CF39C - z < 5) { - D_801CF39C = z; - } else { - D_801CF39C = D_801CF39C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CF374 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_801921D8[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CF364); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CF394); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CF398); - uVar5 = (*(int*)&D_801CF39C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_801921D8); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CF37C; - -s32 func_8013E054(void) { - return D_801CF37C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80192BD4; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80192BAC; -extern s16 D_80192BAE; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80192BD4; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80192BAC = 2; - D_80192BAE = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80192BAE = 0; - D_80192BAC = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CF3B0; - extern void * D_801CF3B4; - extern unsigned char D_8019284C; - extern unsigned char D_80192864; - extern unsigned char D_801928D8; - extern unsigned char D_801928E0; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CF3B0 = &D_8019284C; - D_801CF3B4 = &D_801928D8; - } else { - D_801CF3B0 = &D_80192864; - D_801CF3B4 = &D_801928E0; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80192BD4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80192BD4 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80192BD4)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80192BB0; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80192BB0)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80192BB0)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80192BAC; -extern s16 D_80192BAE; -extern unsigned char D_80192BB0; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80192BAE` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80192BAC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80192BAE; - if (*r < 3) { - *r = *r + 1; - } - D_80192BAC = (u16)D_80192BAC + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80192BB0); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80192BB0; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80192BB0); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC06_033/ov_SC06_033_jr_801380E0.c b/src/ov_SC06_033/ov_SC06_033_jr_801380E0.c new file mode 100644 index 000000000..f852bf225 --- /dev/null +++ b/src/ov_SC06_033/ov_SC06_033_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CDF08; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80191ACC[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CF26C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D0F80; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CDF08; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80191808)(); +extern s16 (*D_8019180C)(); +extern M2C_UNK (*D_80191814)(); +extern s32 (*D_80191818)(); +extern s32 D_801CF268; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CDF0C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80191B60; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80195044; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80191B78; +extern M2C_UNK D_80191B80; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80191B88; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80191BA4[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80191BB0[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80191BC4[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80191C14[]; +extern s16 D_80191C44[]; +extern s16 D_80191CA4[]; +extern s16 D_80191CAC[]; +extern s16 D_80191CCC[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80191D04[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80191D5C[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80191DA4[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80191DAC[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80191DB4[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80191DBC[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80191D64; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80191D84; +extern void func_801321B0(int param_1); +extern int D_80191D94; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CF2D8; +extern s32 D_801CF2DC[]; +extern int D_801CF2E0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80191DC8; +extern u8 D_80191DC4; +extern s16 *D_80191DCC; +extern u8 D_80191DD0; +extern int D_801CF2D8; +extern u16 D_801CF2E8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80191DCC; /* holds a pointer value (*(u16**)&D_80191DCC) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80191DE0[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80191E34; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80191E38[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80191E38[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80191E7C; +extern u8 D_80191EC0; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80191E7C; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80191EC0 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80191F04[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80191F40[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80191F40; + if (((s16)a1) < 0xC00) { + tbl = D_80191F04; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80191F7C, D_80191F7E, D_80191F80, D_80191F82, D_80191F84, D_80191F86; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80191F7E < ang)) goto outer_else; + if (!(ang < D_80191F84)) goto inner_else; + if (ang < D_80191F80) { *(s16 *)L = D_80191F80; goto done; } + if (D_80191F82 < ang) { *(s16 *)L = D_80191F82; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80191F7C) { *(s16 *)L = D_80191F7C; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80191F86 < ang) { *(s16 *)L = D_80191F86; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CF350; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CF350, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CF350; +extern s8 D_801CF354; +extern s8 D_801CF355; + +void func_8013C9C4(void * arg0) +{ + D_801CF350 = arg0; + D_801CF354 = 0; + D_801CF355 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CF350; +extern s8 D_801CF354; +extern s8 D_801CF355; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CF350; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CF355; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CF354)) * 2) + D_801CF350); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CF355 = (unsigned char) p[1]; + D_801CF354 = D_801CF354 + 1; + if (D_801CF355 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CF354 = 0; + *base = 0; + } + } + else + { + D_801CF355 = c - 1; + } + } + return; +} + + + +extern s32 D_801CF374; +extern s32 D_801CF368; +extern s32 D_801CF36C; +extern s32 D_801CF378; + +void func_8013CABC(void) { + D_801CF374 = 1; + D_801CF368 = 1; + D_801CF36C = 0; + D_801CF378 = 1; +} + + + +extern s32 D_801CF368; +extern s32 D_801CF36C; +extern s32 D_801CF370; +extern s32 D_801CF374; +extern s32 D_801CF378; + +void func_8013CAE8(void) { + D_801CF368 = 1; + D_801CF374 = 0; + D_801CF36C = 0; + D_801CF370 = -1; + D_801CF378 = 0; +} + + + +extern s32 D_801CF374; +extern s32 D_801CF378; +extern s32 D_801CF3A0; +extern s32 D_801CF3A4; + +void func_8013CB20(void) +{ + D_801CF3A0 = D_801CF378; + D_801CF3A4 = D_801CF374; + D_801CF378 = 1; + D_801CF374 = 0; +} + + + +extern s32 D_801CF3A0; +extern s32 D_801CF3A4; +extern s32 D_801CF378; +extern s32 D_801CF374; + +void func_8013CB5C(void) { + D_801CF378 = D_801CF3A0; + D_801CF374 = D_801CF3A4; +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D0E98; + extern u8 D_801D0E99; + extern u8 D_801D0E9A; + extern u8 D_801D0E9B; + extern u8 D_801D0E9C; + extern u8 D_801D0E9D; + extern u8 D_801D0E9E; + extern u8 D_801D0E9F; + extern u8 D_801D0EA0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D0E98; t1 = D_801D0E99; t2 = D_801D0E9A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D0E9B; t1 = D_801D0E9C; t2 = D_801D0E9D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D0E9E; t1 = D_801D0E9F; t2 = D_801D0EA0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CF380; +extern s32 D_801CF368; +extern s32 D_801CF384; +extern s32 D_801CF374; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CF380 != 0) { + if (D_801CF380 != 2) { + if (((D_801CF380 < 3) && (D_801CF380 == 1)) && + (D_801CF384 = D_801CF384 + 1, 0x23a < D_801CF384)) { + D_801CF368 = D_801CF380; + D_801CF380 = 2; + } + } else { + D_801CF368 = D_801CF368 + -1; + if (D_801CF368 == 0) { + D_801CF368 = D_801CF380; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CF374 == 0) { + D_801CF380 = D_801CF380 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CF374; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CF374; +} + + + +extern s32 D_801CF380; + +void func_8013D164(void) { + D_801CF380 = 1; +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D0F7A; +extern u8 D_801D0FEE; +extern u8 D_801D0EA2; +extern u8 D_801D0F5C; +extern u8 D_801D0E80; +extern u8 D_801D0EA1; +extern s32 D_801D0F60; + +void func_8013D330(void) { + if ((D_801D0F7A & 0xff) != D_801D0FEE) { + D_801D0F7A = ((D_801D0F7A & 0xff) < D_801D0FEE) ? (D_801D0F7A + 1) : (D_801D0F7A - 1); + } + if ((D_801D0EA2 & 0xff) != D_801D0F5C) { + D_801D0EA2 = ((D_801D0EA2 & 0xff) < D_801D0F5C) ? (D_801D0EA2 + 1) : (D_801D0EA2 - 1); + } + if ((D_801D0E80 & 0xff) != D_801D0EA1) { + D_801D0E80 = ((D_801D0E80 & 0xff) < D_801D0EA1) ? (D_801D0E80 + 1) : (D_801D0E80 - 1); + } + D_801D0F60 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CF358; +extern void *D_801CF35C; +extern void *D_801CF360; +extern s32 D_801CF388; +extern s32 D_801CF38C; +extern s32 D_801CF390; +extern s32 D_801D0ED4[]; + +extern u8 D_80192074[]; +extern u8 D_8019211C[]; +extern u8 D_80191FCC[]; +extern u8 D_801920C8[]; +extern u8 D_80192148[]; +extern u8 D_80192020[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CF388 = param_2; + D_801CF38C = (param_2 >> 2) & 3; + D_801CF390 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CF358 = D_80192074; + D_801CF35C = D_8019211C; + D_801CF360 = D_80191FCC; + } else { + D_801CF358 = D_801920C8; + D_801CF35C = D_80192148; + D_801CF360 = D_80192020; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CF390 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CF388 & 2) != 0) { + D_801D0ED4[0] = 0x140; + D_801D0ED4[3] = 0x80; + if (p[0x37] == 4) { + D_801D0ED4[0] = 0x140; + D_801D0ED4[3] = 0; + } + if (p[0x37] == 0) { + D_801D0ED4[0] = 0x140; + D_801D0ED4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CF360)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CF360; +extern s16 *D_801CF364; +extern s32 D_801CF374; +extern s32 D_801CF394; +extern s32 D_801CF398; +extern s32 D_801CF39C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CF364 != 0) { + D_801CF374 = 0; + p = (int *)(param_1 * 12 + (int)D_801CF360); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CF394 != x) { + flag = 1; + if (D_801CF394 < x) { + if (x - D_801CF394 < 5) { + D_801CF394 = x; + } else { + D_801CF394 = D_801CF394 + 4; + } + } else { + if (D_801CF394 - x < 5) { + D_801CF394 = x; + } else { + D_801CF394 = D_801CF394 - 4; + } + } + } + if (D_801CF398 != y) { + flag = 1; + if (D_801CF398 < y) { + if (y - D_801CF398 < 5) { + D_801CF398 = y; + } else { + D_801CF398 = D_801CF398 + 4; + } + } else { + if (D_801CF398 - y < 5) { + D_801CF398 = y; + } else { + D_801CF398 = D_801CF398 - 4; + } + } + } + if (D_801CF39C != z) { + flag = 1; + if (D_801CF39C < z) { + if (z - D_801CF39C < 5) { + D_801CF39C = z; + } else { + D_801CF39C = D_801CF39C + 4; + } + } else { + if (D_801CF39C - z < 5) { + D_801CF39C = z; + } else { + D_801CF39C = D_801CF39C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CF374 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_801921D8[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CF364); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CF394); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CF398); + uVar5 = (*(int*)&D_801CF39C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_801921D8); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CF37C; + +s32 func_8013E054(void) { + return D_801CF37C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80192BD4; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80192BAC; +extern s16 D_80192BAE; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80192BD4; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80192BAC = 2; + D_80192BAE = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80192BAE = 0; + D_80192BAC = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CF3B0; + extern void * D_801CF3B4; + extern unsigned char D_8019284C; + extern unsigned char D_80192864; + extern unsigned char D_801928D8; + extern unsigned char D_801928E0; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CF3B0 = &D_8019284C; + D_801CF3B4 = &D_801928D8; + } else { + D_801CF3B0 = &D_80192864; + D_801CF3B4 = &D_801928E0; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80192BD4/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80192BD4 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80192BD4)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80192BB0; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80192BB0)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80192BB0)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80192BAC; +extern s16 D_80192BAE; +extern unsigned char D_80192BB0; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80192BAE` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80192BAC` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80192BAE; + if (*r < 3) { + *r = *r + 1; + } + D_80192BAC = (u16)D_80192BAC + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80192BB0); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80192BB0; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80192BB0); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC07_000/ov_SC07_000_jr_8012ACE0.c b/src/ov_SC07_000/ov_SC07_000_jr_8012ACE0.c index 9f1f0a2cb..2ea48dbc8 100644 --- a/src/ov_SC07_000/ov_SC07_000_jr_8012ACE0.c +++ b/src/ov_SC07_000/ov_SC07_000_jr_8012ACE0.c @@ -2827,1334 +2827,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80182C80[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80182C80[*(short *)(p + 4)](); -} - - -DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80182CC4; -extern u8 D_80182D08; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80182CC4; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80182D08 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80182D4C[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80182D88[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80182D88; - if (((s16)a1) < 0xC00) { - tbl = D_80182D4C; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80182DC4, D_80182DC6, D_80182DC8, D_80182DCA, D_80182DCC, D_80182DCE; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80182DC6 < ang)) goto outer_else; - if (!(ang < D_80182DCC)) goto inner_else; - if (ang < D_80182DC8) { *(s16 *)L = D_80182DC8; goto done; } - if (D_80182DCA < ang) { *(s16 *)L = D_80182DCA; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80182DC4) { *(s16 *)L = D_80182DC4; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80182DCE < ang) { *(s16 *)L = D_80182DCE; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801CE898; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801CE898, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801CE898; -extern s8 D_801CE89C; -extern s8 D_801CE89D; - -void func_8013C9C4(void * arg0) -{ - D_801CE898 = arg0; - D_801CE89C = 0; - D_801CE89D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801CE898; -extern s8 D_801CE89C; -extern s8 D_801CE89D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801CE898; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801CE89D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801CE89C)) * 2) + D_801CE898); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801CE89D = (unsigned char) p[1]; - D_801CE89C = D_801CE89C + 1; - if (D_801CE89D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801CE89C = 0; - *base = 0; - } - } - else - { - D_801CE89D = c - 1; - } - } - return; -} - - - -extern s32 D_801CE8BC; -extern s32 D_801CE8B0; -extern s32 D_801CE8B4; -extern s32 D_801CE8C0; - -void func_8013CABC(void) { - D_801CE8BC = 1; - D_801CE8B0 = 1; - D_801CE8B4 = 0; - D_801CE8C0 = 1; -} - - - -extern s32 D_801CE8B0; -extern s32 D_801CE8B4; -extern s32 D_801CE8B8; -extern s32 D_801CE8BC; -extern s32 D_801CE8C0; - -void func_8013CAE8(void) { - D_801CE8B0 = 1; - D_801CE8BC = 0; - D_801CE8B4 = 0; - D_801CE8B8 = -1; - D_801CE8C0 = 0; -} - - - -extern s32 D_801CE8BC; -extern s32 D_801CE8C0; -extern s32 D_801CE8E8; -extern s32 D_801CE8EC; - -void func_8013CB20(void) -{ - D_801CE8E8 = D_801CE8C0; - D_801CE8EC = D_801CE8BC; - D_801CE8C0 = 1; - D_801CE8BC = 0; -} - - - -extern s32 D_801CE8E8; -extern s32 D_801CE8EC; -extern s32 D_801CE8C0; -extern s32 D_801CE8BC; - -void func_8013CB5C(void) { - D_801CE8C0 = D_801CE8E8; - D_801CE8BC = D_801CE8EC; -} - - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801D0B88; - extern u8 D_801D0B89; - extern u8 D_801D0B8A; - extern u8 D_801D0B8B; - extern u8 D_801D0B8C; - extern u8 D_801D0B8D; - extern u8 D_801D0B8E; - extern u8 D_801D0B8F; - extern u8 D_801D0B90; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801D0B88; t1 = D_801D0B89; t2 = D_801D0B8A; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801D0B8B; t1 = D_801D0B8C; t2 = D_801D0B8D; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801D0B8E; t1 = D_801D0B8F; t2 = D_801D0B90; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801CE8C8; -extern s32 D_801CE8B0; -extern s32 D_801CE8CC; -extern s32 D_801CE8BC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801CE8C8 != 0) { - if (D_801CE8C8 != 2) { - if (((D_801CE8C8 < 3) && (D_801CE8C8 == 1)) && - (D_801CE8CC = D_801CE8CC + 1, 0x23a < D_801CE8CC)) { - D_801CE8B0 = D_801CE8C8; - D_801CE8C8 = 2; - } - } else { - D_801CE8B0 = D_801CE8B0 + -1; - if (D_801CE8B0 == 0) { - D_801CE8B0 = D_801CE8C8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801CE8BC == 0) { - D_801CE8C8 = D_801CE8C8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801CE8BC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801CE8BC; -} - - - -extern s32 D_801CE8C8; - -void func_8013D164(void) { - D_801CE8C8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801D0C72; -extern u8 D_801D0CE6; -extern u8 D_801D0B92; -extern u8 D_801D0C54; -extern u8 D_801D0B68; -extern u8 D_801D0B91; -extern s32 D_801D0C58; - -void func_8013D330(void) { - if ((D_801D0C72 & 0xff) != D_801D0CE6) { - D_801D0C72 = ((D_801D0C72 & 0xff) < D_801D0CE6) ? (D_801D0C72 + 1) : (D_801D0C72 - 1); - } - if ((D_801D0B92 & 0xff) != D_801D0C54) { - D_801D0B92 = ((D_801D0B92 & 0xff) < D_801D0C54) ? (D_801D0B92 + 1) : (D_801D0B92 - 1); - } - if ((D_801D0B68 & 0xff) != D_801D0B91) { - D_801D0B68 = ((D_801D0B68 & 0xff) < D_801D0B91) ? (D_801D0B68 + 1) : (D_801D0B68 - 1); - } - D_801D0C58 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801CE8A0; -extern void *D_801CE8A4; -extern void *D_801CE8A8; -extern s32 D_801CE8D0; -extern s32 D_801CE8D4; -extern s32 D_801CE8D8; -extern s32 D_801D0BCC[]; - -extern u8 D_80182EBC[]; -extern u8 D_80182F64[]; -extern u8 D_80182E14[]; -extern u8 D_80182F10[]; -extern u8 D_80182F90[]; -extern u8 D_80182E68[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801CE8D0 = param_2; - D_801CE8D4 = (param_2 >> 2) & 3; - D_801CE8D8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801CE8A0 = D_80182EBC; - D_801CE8A4 = D_80182F64; - D_801CE8A8 = D_80182E14; - } else { - D_801CE8A0 = D_80182F10; - D_801CE8A4 = D_80182F90; - D_801CE8A8 = D_80182E68; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801CE8D8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801CE8D0 & 2) != 0) { - D_801D0BCC[0] = 0x140; - D_801D0BCC[3] = 0x80; - if (p[0x37] == 4) { - D_801D0BCC[0] = 0x140; - D_801D0BCC[3] = 0; - } - if (p[0x37] == 0) { - D_801D0BCC[0] = 0x140; - D_801D0BCC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801CE8A8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801CE8A8; -extern s16 *D_801CE8AC; -extern s32 D_801CE8BC; -extern s32 D_801CE8DC; -extern s32 D_801CE8E0; -extern s32 D_801CE8E4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801CE8AC != 0) { - D_801CE8BC = 0; - p = (int *)(param_1 * 12 + (int)D_801CE8A8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801CE8DC != x) { - flag = 1; - if (D_801CE8DC < x) { - if (x - D_801CE8DC < 5) { - D_801CE8DC = x; - } else { - D_801CE8DC = D_801CE8DC + 4; - } - } else { - if (D_801CE8DC - x < 5) { - D_801CE8DC = x; - } else { - D_801CE8DC = D_801CE8DC - 4; - } - } - } - if (D_801CE8E0 != y) { - flag = 1; - if (D_801CE8E0 < y) { - if (y - D_801CE8E0 < 5) { - D_801CE8E0 = y; - } else { - D_801CE8E0 = D_801CE8E0 + 4; - } - } else { - if (D_801CE8E0 - y < 5) { - D_801CE8E0 = y; - } else { - D_801CE8E0 = D_801CE8E0 - 4; - } - } - } - if (D_801CE8E4 != z) { - flag = 1; - if (D_801CE8E4 < z) { - if (z - D_801CE8E4 < 5) { - D_801CE8E4 = z; - } else { - D_801CE8E4 = D_801CE8E4 + 4; - } - } else { - if (D_801CE8E4 - z < 5) { - D_801CE8E4 = z; - } else { - D_801CE8E4 = D_801CE8E4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801CE8BC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80183020[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801CE8AC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CE8DC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CE8E0); - uVar5 = (*(int*)&D_801CE8E4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80183020); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801CE8C4; - -s32 func_8013E054(void) { - return D_801CE8C4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80183A1C; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801839F4; -extern s16 D_801839F6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80183A1C; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801839F4 = 2; - D_801839F6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801839F6 = 0; - D_801839F4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801CE8F8; - extern void * D_801CE8FC; - extern unsigned char D_80183694; - extern unsigned char D_801836AC; - extern unsigned char D_80183720; - extern unsigned char D_80183728; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801CE8F8 = &D_80183694; - D_801CE8FC = &D_80183720; - } else { - D_801CE8F8 = &D_801836AC; - D_801CE8FC = &D_80183728; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80183A1C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183A1C -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80183A1C)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801839F8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801839F8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801839F8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801839F4; -extern s16 D_801839F6; -extern unsigned char D_801839F8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801839F6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801839F4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801839F6; - if (*r < 3) { - *r = *r + 1; - } - D_801839F4 = (u16)D_801839F4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801839F8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801839F8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801839F8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c b/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c new file mode 100644 index 000000000..3e2a1c4b6 --- /dev/null +++ b/src/ov_SC07_000/ov_SC07_000_jr_801380E0.c @@ -0,0 +1,2387 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801CD564; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80182914[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801CE7B4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801D0C78; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801CD564; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80182650)(); +extern s16 (*D_80182654)(); +extern M2C_UNK (*D_8018265C)(); +extern s32 (*D_80182660)(); +extern s32 D_801CE7B0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801CD568; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A598(void *a0); +extern void func_8012A568(void (*a0)(void)); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_801829A8; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80185E8C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_801829C0; +extern M2C_UNK D_801829C8; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_801829D0; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_801829EC[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801829F8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80182A0C[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80182A5C[]; +extern s16 D_80182A8C[]; +extern s16 D_80182AEC[]; +extern s16 D_80182AF4[]; +extern s16 D_80182B14[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80182B4C[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80182BA4[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80182BEC[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80182BF4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80182BFC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80182C04[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80182BAC; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80182BCC; +extern void func_801321B0(int param_1); +extern int D_80182BDC; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801CE820; +extern s32 D_801CE824[]; +extern int D_801CE828; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80182C10; +extern u8 D_80182C0C; +extern s16 *D_80182C14; +extern u8 D_80182C18; +extern int D_801CE820; +extern u16 D_801CE830; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80182C14; /* holds a pointer value (*(u16**)&D_80182C14) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80182C28[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80182C7C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80182C80[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80182C80[*(short *)(p + 4)](); +} + + +DEFINE_func_80138C30() /* dedup: shared engine-core @0x80138C30 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80182CC4; +extern u8 D_80182D08; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80182CC4; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80182D08 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80182D4C[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80182D88[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80182D88; + if (((s16)a1) < 0xC00) { + tbl = D_80182D4C; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80182DC4, D_80182DC6, D_80182DC8, D_80182DCA, D_80182DCC, D_80182DCE; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80182DC6 < ang)) goto outer_else; + if (!(ang < D_80182DCC)) goto inner_else; + if (ang < D_80182DC8) { *(s16 *)L = D_80182DC8; goto done; } + if (D_80182DCA < ang) { *(s16 *)L = D_80182DCA; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80182DC4) { *(s16 *)L = D_80182DC4; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80182DCE < ang) { *(s16 *)L = D_80182DCE; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801CE898; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801CE898, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801CE898; +extern s8 D_801CE89C; +extern s8 D_801CE89D; + +void func_8013C9C4(void * arg0) +{ + D_801CE898 = arg0; + D_801CE89C = 0; + D_801CE89D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801CE898; +extern s8 D_801CE89C; +extern s8 D_801CE89D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801CE898; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801CE89D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801CE89C)) * 2) + D_801CE898); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801CE89D = (unsigned char) p[1]; + D_801CE89C = D_801CE89C + 1; + if (D_801CE89D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801CE89C = 0; + *base = 0; + } + } + else + { + D_801CE89D = c - 1; + } + } + return; +} + + + +extern s32 D_801CE8BC; +extern s32 D_801CE8B0; +extern s32 D_801CE8B4; +extern s32 D_801CE8C0; + +void func_8013CABC(void) { + D_801CE8BC = 1; + D_801CE8B0 = 1; + D_801CE8B4 = 0; + D_801CE8C0 = 1; +} + + + +extern s32 D_801CE8B0; +extern s32 D_801CE8B4; +extern s32 D_801CE8B8; +extern s32 D_801CE8BC; +extern s32 D_801CE8C0; + +void func_8013CAE8(void) { + D_801CE8B0 = 1; + D_801CE8BC = 0; + D_801CE8B4 = 0; + D_801CE8B8 = -1; + D_801CE8C0 = 0; +} + + + +extern s32 D_801CE8BC; +extern s32 D_801CE8C0; +extern s32 D_801CE8E8; +extern s32 D_801CE8EC; + +void func_8013CB20(void) +{ + D_801CE8E8 = D_801CE8C0; + D_801CE8EC = D_801CE8BC; + D_801CE8C0 = 1; + D_801CE8BC = 0; +} + + + +extern s32 D_801CE8E8; +extern s32 D_801CE8EC; +extern s32 D_801CE8C0; +extern s32 D_801CE8BC; + +void func_8013CB5C(void) { + D_801CE8C0 = D_801CE8E8; + D_801CE8BC = D_801CE8EC; +} + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801D0B88; + extern u8 D_801D0B89; + extern u8 D_801D0B8A; + extern u8 D_801D0B8B; + extern u8 D_801D0B8C; + extern u8 D_801D0B8D; + extern u8 D_801D0B8E; + extern u8 D_801D0B8F; + extern u8 D_801D0B90; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801D0B88; t1 = D_801D0B89; t2 = D_801D0B8A; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801D0B8B; t1 = D_801D0B8C; t2 = D_801D0B8D; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801D0B8E; t1 = D_801D0B8F; t2 = D_801D0B90; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801CE8C8; +extern s32 D_801CE8B0; +extern s32 D_801CE8CC; +extern s32 D_801CE8BC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801CE8C8 != 0) { + if (D_801CE8C8 != 2) { + if (((D_801CE8C8 < 3) && (D_801CE8C8 == 1)) && + (D_801CE8CC = D_801CE8CC + 1, 0x23a < D_801CE8CC)) { + D_801CE8B0 = D_801CE8C8; + D_801CE8C8 = 2; + } + } else { + D_801CE8B0 = D_801CE8B0 + -1; + if (D_801CE8B0 == 0) { + D_801CE8B0 = D_801CE8C8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801CE8BC == 0) { + D_801CE8C8 = D_801CE8C8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801CE8BC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801CE8BC; +} + + + +extern s32 D_801CE8C8; + +void func_8013D164(void) { + D_801CE8C8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801D0C72; +extern u8 D_801D0CE6; +extern u8 D_801D0B92; +extern u8 D_801D0C54; +extern u8 D_801D0B68; +extern u8 D_801D0B91; +extern s32 D_801D0C58; + +void func_8013D330(void) { + if ((D_801D0C72 & 0xff) != D_801D0CE6) { + D_801D0C72 = ((D_801D0C72 & 0xff) < D_801D0CE6) ? (D_801D0C72 + 1) : (D_801D0C72 - 1); + } + if ((D_801D0B92 & 0xff) != D_801D0C54) { + D_801D0B92 = ((D_801D0B92 & 0xff) < D_801D0C54) ? (D_801D0B92 + 1) : (D_801D0B92 - 1); + } + if ((D_801D0B68 & 0xff) != D_801D0B91) { + D_801D0B68 = ((D_801D0B68 & 0xff) < D_801D0B91) ? (D_801D0B68 + 1) : (D_801D0B68 - 1); + } + D_801D0C58 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801CE8A0; +extern void *D_801CE8A4; +extern void *D_801CE8A8; +extern s32 D_801CE8D0; +extern s32 D_801CE8D4; +extern s32 D_801CE8D8; +extern s32 D_801D0BCC[]; + +extern u8 D_80182EBC[]; +extern u8 D_80182F64[]; +extern u8 D_80182E14[]; +extern u8 D_80182F10[]; +extern u8 D_80182F90[]; +extern u8 D_80182E68[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801CE8D0 = param_2; + D_801CE8D4 = (param_2 >> 2) & 3; + D_801CE8D8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801CE8A0 = D_80182EBC; + D_801CE8A4 = D_80182F64; + D_801CE8A8 = D_80182E14; + } else { + D_801CE8A0 = D_80182F10; + D_801CE8A4 = D_80182F90; + D_801CE8A8 = D_80182E68; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801CE8D8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801CE8D0 & 2) != 0) { + D_801D0BCC[0] = 0x140; + D_801D0BCC[3] = 0x80; + if (p[0x37] == 4) { + D_801D0BCC[0] = 0x140; + D_801D0BCC[3] = 0; + } + if (p[0x37] == 0) { + D_801D0BCC[0] = 0x140; + D_801D0BCC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801CE8A8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801CE8A8; +extern s16 *D_801CE8AC; +extern s32 D_801CE8BC; +extern s32 D_801CE8DC; +extern s32 D_801CE8E0; +extern s32 D_801CE8E4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801CE8AC != 0) { + D_801CE8BC = 0; + p = (int *)(param_1 * 12 + (int)D_801CE8A8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801CE8DC != x) { + flag = 1; + if (D_801CE8DC < x) { + if (x - D_801CE8DC < 5) { + D_801CE8DC = x; + } else { + D_801CE8DC = D_801CE8DC + 4; + } + } else { + if (D_801CE8DC - x < 5) { + D_801CE8DC = x; + } else { + D_801CE8DC = D_801CE8DC - 4; + } + } + } + if (D_801CE8E0 != y) { + flag = 1; + if (D_801CE8E0 < y) { + if (y - D_801CE8E0 < 5) { + D_801CE8E0 = y; + } else { + D_801CE8E0 = D_801CE8E0 + 4; + } + } else { + if (D_801CE8E0 - y < 5) { + D_801CE8E0 = y; + } else { + D_801CE8E0 = D_801CE8E0 - 4; + } + } + } + if (D_801CE8E4 != z) { + flag = 1; + if (D_801CE8E4 < z) { + if (z - D_801CE8E4 < 5) { + D_801CE8E4 = z; + } else { + D_801CE8E4 = D_801CE8E4 + 4; + } + } else { + if (D_801CE8E4 - z < 5) { + D_801CE8E4 = z; + } else { + D_801CE8E4 = D_801CE8E4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801CE8BC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80183020[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801CE8AC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801CE8DC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801CE8E0); + uVar5 = (*(int*)&D_801CE8E4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80183020); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801CE8C4; + +s32 func_8013E054(void) { + return D_801CE8C4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80183A1C; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801839F4; +extern s16 D_801839F6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80183A1C; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801839F4 = 2; + D_801839F6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801839F6 = 0; + D_801839F4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801CE8F8; + extern void * D_801CE8FC; + extern unsigned char D_80183694; + extern unsigned char D_801836AC; + extern unsigned char D_80183720; + extern unsigned char D_80183728; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801CE8F8 = &D_80183694; + D_801CE8FC = &D_80183720; + } else { + D_801CE8F8 = &D_801836AC; + D_801CE8FC = &D_80183728; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80183A1C/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80183A1C -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80183A1C)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801839F8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801839F8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801839F8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801839F4; +extern s16 D_801839F6; +extern unsigned char D_801839F8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801839F6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801839F4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801839F6; + if (*r < 3) { + *r = *r + 1; + } + D_801839F4 = (u16)D_801839F4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801839F8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801839F8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801839F8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC07_001/ov_SC07_001_jr_8012ACE0.c b/src/ov_SC07_001/ov_SC07_001_jr_8012ACE0.c index ae28843b8..77e96f996 100644 --- a/src/ov_SC07_001/ov_SC07_001_jr_8012ACE0.c +++ b/src/ov_SC07_001/ov_SC07_001_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80181B30[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80181B30[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80181B74; -extern u8 D_80181BB8; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80181B74; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80181BB8 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80181BFC[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80181C38[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80181C38; - if (((s16)a1) < 0xC00) { - tbl = D_80181BFC; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80181C74, D_80181C76, D_80181C78, D_80181C7A, D_80181C7C, D_80181C7E; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80181C76 < ang)) goto outer_else; - if (!(ang < D_80181C7C)) goto inner_else; - if (ang < D_80181C78) { *(s16 *)L = D_80181C78; goto done; } - if (D_80181C7A < ang) { *(s16 *)L = D_80181C7A; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80181C74) { *(s16 *)L = D_80181C74; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80181C7E < ang) { *(s16 *)L = D_80181C7E; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A9948; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A9948, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A9948; -extern s8 D_801A994C; -extern s8 D_801A994D; - -void func_8013C9C4(void * arg0) -{ - D_801A9948 = arg0; - D_801A994C = 0; - D_801A994D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A9948; -extern s8 D_801A994C; -extern s8 D_801A994D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A9948; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A994D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A994C)) * 2) + D_801A9948); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A994D = (unsigned char) p[1]; - D_801A994C = D_801A994C + 1; - if (D_801A994D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A994C = 0; - *base = 0; - } - } - else - { - D_801A994D = c - 1; - } - } - return; -} - - - -extern s32 D_801A996C; -extern s32 D_801A9960; -extern s32 D_801A9964; -extern s32 D_801A9970; - -void func_8013CABC(void) { - D_801A996C = 1; - D_801A9960 = 1; - D_801A9964 = 0; - D_801A9970 = 1; -} - - - -extern s32 D_801A9960; -extern s32 D_801A9964; -extern s32 D_801A9968; -extern s32 D_801A996C; -extern s32 D_801A9970; - -void func_8013CAE8(void) { - D_801A9960 = 1; - D_801A996C = 0; - D_801A9964 = 0; - D_801A9968 = -1; - D_801A9970 = 0; -} - - - -extern s32 D_801A996C; -extern s32 D_801A9970; -extern s32 D_801A9998; -extern s32 D_801A999C; - -void func_8013CB20(void) -{ - D_801A9998 = D_801A9970; - D_801A999C = D_801A996C; - D_801A9970 = 1; - D_801A996C = 0; -} - - - -extern s32 D_801A9998; -extern s32 D_801A999C; -extern s32 D_801A9970; -extern s32 D_801A996C; - -void func_8013CB5C(void) { - D_801A9970 = D_801A9998; - D_801A996C = D_801A999C; -} - - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801AADB8; - extern u8 D_801AADB9; - extern u8 D_801AADBA; - extern u8 D_801AADBB; - extern u8 D_801AADBC; - extern u8 D_801AADBD; - extern u8 D_801AADBE; - extern u8 D_801AADBF; - extern u8 D_801AADC0; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801AADB8; t1 = D_801AADB9; t2 = D_801AADBA; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801AADBB; t1 = D_801AADBC; t2 = D_801AADBD; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801AADBE; t1 = D_801AADBF; t2 = D_801AADC0; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A9978; -extern s32 D_801A9960; -extern s32 D_801A997C; -extern s32 D_801A996C; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A9978 != 0) { - if (D_801A9978 != 2) { - if (((D_801A9978 < 3) && (D_801A9978 == 1)) && - (D_801A997C = D_801A997C + 1, 0x23a < D_801A997C)) { - D_801A9960 = D_801A9978; - D_801A9978 = 2; - } - } else { - D_801A9960 = D_801A9960 + -1; - if (D_801A9960 == 0) { - D_801A9960 = D_801A9978; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A996C == 0) { - D_801A9978 = D_801A9978 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A996C; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A996C; -} - - - -extern s32 D_801A9978; - -void func_8013D164(void) { - D_801A9978 = 1; -} - - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801AAE9A; -extern u8 D_801AAF0E; -extern u8 D_801AADC2; -extern u8 D_801AAE7C; -extern u8 D_801AADA0; -extern u8 D_801AADC1; -extern s32 D_801AAE80; - -void func_8013D330(void) { - if ((D_801AAE9A & 0xff) != D_801AAF0E) { - D_801AAE9A = ((D_801AAE9A & 0xff) < D_801AAF0E) ? (D_801AAE9A + 1) : (D_801AAE9A - 1); - } - if ((D_801AADC2 & 0xff) != D_801AAE7C) { - D_801AADC2 = ((D_801AADC2 & 0xff) < D_801AAE7C) ? (D_801AADC2 + 1) : (D_801AADC2 - 1); - } - if ((D_801AADA0 & 0xff) != D_801AADC1) { - D_801AADA0 = ((D_801AADA0 & 0xff) < D_801AADC1) ? (D_801AADA0 + 1) : (D_801AADA0 - 1); - } - D_801AAE80 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A9950; -extern void *D_801A9954; -extern void *D_801A9958; -extern s32 D_801A9980; -extern s32 D_801A9984; -extern s32 D_801A9988; -extern s32 D_801AADF4[]; - -extern u8 D_80181D6C[]; -extern u8 D_80181E14[]; -extern u8 D_80181CC4[]; -extern u8 D_80181DC0[]; -extern u8 D_80181E40[]; -extern u8 D_80181D18[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A9980 = param_2; - D_801A9984 = (param_2 >> 2) & 3; - D_801A9988 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A9950 = D_80181D6C; - D_801A9954 = D_80181E14; - D_801A9958 = D_80181CC4; - } else { - D_801A9950 = D_80181DC0; - D_801A9954 = D_80181E40; - D_801A9958 = D_80181D18; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A9988 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A9980 & 2) != 0) { - D_801AADF4[0] = 0x140; - D_801AADF4[3] = 0x80; - if (p[0x37] == 4) { - D_801AADF4[0] = 0x140; - D_801AADF4[3] = 0; - } - if (p[0x37] == 0) { - D_801AADF4[0] = 0x140; - D_801AADF4[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A9958)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A9958; -extern s16 *D_801A995C; -extern s32 D_801A996C; -extern s32 D_801A998C; -extern s32 D_801A9990; -extern s32 D_801A9994; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A995C != 0) { - D_801A996C = 0; - p = (int *)(param_1 * 12 + (int)D_801A9958); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A998C != x) { - flag = 1; - if (D_801A998C < x) { - if (x - D_801A998C < 5) { - D_801A998C = x; - } else { - D_801A998C = D_801A998C + 4; - } - } else { - if (D_801A998C - x < 5) { - D_801A998C = x; - } else { - D_801A998C = D_801A998C - 4; - } - } - } - if (D_801A9990 != y) { - flag = 1; - if (D_801A9990 < y) { - if (y - D_801A9990 < 5) { - D_801A9990 = y; - } else { - D_801A9990 = D_801A9990 + 4; - } - } else { - if (D_801A9990 - y < 5) { - D_801A9990 = y; - } else { - D_801A9990 = D_801A9990 - 4; - } - } - } - if (D_801A9994 != z) { - flag = 1; - if (D_801A9994 < z) { - if (z - D_801A9994 < 5) { - D_801A9994 = z; - } else { - D_801A9994 = D_801A9994 + 4; - } - } else { - if (D_801A9994 - z < 5) { - D_801A9994 = z; - } else { - D_801A9994 = D_801A9994 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A996C = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_80181ED0[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A995C); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A998C); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A9990); - uVar5 = (*(int*)&D_801A9994); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_80181ED0); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A9974; - -s32 func_8013E054(void) { - return D_801A9974; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_801828CC; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_801828A4; -extern s16 D_801828A6; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_801828CC; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_801828A4 = 2; - D_801828A6 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_801828A6 = 0; - D_801828A4 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A99A8; - extern void * D_801A99AC; - extern unsigned char D_80182544; - extern unsigned char D_8018255C; - extern unsigned char D_801825D0; - extern unsigned char D_801825D8; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A99A8 = &D_80182544; - D_801A99AC = &D_801825D0; - } else { - D_801A99A8 = &D_8018255C; - D_801A99AC = &D_801825D8; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_801828CC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801828CC -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_801828CC)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_801828A8; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_801828A8)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801828A8)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_801828A4; -extern s16 D_801828A6; -extern unsigned char D_801828A8; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801828A6` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_801828A4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_801828A6; - if (*r < 3) { - *r = *r + 1; - } - D_801828A4 = (u16)D_801828A4 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801828A8); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_801828A8; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801828A8); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC07_001/ov_SC07_001_jr_801380E0.c b/src/ov_SC07_001/ov_SC07_001_jr_801380E0.c new file mode 100644 index 000000000..88ac8cc13 --- /dev/null +++ b/src/ov_SC07_001/ov_SC07_001_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A8700; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_801817C4[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A9864; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801AAEA0; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A8700; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_80181500)(); +extern s16 (*D_80181504)(); +extern M2C_UNK (*D_8018150C)(); +extern s32 (*D_80181510)(); +extern s32 D_801A9860; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A8704; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80181858; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80184D3C; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80181870; +extern M2C_UNK D_80181878; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80181880; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8018189C[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_801818A8[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_801818BC[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8018190C[]; +extern s16 D_8018193C[]; +extern s16 D_8018199C[]; +extern s16 D_801819A4[]; +extern s16 D_801819C4[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_801819FC[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80181A54[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80181A9C[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80181AA4[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80181AAC[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80181AB4[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80181A5C; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80181A7C; +extern void func_801321B0(int param_1); +extern int D_80181A8C; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A98D0; +extern s32 D_801A98D4[]; +extern int D_801A98D8; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80181AC0; +extern u8 D_80181ABC; +extern s16 *D_80181AC4; +extern u8 D_80181AC8; +extern int D_801A98D0; +extern u16 D_801A98E0; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80181AC4; /* holds a pointer value (*(u16**)&D_80181AC4) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80181AD8[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80181B2C; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80181B30[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80181B30[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80181B74; +extern u8 D_80181BB8; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80181B74; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80181BB8 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80181BFC[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80181C38[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80181C38; + if (((s16)a1) < 0xC00) { + tbl = D_80181BFC; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80181C74, D_80181C76, D_80181C78, D_80181C7A, D_80181C7C, D_80181C7E; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80181C76 < ang)) goto outer_else; + if (!(ang < D_80181C7C)) goto inner_else; + if (ang < D_80181C78) { *(s16 *)L = D_80181C78; goto done; } + if (D_80181C7A < ang) { *(s16 *)L = D_80181C7A; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80181C74) { *(s16 *)L = D_80181C74; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80181C7E < ang) { *(s16 *)L = D_80181C7E; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A9948; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A9948, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A9948; +extern s8 D_801A994C; +extern s8 D_801A994D; + +void func_8013C9C4(void * arg0) +{ + D_801A9948 = arg0; + D_801A994C = 0; + D_801A994D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A9948; +extern s8 D_801A994C; +extern s8 D_801A994D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A9948; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A994D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A994C)) * 2) + D_801A9948); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A994D = (unsigned char) p[1]; + D_801A994C = D_801A994C + 1; + if (D_801A994D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A994C = 0; + *base = 0; + } + } + else + { + D_801A994D = c - 1; + } + } + return; +} + + + +extern s32 D_801A996C; +extern s32 D_801A9960; +extern s32 D_801A9964; +extern s32 D_801A9970; + +void func_8013CABC(void) { + D_801A996C = 1; + D_801A9960 = 1; + D_801A9964 = 0; + D_801A9970 = 1; +} + + + +extern s32 D_801A9960; +extern s32 D_801A9964; +extern s32 D_801A9968; +extern s32 D_801A996C; +extern s32 D_801A9970; + +void func_8013CAE8(void) { + D_801A9960 = 1; + D_801A996C = 0; + D_801A9964 = 0; + D_801A9968 = -1; + D_801A9970 = 0; +} + + + +extern s32 D_801A996C; +extern s32 D_801A9970; +extern s32 D_801A9998; +extern s32 D_801A999C; + +void func_8013CB20(void) +{ + D_801A9998 = D_801A9970; + D_801A999C = D_801A996C; + D_801A9970 = 1; + D_801A996C = 0; +} + + + +extern s32 D_801A9998; +extern s32 D_801A999C; +extern s32 D_801A9970; +extern s32 D_801A996C; + +void func_8013CB5C(void) { + D_801A9970 = D_801A9998; + D_801A996C = D_801A999C; +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801AADB8; + extern u8 D_801AADB9; + extern u8 D_801AADBA; + extern u8 D_801AADBB; + extern u8 D_801AADBC; + extern u8 D_801AADBD; + extern u8 D_801AADBE; + extern u8 D_801AADBF; + extern u8 D_801AADC0; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801AADB8; t1 = D_801AADB9; t2 = D_801AADBA; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801AADBB; t1 = D_801AADBC; t2 = D_801AADBD; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801AADBE; t1 = D_801AADBF; t2 = D_801AADC0; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A9978; +extern s32 D_801A9960; +extern s32 D_801A997C; +extern s32 D_801A996C; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A9978 != 0) { + if (D_801A9978 != 2) { + if (((D_801A9978 < 3) && (D_801A9978 == 1)) && + (D_801A997C = D_801A997C + 1, 0x23a < D_801A997C)) { + D_801A9960 = D_801A9978; + D_801A9978 = 2; + } + } else { + D_801A9960 = D_801A9960 + -1; + if (D_801A9960 == 0) { + D_801A9960 = D_801A9978; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A996C == 0) { + D_801A9978 = D_801A9978 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A996C; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A996C; +} + + + +extern s32 D_801A9978; + +void func_8013D164(void) { + D_801A9978 = 1; +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801AAE9A; +extern u8 D_801AAF0E; +extern u8 D_801AADC2; +extern u8 D_801AAE7C; +extern u8 D_801AADA0; +extern u8 D_801AADC1; +extern s32 D_801AAE80; + +void func_8013D330(void) { + if ((D_801AAE9A & 0xff) != D_801AAF0E) { + D_801AAE9A = ((D_801AAE9A & 0xff) < D_801AAF0E) ? (D_801AAE9A + 1) : (D_801AAE9A - 1); + } + if ((D_801AADC2 & 0xff) != D_801AAE7C) { + D_801AADC2 = ((D_801AADC2 & 0xff) < D_801AAE7C) ? (D_801AADC2 + 1) : (D_801AADC2 - 1); + } + if ((D_801AADA0 & 0xff) != D_801AADC1) { + D_801AADA0 = ((D_801AADA0 & 0xff) < D_801AADC1) ? (D_801AADA0 + 1) : (D_801AADA0 - 1); + } + D_801AAE80 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A9950; +extern void *D_801A9954; +extern void *D_801A9958; +extern s32 D_801A9980; +extern s32 D_801A9984; +extern s32 D_801A9988; +extern s32 D_801AADF4[]; + +extern u8 D_80181D6C[]; +extern u8 D_80181E14[]; +extern u8 D_80181CC4[]; +extern u8 D_80181DC0[]; +extern u8 D_80181E40[]; +extern u8 D_80181D18[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A9980 = param_2; + D_801A9984 = (param_2 >> 2) & 3; + D_801A9988 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A9950 = D_80181D6C; + D_801A9954 = D_80181E14; + D_801A9958 = D_80181CC4; + } else { + D_801A9950 = D_80181DC0; + D_801A9954 = D_80181E40; + D_801A9958 = D_80181D18; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A9988 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A9980 & 2) != 0) { + D_801AADF4[0] = 0x140; + D_801AADF4[3] = 0x80; + if (p[0x37] == 4) { + D_801AADF4[0] = 0x140; + D_801AADF4[3] = 0; + } + if (p[0x37] == 0) { + D_801AADF4[0] = 0x140; + D_801AADF4[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A9958)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A9958; +extern s16 *D_801A995C; +extern s32 D_801A996C; +extern s32 D_801A998C; +extern s32 D_801A9990; +extern s32 D_801A9994; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A995C != 0) { + D_801A996C = 0; + p = (int *)(param_1 * 12 + (int)D_801A9958); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A998C != x) { + flag = 1; + if (D_801A998C < x) { + if (x - D_801A998C < 5) { + D_801A998C = x; + } else { + D_801A998C = D_801A998C + 4; + } + } else { + if (D_801A998C - x < 5) { + D_801A998C = x; + } else { + D_801A998C = D_801A998C - 4; + } + } + } + if (D_801A9990 != y) { + flag = 1; + if (D_801A9990 < y) { + if (y - D_801A9990 < 5) { + D_801A9990 = y; + } else { + D_801A9990 = D_801A9990 + 4; + } + } else { + if (D_801A9990 - y < 5) { + D_801A9990 = y; + } else { + D_801A9990 = D_801A9990 - 4; + } + } + } + if (D_801A9994 != z) { + flag = 1; + if (D_801A9994 < z) { + if (z - D_801A9994 < 5) { + D_801A9994 = z; + } else { + D_801A9994 = D_801A9994 + 4; + } + } else { + if (D_801A9994 - z < 5) { + D_801A9994 = z; + } else { + D_801A9994 = D_801A9994 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A996C = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_80181ED0[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A995C); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A998C); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A9990); + uVar5 = (*(int*)&D_801A9994); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_80181ED0); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A9974; + +s32 func_8013E054(void) { + return D_801A9974; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_801828CC; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_801828A4; +extern s16 D_801828A6; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_801828CC; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_801828A4 = 2; + D_801828A6 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_801828A6 = 0; + D_801828A4 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A99A8; + extern void * D_801A99AC; + extern unsigned char D_80182544; + extern unsigned char D_8018255C; + extern unsigned char D_801825D0; + extern unsigned char D_801825D8; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A99A8 = &D_80182544; + D_801A99AC = &D_801825D0; + } else { + D_801A99A8 = &D_8018255C; + D_801A99AC = &D_801825D8; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_801828CC/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_801828CC -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_801828CC)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_801828A8; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_801828A8)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_801828A8)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_801828A4; +extern s16 D_801828A6; +extern unsigned char D_801828A8; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_801828A6` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_801828A4` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_801828A6; + if (*r < 3) { + *r = *r + 1; + } + D_801828A4 = (u16)D_801828A4 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801828A8); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_801828A8; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_801828A8); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC07_001/nonmatchings/ov_SC07_001_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC07_002/ov_SC07_002_jr_8012ACE0.c b/src/ov_SC07_002/ov_SC07_002_jr_8012ACE0.c index f5af0cc7d..5e1558e49 100644 --- a/src/ov_SC07_002/ov_SC07_002_jr_8012ACE0.c +++ b/src/ov_SC07_002/ov_SC07_002_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_80186DEC[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_80186DEC[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_80186E30; -extern u8 D_80186E74; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_80186E30; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_80186E74 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_80186EB8[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_80186EF4[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_80186EF4; - if (((s16)a1) < 0xC00) { - tbl = D_80186EB8; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_80186F30, D_80186F32, D_80186F34, D_80186F36, D_80186F38, D_80186F3A; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_80186F32 < ang)) goto outer_else; - if (!(ang < D_80186F38)) goto inner_else; - if (ang < D_80186F34) { *(s16 *)L = D_80186F34; goto done; } - if (D_80186F36 < ang) { *(s16 *)L = D_80186F36; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_80186F30) { *(s16 *)L = D_80186F30; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_80186F3A < ang) { *(s16 *)L = D_80186F3A; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_8019A498; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_8019A498, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_8019A498; -extern s8 D_8019A49C; -extern s8 D_8019A49D; - -void func_8013C9C4(void * arg0) -{ - D_8019A498 = arg0; - D_8019A49C = 0; - D_8019A49D = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_8019A498; -extern s8 D_8019A49C; -extern s8 D_8019A49D; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_8019A498; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_8019A49D; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_8019A49C)) * 2) + D_8019A498); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_8019A49D = (unsigned char) p[1]; - D_8019A49C = D_8019A49C + 1; - if (D_8019A49D == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_8019A49C = 0; - *base = 0; - } - } - else - { - D_8019A49D = c - 1; - } - } - return; -} - - - -extern s32 D_8019A4BC; -extern s32 D_8019A4B0; -extern s32 D_8019A4B4; -extern s32 D_8019A4C0; - -void func_8013CABC(void) { - D_8019A4BC = 1; - D_8019A4B0 = 1; - D_8019A4B4 = 0; - D_8019A4C0 = 1; -} - - - -extern s32 D_8019A4B0; -extern s32 D_8019A4B4; -extern s32 D_8019A4B8; -extern s32 D_8019A4BC; -extern s32 D_8019A4C0; - -void func_8013CAE8(void) { - D_8019A4B0 = 1; - D_8019A4BC = 0; - D_8019A4B4 = 0; - D_8019A4B8 = -1; - D_8019A4C0 = 0; -} - - - -extern s32 D_8019A4BC; -extern s32 D_8019A4C0; -extern s32 D_8019A4E8; -extern s32 D_8019A4EC; - -void func_8013CB20(void) -{ - D_8019A4E8 = D_8019A4C0; - D_8019A4EC = D_8019A4BC; - D_8019A4C0 = 1; - D_8019A4BC = 0; -} - - - -extern s32 D_8019A4E8; -extern s32 D_8019A4EC; -extern s32 D_8019A4C0; -extern s32 D_8019A4BC; - -void func_8013CB5C(void) { - D_8019A4C0 = D_8019A4E8; - D_8019A4BC = D_8019A4EC; -} - - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_8019FF80; - extern u8 D_8019FF81; - extern u8 D_8019FF82; - extern u8 D_8019FF83; - extern u8 D_8019FF84; - extern u8 D_8019FF85; - extern u8 D_8019FF86; - extern u8 D_8019FF87; - extern u8 D_8019FF88; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_8019FF80; t1 = D_8019FF81; t2 = D_8019FF82; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_8019FF83; t1 = D_8019FF84; t2 = D_8019FF85; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_8019FF86; t1 = D_8019FF87; t2 = D_8019FF88; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_8019A4C8; -extern s32 D_8019A4B0; -extern s32 D_8019A4CC; -extern s32 D_8019A4BC; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_8019A4C8 != 0) { - if (D_8019A4C8 != 2) { - if (((D_8019A4C8 < 3) && (D_8019A4C8 == 1)) && - (D_8019A4CC = D_8019A4CC + 1, 0x23a < D_8019A4CC)) { - D_8019A4B0 = D_8019A4C8; - D_8019A4C8 = 2; - } - } else { - D_8019A4B0 = D_8019A4B0 + -1; - if (D_8019A4B0 == 0) { - D_8019A4B0 = D_8019A4C8; - ((void (*)(s32))func_8013D9B0)(2); - if (D_8019A4BC == 0) { - D_8019A4C8 = D_8019A4C8 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_8019A4BC; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_8019A4BC; -} - - - -extern s32 D_8019A4C8; - -void func_8013D164(void) { - D_8019A4C8 = 1; -} - - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A0062; -extern u8 D_801A00D6; -extern u8 D_8019FF8C; -extern u8 D_801A0044; -extern u8 D_8019FF68; -extern u8 D_8019FF89; -extern s32 D_801A0048; - -void func_8013D330(void) { - if ((D_801A0062 & 0xff) != D_801A00D6) { - D_801A0062 = ((D_801A0062 & 0xff) < D_801A00D6) ? (D_801A0062 + 1) : (D_801A0062 - 1); - } - if ((D_8019FF8C & 0xff) != D_801A0044) { - D_8019FF8C = ((D_8019FF8C & 0xff) < D_801A0044) ? (D_8019FF8C + 1) : (D_8019FF8C - 1); - } - if ((D_8019FF68 & 0xff) != D_8019FF89) { - D_8019FF68 = ((D_8019FF68 & 0xff) < D_8019FF89) ? (D_8019FF68 + 1) : (D_8019FF68 - 1); - } - D_801A0048 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_8019A4A0; -extern void *D_8019A4A4; -extern void *D_8019A4A8; -extern s32 D_8019A4D0; -extern s32 D_8019A4D4; -extern s32 D_8019A4D8; -extern s32 D_8019FFBC[]; - -extern u8 D_80187028[]; -extern u8 D_801870D0[]; -extern u8 D_80186F80[]; -extern u8 D_8018707C[]; -extern u8 D_801870FC[]; -extern u8 D_80186FD4[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_8019A4D0 = param_2; - D_8019A4D4 = (param_2 >> 2) & 3; - D_8019A4D8 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_8019A4A0 = D_80187028; - D_8019A4A4 = D_801870D0; - D_8019A4A8 = D_80186F80; - } else { - D_8019A4A0 = D_8018707C; - D_8019A4A4 = D_801870FC; - D_8019A4A8 = D_80186FD4; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_8019A4D8 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_8019A4D0 & 2) != 0) { - D_8019FFBC[0] = 0x140; - D_8019FFBC[3] = 0x80; - if (p[0x37] == 4) { - D_8019FFBC[0] = 0x140; - D_8019FFBC[3] = 0; - } - if (p[0x37] == 0) { - D_8019FFBC[0] = 0x140; - D_8019FFBC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_8019A4A8)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_8019A4A8; -extern s16 *D_8019A4AC; -extern s32 D_8019A4BC; -extern s32 D_8019A4DC; -extern s32 D_8019A4E0; -extern s32 D_8019A4E4; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_8019A4AC != 0) { - D_8019A4BC = 0; - p = (int *)(param_1 * 12 + (int)D_8019A4A8); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_8019A4DC != x) { - flag = 1; - if (D_8019A4DC < x) { - if (x - D_8019A4DC < 5) { - D_8019A4DC = x; - } else { - D_8019A4DC = D_8019A4DC + 4; - } - } else { - if (D_8019A4DC - x < 5) { - D_8019A4DC = x; - } else { - D_8019A4DC = D_8019A4DC - 4; - } - } - } - if (D_8019A4E0 != y) { - flag = 1; - if (D_8019A4E0 < y) { - if (y - D_8019A4E0 < 5) { - D_8019A4E0 = y; - } else { - D_8019A4E0 = D_8019A4E0 + 4; - } - } else { - if (D_8019A4E0 - y < 5) { - D_8019A4E0 = y; - } else { - D_8019A4E0 = D_8019A4E0 - 4; - } - } - } - if (D_8019A4E4 != z) { - flag = 1; - if (D_8019A4E4 < z) { - if (z - D_8019A4E4 < 5) { - D_8019A4E4 = z; - } else { - D_8019A4E4 = D_8019A4E4 + 4; - } - } else { - if (D_8019A4E4 - z < 5) { - D_8019A4E4 = z; - } else { - D_8019A4E4 = D_8019A4E4 - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_8019A4BC = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8018718C[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_8019A4AC); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019A4DC); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019A4E0); - uVar5 = (*(int*)&D_8019A4E4); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8018718C); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_8019A4C4; - -s32 func_8013E054(void) { - return D_8019A4C4; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_80187B88; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_80187B60; -extern s16 D_80187B62; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_80187B88; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_80187B60 = 2; - D_80187B62 = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_80187B62 = 0; - D_80187B60 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_8019A4F8; - extern void * D_8019A4FC; - extern unsigned char D_80187800; - extern unsigned char D_80187818; - extern unsigned char D_8018788C; - extern unsigned char D_80187894; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_8019A4F8 = &D_80187800; - D_8019A4FC = &D_8018788C; - } else { - D_8019A4F8 = &D_80187818; - D_8019A4FC = &D_80187894; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_80187B88/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187B88 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_80187B88)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_80187B64; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187B64)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187B64)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_80187B60; -extern s16 D_80187B62; -extern unsigned char D_80187B64; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187B62` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_80187B60` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_80187B62; - if (*r < 3) { - *r = *r + 1; - } - D_80187B60 = (u16)D_80187B60 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187B64); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_80187B64; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187B64); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC07_002/ov_SC07_002_jr_801380E0.c b/src/ov_SC07_002/ov_SC07_002_jr_801380E0.c new file mode 100644 index 000000000..24b70bf22 --- /dev/null +++ b/src/ov_SC07_002/ov_SC07_002_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801990E8; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_80186A80[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019A3B4; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A0068; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801990E8; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_801867BC)(); +extern s16 (*D_801867C0)(); +extern M2C_UNK (*D_801867C8)(); +extern s32 (*D_801867CC)(); +extern s32 D_8019A3B0; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801990EC; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_80186B14; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80189FF8; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_80186B2C; +extern M2C_UNK D_80186B34; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_80186B3C; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_80186B58[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_80186B64[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_80186B78[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_80186BC8[]; +extern s16 D_80186BF8[]; +extern s16 D_80186C58[]; +extern s16 D_80186C60[]; +extern s16 D_80186C80[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_80186CB8[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_80186D10[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_80186D58[])(void); +extern void func_80131F28(void *a0); +extern void (*D_80186D60[])(void); +extern void func_80131F64(void *a0); +extern void (*D_80186D68[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_80186D70[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_80186D18; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_80186D38; +extern void func_801321B0(int param_1); +extern int D_80186D48; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_8019A420; +extern s32 D_8019A424[]; +extern int D_8019A428; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_80186D7C; +extern u8 D_80186D78; +extern s16 *D_80186D80; +extern u8 D_80186D84; +extern int D_8019A420; +extern u16 D_8019A430; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_80186D80; /* holds a pointer value (*(u16**)&D_80186D80) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_80186D94[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_80186DE8; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_80186DEC[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_80186DEC[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_80186E30; +extern u8 D_80186E74; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_80186E30; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_80186E74 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_80186EB8[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_80186EF4[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_80186EF4; + if (((s16)a1) < 0xC00) { + tbl = D_80186EB8; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_80186F30, D_80186F32, D_80186F34, D_80186F36, D_80186F38, D_80186F3A; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_80186F32 < ang)) goto outer_else; + if (!(ang < D_80186F38)) goto inner_else; + if (ang < D_80186F34) { *(s16 *)L = D_80186F34; goto done; } + if (D_80186F36 < ang) { *(s16 *)L = D_80186F36; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_80186F30) { *(s16 *)L = D_80186F30; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_80186F3A < ang) { *(s16 *)L = D_80186F3A; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_8019A498; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_8019A498, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_8019A498; +extern s8 D_8019A49C; +extern s8 D_8019A49D; + +void func_8013C9C4(void * arg0) +{ + D_8019A498 = arg0; + D_8019A49C = 0; + D_8019A49D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_8019A498; +extern s8 D_8019A49C; +extern s8 D_8019A49D; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_8019A498; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_8019A49D; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_8019A49C)) * 2) + D_8019A498); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_8019A49D = (unsigned char) p[1]; + D_8019A49C = D_8019A49C + 1; + if (D_8019A49D == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_8019A49C = 0; + *base = 0; + } + } + else + { + D_8019A49D = c - 1; + } + } + return; +} + + + +extern s32 D_8019A4BC; +extern s32 D_8019A4B0; +extern s32 D_8019A4B4; +extern s32 D_8019A4C0; + +void func_8013CABC(void) { + D_8019A4BC = 1; + D_8019A4B0 = 1; + D_8019A4B4 = 0; + D_8019A4C0 = 1; +} + + + +extern s32 D_8019A4B0; +extern s32 D_8019A4B4; +extern s32 D_8019A4B8; +extern s32 D_8019A4BC; +extern s32 D_8019A4C0; + +void func_8013CAE8(void) { + D_8019A4B0 = 1; + D_8019A4BC = 0; + D_8019A4B4 = 0; + D_8019A4B8 = -1; + D_8019A4C0 = 0; +} + + + +extern s32 D_8019A4BC; +extern s32 D_8019A4C0; +extern s32 D_8019A4E8; +extern s32 D_8019A4EC; + +void func_8013CB20(void) +{ + D_8019A4E8 = D_8019A4C0; + D_8019A4EC = D_8019A4BC; + D_8019A4C0 = 1; + D_8019A4BC = 0; +} + + + +extern s32 D_8019A4E8; +extern s32 D_8019A4EC; +extern s32 D_8019A4C0; +extern s32 D_8019A4BC; + +void func_8013CB5C(void) { + D_8019A4C0 = D_8019A4E8; + D_8019A4BC = D_8019A4EC; +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_8019FF80; + extern u8 D_8019FF81; + extern u8 D_8019FF82; + extern u8 D_8019FF83; + extern u8 D_8019FF84; + extern u8 D_8019FF85; + extern u8 D_8019FF86; + extern u8 D_8019FF87; + extern u8 D_8019FF88; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_8019FF80; t1 = D_8019FF81; t2 = D_8019FF82; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_8019FF83; t1 = D_8019FF84; t2 = D_8019FF85; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_8019FF86; t1 = D_8019FF87; t2 = D_8019FF88; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_8019A4C8; +extern s32 D_8019A4B0; +extern s32 D_8019A4CC; +extern s32 D_8019A4BC; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_8019A4C8 != 0) { + if (D_8019A4C8 != 2) { + if (((D_8019A4C8 < 3) && (D_8019A4C8 == 1)) && + (D_8019A4CC = D_8019A4CC + 1, 0x23a < D_8019A4CC)) { + D_8019A4B0 = D_8019A4C8; + D_8019A4C8 = 2; + } + } else { + D_8019A4B0 = D_8019A4B0 + -1; + if (D_8019A4B0 == 0) { + D_8019A4B0 = D_8019A4C8; + ((void (*)(s32))func_8013D9B0)(2); + if (D_8019A4BC == 0) { + D_8019A4C8 = D_8019A4C8 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_8019A4BC; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_8019A4BC; +} + + + +extern s32 D_8019A4C8; + +void func_8013D164(void) { + D_8019A4C8 = 1; +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A0062; +extern u8 D_801A00D6; +extern u8 D_8019FF8C; +extern u8 D_801A0044; +extern u8 D_8019FF68; +extern u8 D_8019FF89; +extern s32 D_801A0048; + +void func_8013D330(void) { + if ((D_801A0062 & 0xff) != D_801A00D6) { + D_801A0062 = ((D_801A0062 & 0xff) < D_801A00D6) ? (D_801A0062 + 1) : (D_801A0062 - 1); + } + if ((D_8019FF8C & 0xff) != D_801A0044) { + D_8019FF8C = ((D_8019FF8C & 0xff) < D_801A0044) ? (D_8019FF8C + 1) : (D_8019FF8C - 1); + } + if ((D_8019FF68 & 0xff) != D_8019FF89) { + D_8019FF68 = ((D_8019FF68 & 0xff) < D_8019FF89) ? (D_8019FF68 + 1) : (D_8019FF68 - 1); + } + D_801A0048 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_8019A4A0; +extern void *D_8019A4A4; +extern void *D_8019A4A8; +extern s32 D_8019A4D0; +extern s32 D_8019A4D4; +extern s32 D_8019A4D8; +extern s32 D_8019FFBC[]; + +extern u8 D_80187028[]; +extern u8 D_801870D0[]; +extern u8 D_80186F80[]; +extern u8 D_8018707C[]; +extern u8 D_801870FC[]; +extern u8 D_80186FD4[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_8019A4D0 = param_2; + D_8019A4D4 = (param_2 >> 2) & 3; + D_8019A4D8 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_8019A4A0 = D_80187028; + D_8019A4A4 = D_801870D0; + D_8019A4A8 = D_80186F80; + } else { + D_8019A4A0 = D_8018707C; + D_8019A4A4 = D_801870FC; + D_8019A4A8 = D_80186FD4; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_8019A4D8 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_8019A4D0 & 2) != 0) { + D_8019FFBC[0] = 0x140; + D_8019FFBC[3] = 0x80; + if (p[0x37] == 4) { + D_8019FFBC[0] = 0x140; + D_8019FFBC[3] = 0; + } + if (p[0x37] == 0) { + D_8019FFBC[0] = 0x140; + D_8019FFBC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_8019A4A8)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_8019A4A8; +extern s16 *D_8019A4AC; +extern s32 D_8019A4BC; +extern s32 D_8019A4DC; +extern s32 D_8019A4E0; +extern s32 D_8019A4E4; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_8019A4AC != 0) { + D_8019A4BC = 0; + p = (int *)(param_1 * 12 + (int)D_8019A4A8); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_8019A4DC != x) { + flag = 1; + if (D_8019A4DC < x) { + if (x - D_8019A4DC < 5) { + D_8019A4DC = x; + } else { + D_8019A4DC = D_8019A4DC + 4; + } + } else { + if (D_8019A4DC - x < 5) { + D_8019A4DC = x; + } else { + D_8019A4DC = D_8019A4DC - 4; + } + } + } + if (D_8019A4E0 != y) { + flag = 1; + if (D_8019A4E0 < y) { + if (y - D_8019A4E0 < 5) { + D_8019A4E0 = y; + } else { + D_8019A4E0 = D_8019A4E0 + 4; + } + } else { + if (D_8019A4E0 - y < 5) { + D_8019A4E0 = y; + } else { + D_8019A4E0 = D_8019A4E0 - 4; + } + } + } + if (D_8019A4E4 != z) { + flag = 1; + if (D_8019A4E4 < z) { + if (z - D_8019A4E4 < 5) { + D_8019A4E4 = z; + } else { + D_8019A4E4 = D_8019A4E4 + 4; + } + } else { + if (D_8019A4E4 - z < 5) { + D_8019A4E4 = z; + } else { + D_8019A4E4 = D_8019A4E4 - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_8019A4BC = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8018718C[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_8019A4AC); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_8019A4DC); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_8019A4E0); + uVar5 = (*(int*)&D_8019A4E4); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8018718C); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_8019A4C4; + +s32 func_8013E054(void) { + return D_8019A4C4; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_80187B88; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_80187B60; +extern s16 D_80187B62; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_80187B88; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_80187B60 = 2; + D_80187B62 = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_80187B62 = 0; + D_80187B60 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_8019A4F8; + extern void * D_8019A4FC; + extern unsigned char D_80187800; + extern unsigned char D_80187818; + extern unsigned char D_8018788C; + extern unsigned char D_80187894; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_8019A4F8 = &D_80187800; + D_8019A4FC = &D_8018788C; + } else { + D_8019A4F8 = &D_80187818; + D_8019A4FC = &D_80187894; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_80187B88/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_80187B88 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_80187B88)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_80187B64; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_80187B64)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_80187B64)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_80187B60; +extern s16 D_80187B62; +extern unsigned char D_80187B64; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_80187B62` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_80187B60` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_80187B62; + if (*r < 3) { + *r = *r + 1; + } + D_80187B60 = (u16)D_80187B60 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187B64); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_80187B64; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_80187B64); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC07_008/ov_SC07_008_jr_8012ACE0.c b/src/ov_SC07_008/ov_SC07_008_jr_8012ACE0.c index 0ebc44e37..f20e3a562 100644 --- a/src/ov_SC07_008/ov_SC07_008_jr_8012ACE0.c +++ b/src/ov_SC07_008/ov_SC07_008_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017D904[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017D904[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017D948; -extern u8 D_8017D98C; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017D948; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017D98C + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017D9D0[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017DA0C[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017DA0C; - if (((s16)a1) < 0xC00) { - tbl = D_8017D9D0; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017DA48, D_8017DA4A, D_8017DA4C, D_8017DA4E, D_8017DA50, D_8017DA52; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017DA4A < ang)) goto outer_else; - if (!(ang < D_8017DA50)) goto inner_else; - if (ang < D_8017DA4C) { *(s16 *)L = D_8017DA4C; goto done; } - if (D_8017DA4E < ang) { *(s16 *)L = D_8017DA4E; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017DA48) { *(s16 *)L = D_8017DA48; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017DA52 < ang) { *(s16 *)L = D_8017DA52; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_80195380; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_80195380, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_80195380; -extern s8 D_80195384; -extern s8 D_80195385; - -void func_8013C9C4(void * arg0) -{ - D_80195380 = arg0; - D_80195384 = 0; - D_80195385 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_80195380; -extern s8 D_80195384; -extern s8 D_80195385; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_80195380; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_80195385; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_80195384)) * 2) + D_80195380); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_80195385 = (unsigned char) p[1]; - D_80195384 = D_80195384 + 1; - if (D_80195385 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_80195384 = 0; - *base = 0; - } - } - else - { - D_80195385 = c - 1; - } - } - return; -} - - - -extern s32 D_801953A4; -extern s32 D_80195398; -extern s32 D_8019539C; -extern s32 D_801953A8; - -void func_8013CABC(void) { - D_801953A4 = 1; - D_80195398 = 1; - D_8019539C = 0; - D_801953A8 = 1; -} - - - -extern s32 D_80195398; -extern s32 D_8019539C; -extern s32 D_801953A0; -extern s32 D_801953A4; -extern s32 D_801953A8; - -void func_8013CAE8(void) { - D_80195398 = 1; - D_801953A4 = 0; - D_8019539C = 0; - D_801953A0 = -1; - D_801953A8 = 0; -} - - - -extern s32 D_801953A4; -extern s32 D_801953A8; -extern s32 D_801953D0; -extern s32 D_801953D4; - -void func_8013CB20(void) -{ - D_801953D0 = D_801953A8; - D_801953D4 = D_801953A4; - D_801953A8 = 1; - D_801953A4 = 0; -} - - - -extern s32 D_801953D0; -extern s32 D_801953D4; -extern s32 D_801953A8; -extern s32 D_801953A4; - -void func_8013CB5C(void) { - D_801953A8 = D_801953D0; - D_801953A4 = D_801953D4; -} - - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801965F0; - extern u8 D_801965F1; - extern u8 D_801965F2; - extern u8 D_801965F3; - extern u8 D_801965F4; - extern u8 D_801965F5; - extern u8 D_801965F6; - extern u8 D_801965F7; - extern u8 D_801965F8; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801965F0; t1 = D_801965F1; t2 = D_801965F2; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801965F3; t1 = D_801965F4; t2 = D_801965F5; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801965F6; t1 = D_801965F7; t2 = D_801965F8; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801953B0; -extern s32 D_80195398; -extern s32 D_801953B4; -extern s32 D_801953A4; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801953B0 != 0) { - if (D_801953B0 != 2) { - if (((D_801953B0 < 3) && (D_801953B0 == 1)) && - (D_801953B4 = D_801953B4 + 1, 0x23a < D_801953B4)) { - D_80195398 = D_801953B0; - D_801953B0 = 2; - } - } else { - D_80195398 = D_80195398 + -1; - if (D_80195398 == 0) { - D_80195398 = D_801953B0; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801953A4 == 0) { - D_801953B0 = D_801953B0 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801953A4; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801953A4; -} - - - -extern s32 D_801953B0; - -void func_8013D164(void) { - D_801953B0 = 1; -} - - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801966D2; -extern u8 D_80196746; -extern u8 D_801965FA; -extern u8 D_801966B4; -extern u8 D_801965D8; -extern u8 D_801965F9; -extern s32 D_801966B8; - -void func_8013D330(void) { - if ((D_801966D2 & 0xff) != D_80196746) { - D_801966D2 = ((D_801966D2 & 0xff) < D_80196746) ? (D_801966D2 + 1) : (D_801966D2 - 1); - } - if ((D_801965FA & 0xff) != D_801966B4) { - D_801965FA = ((D_801965FA & 0xff) < D_801966B4) ? (D_801965FA + 1) : (D_801965FA - 1); - } - if ((D_801965D8 & 0xff) != D_801965F9) { - D_801965D8 = ((D_801965D8 & 0xff) < D_801965F9) ? (D_801965D8 + 1) : (D_801965D8 - 1); - } - D_801966B8 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_80195388; -extern void *D_8019538C; -extern void *D_80195390; -extern s32 D_801953B8; -extern s32 D_801953BC; -extern s32 D_801953C0; -extern s32 D_8019662C[]; - -extern u8 D_8017DB40[]; -extern u8 D_8017DBE8[]; -extern u8 D_8017DA98[]; -extern u8 D_8017DB94[]; -extern u8 D_8017DC14[]; -extern u8 D_8017DAEC[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801953B8 = param_2; - D_801953BC = (param_2 >> 2) & 3; - D_801953C0 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_80195388 = D_8017DB40; - D_8019538C = D_8017DBE8; - D_80195390 = D_8017DA98; - } else { - D_80195388 = D_8017DB94; - D_8019538C = D_8017DC14; - D_80195390 = D_8017DAEC; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801953C0 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801953B8 & 2) != 0) { - D_8019662C[0] = 0x140; - D_8019662C[3] = 0x80; - if (p[0x37] == 4) { - D_8019662C[0] = 0x140; - D_8019662C[3] = 0; - } - if (p[0x37] == 0) { - D_8019662C[0] = 0x140; - D_8019662C[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_80195390)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_80195390; -extern s16 *D_80195394; -extern s32 D_801953A4; -extern s32 D_801953C4; -extern s32 D_801953C8; -extern s32 D_801953CC; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_80195394 != 0) { - D_801953A4 = 0; - p = (int *)(param_1 * 12 + (int)D_80195390); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801953C4 != x) { - flag = 1; - if (D_801953C4 < x) { - if (x - D_801953C4 < 5) { - D_801953C4 = x; - } else { - D_801953C4 = D_801953C4 + 4; - } - } else { - if (D_801953C4 - x < 5) { - D_801953C4 = x; - } else { - D_801953C4 = D_801953C4 - 4; - } - } - } - if (D_801953C8 != y) { - flag = 1; - if (D_801953C8 < y) { - if (y - D_801953C8 < 5) { - D_801953C8 = y; - } else { - D_801953C8 = D_801953C8 + 4; - } - } else { - if (D_801953C8 - y < 5) { - D_801953C8 = y; - } else { - D_801953C8 = D_801953C8 - 4; - } - } - } - if (D_801953CC != z) { - flag = 1; - if (D_801953CC < z) { - if (z - D_801953CC < 5) { - D_801953CC = z; - } else { - D_801953CC = D_801953CC + 4; - } - } else { - if (D_801953CC - z < 5) { - D_801953CC = z; - } else { - D_801953CC = D_801953CC - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801953A4 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017DCA4[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_80195394); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801953C4); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801953C8); - uVar5 = (*(int*)&D_801953CC); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017DCA4); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801953AC; - -s32 func_8013E054(void) { - return D_801953AC; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017E6A0; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017E678; -extern s16 D_8017E67A; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017E6A0; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017E678 = 2; - D_8017E67A = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017E67A = 0; - D_8017E678 = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801953E0; - extern void * D_801953E4; - extern unsigned char D_8017E318; - extern unsigned char D_8017E330; - extern unsigned char D_8017E3A4; - extern unsigned char D_8017E3AC; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801953E0 = &D_8017E318; - D_801953E4 = &D_8017E3A4; - } else { - D_801953E0 = &D_8017E330; - D_801953E4 = &D_8017E3AC; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017E6A0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017E6A0 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017E6A0)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017E67C; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017E67C)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017E67C)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017E678; -extern s16 D_8017E67A; -extern unsigned char D_8017E67C; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017E67A` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017E678` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017E67A; - if (*r < 3) { - *r = *r + 1; - } - D_8017E678 = (u16)D_8017E678 + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017E67C); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017E67C; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017E67C); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC07_008/ov_SC07_008_jr_801380E0.c b/src/ov_SC07_008/ov_SC07_008_jr_801380E0.c new file mode 100644 index 000000000..4ab3ca6ce --- /dev/null +++ b/src/ov_SC07_008/ov_SC07_008_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_80194138; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017D598[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_8019529C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801966D8; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_80194138; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017D2D4)(); +extern s16 (*D_8017D2D8)(); +extern M2C_UNK (*D_8017D2E0)(); +extern s32 (*D_8017D2E4)(); +extern s32 D_80195298; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_8019413C; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017D62C; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_80180B10; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017D644; +extern M2C_UNK D_8017D64C; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017D654; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017D670[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017D67C[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017D690[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017D6E0[]; +extern s16 D_8017D710[]; +extern s16 D_8017D770[]; +extern s16 D_8017D778[]; +extern s16 D_8017D798[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017D7D0[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017D828[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017D870[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017D878[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017D880[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017D888[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017D830; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017D850; +extern void func_801321B0(int param_1); +extern int D_8017D860; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_80195308; +extern s32 D_8019530C[]; +extern int D_80195310; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017D894; +extern u8 D_8017D890; +extern s16 *D_8017D898; +extern u8 D_8017D89C; +extern int D_80195308; +extern u16 D_80195318; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017D898; /* holds a pointer value (*(u16**)&D_8017D898) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017D8AC[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017D900; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017D904[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017D904[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017D948; +extern u8 D_8017D98C; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017D948; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017D98C + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017D9D0[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017DA0C[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017DA0C; + if (((s16)a1) < 0xC00) { + tbl = D_8017D9D0; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017DA48, D_8017DA4A, D_8017DA4C, D_8017DA4E, D_8017DA50, D_8017DA52; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017DA4A < ang)) goto outer_else; + if (!(ang < D_8017DA50)) goto inner_else; + if (ang < D_8017DA4C) { *(s16 *)L = D_8017DA4C; goto done; } + if (D_8017DA4E < ang) { *(s16 *)L = D_8017DA4E; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017DA48) { *(s16 *)L = D_8017DA48; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017DA52 < ang) { *(s16 *)L = D_8017DA52; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_80195380; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_80195380, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_80195380; +extern s8 D_80195384; +extern s8 D_80195385; + +void func_8013C9C4(void * arg0) +{ + D_80195380 = arg0; + D_80195384 = 0; + D_80195385 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_80195380; +extern s8 D_80195384; +extern s8 D_80195385; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_80195380; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_80195385; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_80195384)) * 2) + D_80195380); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_80195385 = (unsigned char) p[1]; + D_80195384 = D_80195384 + 1; + if (D_80195385 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_80195384 = 0; + *base = 0; + } + } + else + { + D_80195385 = c - 1; + } + } + return; +} + + + +extern s32 D_801953A4; +extern s32 D_80195398; +extern s32 D_8019539C; +extern s32 D_801953A8; + +void func_8013CABC(void) { + D_801953A4 = 1; + D_80195398 = 1; + D_8019539C = 0; + D_801953A8 = 1; +} + + + +extern s32 D_80195398; +extern s32 D_8019539C; +extern s32 D_801953A0; +extern s32 D_801953A4; +extern s32 D_801953A8; + +void func_8013CAE8(void) { + D_80195398 = 1; + D_801953A4 = 0; + D_8019539C = 0; + D_801953A0 = -1; + D_801953A8 = 0; +} + + + +extern s32 D_801953A4; +extern s32 D_801953A8; +extern s32 D_801953D0; +extern s32 D_801953D4; + +void func_8013CB20(void) +{ + D_801953D0 = D_801953A8; + D_801953D4 = D_801953A4; + D_801953A8 = 1; + D_801953A4 = 0; +} + + + +extern s32 D_801953D0; +extern s32 D_801953D4; +extern s32 D_801953A8; +extern s32 D_801953A4; + +void func_8013CB5C(void) { + D_801953A8 = D_801953D0; + D_801953A4 = D_801953D4; +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801965F0; + extern u8 D_801965F1; + extern u8 D_801965F2; + extern u8 D_801965F3; + extern u8 D_801965F4; + extern u8 D_801965F5; + extern u8 D_801965F6; + extern u8 D_801965F7; + extern u8 D_801965F8; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801965F0; t1 = D_801965F1; t2 = D_801965F2; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801965F3; t1 = D_801965F4; t2 = D_801965F5; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801965F6; t1 = D_801965F7; t2 = D_801965F8; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801953B0; +extern s32 D_80195398; +extern s32 D_801953B4; +extern s32 D_801953A4; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801953B0 != 0) { + if (D_801953B0 != 2) { + if (((D_801953B0 < 3) && (D_801953B0 == 1)) && + (D_801953B4 = D_801953B4 + 1, 0x23a < D_801953B4)) { + D_80195398 = D_801953B0; + D_801953B0 = 2; + } + } else { + D_80195398 = D_80195398 + -1; + if (D_80195398 == 0) { + D_80195398 = D_801953B0; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801953A4 == 0) { + D_801953B0 = D_801953B0 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801953A4; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801953A4; +} + + + +extern s32 D_801953B0; + +void func_8013D164(void) { + D_801953B0 = 1; +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801966D2; +extern u8 D_80196746; +extern u8 D_801965FA; +extern u8 D_801966B4; +extern u8 D_801965D8; +extern u8 D_801965F9; +extern s32 D_801966B8; + +void func_8013D330(void) { + if ((D_801966D2 & 0xff) != D_80196746) { + D_801966D2 = ((D_801966D2 & 0xff) < D_80196746) ? (D_801966D2 + 1) : (D_801966D2 - 1); + } + if ((D_801965FA & 0xff) != D_801966B4) { + D_801965FA = ((D_801965FA & 0xff) < D_801966B4) ? (D_801965FA + 1) : (D_801965FA - 1); + } + if ((D_801965D8 & 0xff) != D_801965F9) { + D_801965D8 = ((D_801965D8 & 0xff) < D_801965F9) ? (D_801965D8 + 1) : (D_801965D8 - 1); + } + D_801966B8 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_80195388; +extern void *D_8019538C; +extern void *D_80195390; +extern s32 D_801953B8; +extern s32 D_801953BC; +extern s32 D_801953C0; +extern s32 D_8019662C[]; + +extern u8 D_8017DB40[]; +extern u8 D_8017DBE8[]; +extern u8 D_8017DA98[]; +extern u8 D_8017DB94[]; +extern u8 D_8017DC14[]; +extern u8 D_8017DAEC[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801953B8 = param_2; + D_801953BC = (param_2 >> 2) & 3; + D_801953C0 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_80195388 = D_8017DB40; + D_8019538C = D_8017DBE8; + D_80195390 = D_8017DA98; + } else { + D_80195388 = D_8017DB94; + D_8019538C = D_8017DC14; + D_80195390 = D_8017DAEC; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801953C0 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801953B8 & 2) != 0) { + D_8019662C[0] = 0x140; + D_8019662C[3] = 0x80; + if (p[0x37] == 4) { + D_8019662C[0] = 0x140; + D_8019662C[3] = 0; + } + if (p[0x37] == 0) { + D_8019662C[0] = 0x140; + D_8019662C[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_80195390)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_80195390; +extern s16 *D_80195394; +extern s32 D_801953A4; +extern s32 D_801953C4; +extern s32 D_801953C8; +extern s32 D_801953CC; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_80195394 != 0) { + D_801953A4 = 0; + p = (int *)(param_1 * 12 + (int)D_80195390); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801953C4 != x) { + flag = 1; + if (D_801953C4 < x) { + if (x - D_801953C4 < 5) { + D_801953C4 = x; + } else { + D_801953C4 = D_801953C4 + 4; + } + } else { + if (D_801953C4 - x < 5) { + D_801953C4 = x; + } else { + D_801953C4 = D_801953C4 - 4; + } + } + } + if (D_801953C8 != y) { + flag = 1; + if (D_801953C8 < y) { + if (y - D_801953C8 < 5) { + D_801953C8 = y; + } else { + D_801953C8 = D_801953C8 + 4; + } + } else { + if (D_801953C8 - y < 5) { + D_801953C8 = y; + } else { + D_801953C8 = D_801953C8 - 4; + } + } + } + if (D_801953CC != z) { + flag = 1; + if (D_801953CC < z) { + if (z - D_801953CC < 5) { + D_801953CC = z; + } else { + D_801953CC = D_801953CC + 4; + } + } else { + if (D_801953CC - z < 5) { + D_801953CC = z; + } else { + D_801953CC = D_801953CC - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801953A4 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017DCA4[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_80195394); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801953C4); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801953C8); + uVar5 = (*(int*)&D_801953CC); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017DCA4); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801953AC; + +s32 func_8013E054(void) { + return D_801953AC; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017E6A0; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017E678; +extern s16 D_8017E67A; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017E6A0; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017E678 = 2; + D_8017E67A = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017E67A = 0; + D_8017E678 = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801953E0; + extern void * D_801953E4; + extern unsigned char D_8017E318; + extern unsigned char D_8017E330; + extern unsigned char D_8017E3A4; + extern unsigned char D_8017E3AC; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801953E0 = &D_8017E318; + D_801953E4 = &D_8017E3A4; + } else { + D_801953E0 = &D_8017E330; + D_801953E4 = &D_8017E3AC; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017E6A0/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017E6A0 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017E6A0)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017E67C; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017E67C)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017E67C)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017E678; +extern s16 D_8017E67A; +extern unsigned char D_8017E67C; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017E67A` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017E678` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017E67A; + if (*r < 3) { + *r = *r + 1; + } + D_8017E678 = (u16)D_8017E678 + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017E67C); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017E67C; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017E67C); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC07_008/nonmatchings/ov_SC07_008_jr_801380E0", func_8013FAF8); + diff --git a/src/ov_SC07_009/ov_SC07_009_jr_8012ACE0.c b/src/ov_SC07_009/ov_SC07_009_jr_8012ACE0.c index 313bfc2db..8d1bbc401 100644 --- a/src/ov_SC07_009/ov_SC07_009_jr_8012ACE0.c +++ b/src/ov_SC07_009/ov_SC07_009_jr_8012ACE0.c @@ -2825,1334 +2825,3 @@ int func_80137D08(int arg0, int arg1, short arg2) INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_80137DD4); DEFINE_func_80137FD8() /* dedup: shared engine-core @0x80137FD8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_801380E0); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_801387B8); - -DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ - -DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ - -DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ - -DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one: MATCH 20 ins) - -extern void (*D_8017E3A8[])(void); - -void func_80138BE0(int p) -{ - if (*(unsigned short *)(p + 0xe) != 0) { - *(unsigned short *)(p + 0xe) -= 1; - } - D_8017E3A8[*(short *)(p + 4)](); -} - - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_80138C30); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_80138C60); - -DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ - -DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_80138DE0); - -DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ - -DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ - -DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ - -DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ - -DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ - -DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_801395D4); - -DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ - -DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ - -DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ - - -extern short D_800B9A02; -extern u8 D_800A6518[]; -extern u8 D_8017E3EC; -extern u8 D_8017E430; -extern void GsSortSprite(void *a0, u8 *a1, s32 a2); - -void func_801397B0(s32 arg0) -{ - register u8 *e __asm__("$7"); - register s32 off __asm__("$4"); - s32 buf[12]; - u8 *b164; - u8 *b1A8; - s32 sc; - s32 t2; - s32 t0; - s32 hi; - s32 lo; - s32 uu; - s32 vv; - - e = (u8 *)arg0; - b164 = (u8 *)&D_8017E3EC; - off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; - b164 = off + b164; - - *(s32 *)((u8 *)buf + 0x00) = 0; - - t2 = *(s16 *)(b164 + 2); - t0 = *(s16 *)(b164 + 0); - hi = (t2 & 0x100) >> 4; - lo = ((t0 & 0x3C0) >> 6) | 0x20; - *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); - - b1A8 = (u8 *)&D_8017E430 + off; - *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); - *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); - *(u8 *)((u8 *)buf + 0x16) = 0x80; - *(u8 *)((u8 *)buf + 0x15) = 0x80; - *(u8 *)((u8 *)buf + 0x14) = 0x80; - *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); - *(s16 *)((u8 *)buf + 0x08) = 0x20; - *(s16 *)((u8 *)buf + 0x0A) = 0x28; - - uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; - *(u8 *)((u8 *)buf + 0x0E) = uu; - vv = *(u16 *)(b164 + 2); - *(u8 *)((u8 *)buf + 0x0F) = vv; - - if (*(u8 *)(e + 0x22) & 8) { - *(s16 *)((u8 *)buf + 0x04) = - *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; - sc = -*(u16 *)(e + 0x28); - } else { - *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; - sc = *(u16 *)(e + 0x28); - } - *(s16 *)((u8 *)buf + 0x1C) = sc; - *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); - *(s16 *)((u8 *)buf + 0x1A) = 0; - *(s16 *)((u8 *)buf + 0x18) = 0; - *(s32 *)((u8 *)buf + 0x20) = 0; - - GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], - *(u16 *)(e + 0x1A)); -} - - -DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ - -DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ - -DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ - -DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ - -DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ - -DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ - -DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ - -DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ - -DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_80139BE0); - -DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ - -DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ - -DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ - -DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ - -DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ - -DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ - -DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ - -DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ - -DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ - -DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ - -DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ - -DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ - -DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ - -DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ - -DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ - -DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ - -DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ - -DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ - -DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ - -DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ - -DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ - -DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ - -DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ - -DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ - -DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ - -DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ - -DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ - -// @class: schedule -// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` -// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of -// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else -// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm -// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc -// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. -#include "common.h" - -typedef struct { s16 x, y; } Pair_8013AD38; - -extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ -extern u8 D_8017E474[]; /* sign table, alt (when a1 < 0xC00) */ - -#define gte_ldv0(r0) __asm__ __volatile__( \ - "lwc2 $0, 0(%0)\n" \ - "lwc2 $1, 4(%0)\n" \ - : : "r"(r0) : "memory") - -#define gte_mvmva0() __asm__ __volatile__( \ - "nop\n" \ - "nop\n" \ - "mvmva 1, 0, 0, 0, 0\n" \ - : : : "memory") - -#define gte_stlvnl(r0) __asm__ __volatile__( \ - "swc2 $25, 0(%0)\n" \ - "swc2 $26, 4(%0)\n" \ - "swc2 $27, 8(%0)\n" \ - : : "r"(r0) : "memory") - -void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) -{ - extern s16 D_800D466C[]; - extern u8 D_8017E4B0[]; - - u8 *tbl; - s16 vec[4]; - s32 res[3]; - s32 i; - - tbl = D_8017E4B0; - if (((s16)a1) < 0xC00) { - tbl = D_8017E474; - } - - for (i = 0; i < 30; i++) { - vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); - vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); - gte_ldv0(vec); - gte_mvmva0(); - gte_stlvnl(res); - ((Pair_8013AD38 *)out2)[i].x = res[0]; - ((Pair_8013AD38 *)out2)[i].y = res[1]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; - } - ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; - if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; - if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; -} - - - -DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ - -DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ - - - -extern void *func_80010A08(s32); -extern s16 D_8017E4EC, D_8017E4EE, D_8017E4F0, D_8017E4F2, D_8017E4F4, D_8017E4F6; -extern u16 D_800D45F6; - -void func_8013B274(s32 a0, s32 a1, void *a2) -{ - u8 *p; - s32 L[10]; - s16 sa; - s32 quot; - s16 ang; - - p = (u8 *)func_80010A08(0x28); - p[3] = 9; - p[7] = 0x2C; - p[4] = 0x80; - p[5] = 0x80; - p[6] = 0x80; - *(s16 *)(p + 0x16) = 0x37; - *(s16 *)(p + 0xE) = 0x6FD6; - p[0xC] = 0xE0; - p[0xD] = 0; - p[0x14] = 0xEF; - p[0x15] = 0; - p[0x1C] = 0xE0; - p[0x1D] = 0xF; - p[0x24] = 0xEF; - p[0x25] = 0xF; - - sa = (s16)a1; - if (sa == 0) { - *(s16 *)L = 0; - } else { - quot = ((s32)sa << 12) / ((s16*)a2)[0]; - ang = (s16)quot; - if (!(D_8017E4EE < ang)) goto outer_else; - if (!(ang < D_8017E4F4)) goto inner_else; - if (ang < D_8017E4F0) { *(s16 *)L = D_8017E4F0; goto done; } - if (D_8017E4F2 < ang) { *(s16 *)L = D_8017E4F2; goto done; } - *(s16 *)L = quot; - goto done; - outer_else: - if (ang < D_8017E4EC) { *(s16 *)L = D_8017E4EC; goto done; } - *(s16 *)L = quot; - goto done; - inner_else: - if (D_8017E4F6 < ang) { *(s16 *)L = D_8017E4F6; goto done; } - *(s16 *)L = quot; - done: ; - } - *(s16 *)((u8 *)L + 2) = D_800D45F6; - - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 0, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 8) : "memory"); - - if (((s16*)a2)[1] > 0) - *(s32 *)((u8 *)L + 0xC) -= 1; - else - *(s32 *)((u8 *)L + 0xC) += 2; - - *(s16 *)L = 9; - *(s16 *)((u8 *)L + 2) = 9; - __asm__ __volatile__( - "lwc2 $0, 0(%0)\n" - "lwc2 $1, 4(%0)\n" - "nop\n" "nop\n" - "mvmva 1, 0, 0, 3, 0\n" - : : "r"(L) : "memory"); - __asm__ __volatile__( - "swc2 $25, 0(%0)\n" - "swc2 $26, 4(%0)\n" - "swc2 $27, 8(%0)\n" - : : "r"((u8 *)L + 0x18) : "memory"); - - *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); - *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); - *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); - *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); - - ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; - ((P_TAG *)a0)->addr = (u32)p; -} - - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013B568); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013B598); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013B6A0); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013B7AC); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013B7F4); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013B83C); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013BC7C); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013BCDC); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013BD34); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013BD74); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013C08C); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013C0F8); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013C360); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013C414); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013C938); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013C964); - - -/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== - * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel - * hand-matching wave declares each shared callee consistently and the one-big-TU build stops - * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 - * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm - * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to - * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the - * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ -extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ -extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ -extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ -extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ -extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ -extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ -extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ -extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ -extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ -extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ -extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ -extern s32 func_801759D8(void); /* derive-decl, arity 0 */ -extern s32 func_80175820(void); /* derive-decl, arity 0 */ -extern s32 func_801758FC(void); /* derive-decl, arity 0 */ -/* ==== end canonical-sig layer ==================================================== */ - -extern void func_80016714(void *a0, s32 a1); -extern s32 D_801A2A10; -extern s32 D_801269D4; -extern s32 D_801269C8; - -void func_8013C98C(void) { - func_80016714(&D_801A2A10, 8); - D_801269D4 = 0; - D_801269C8 = 0; -} - - -extern M2C_UNK D_80062BC0; -extern s32 D_801A2A10; -extern s8 D_801A2A14; -extern s8 D_801A2A15; - -void func_8013C9C4(void * arg0) -{ - D_801A2A10 = arg0; - D_801A2A14 = 0; - D_801A2A15 = 0; - if (func_80019198() == 0) { - func_80019064(&D_80062BC0); - } -} - - - - -extern s32 D_801A2A10; -extern s8 D_801A2A14; -extern s8 D_801A2A15; -extern s32 D_801269C8; -extern s32 D_801269D4; -void func_8013CA14(void) -{ - int *base = &D_801A2A10; - signed char *p; - unsigned char c; - int t; - if ((*base) != 0) - { - c = D_801A2A15; - if (c == 0) - { - p = (signed char *) ((((unsigned int) ((unsigned char) D_801A2A14)) * 2) + D_801A2A10); - t = (int) (*p); - D_801269D4 = t; - D_801269C8 = t; - D_801A2A15 = (unsigned char) p[1]; - D_801A2A14 = D_801A2A14 + 1; - if (D_801A2A15 == 0) - { - D_801269D4 = 0; - D_801269C8 = 0; - D_801A2A14 = 0; - *base = 0; - } - } - else - { - D_801A2A15 = c - 1; - } - } - return; -} - - - -extern s32 D_801A2A34; -extern s32 D_801A2A28; -extern s32 D_801A2A2C; -extern s32 D_801A2A38; - -void func_8013CABC(void) { - D_801A2A34 = 1; - D_801A2A28 = 1; - D_801A2A2C = 0; - D_801A2A38 = 1; -} - - - -extern s32 D_801A2A28; -extern s32 D_801A2A2C; -extern s32 D_801A2A30; -extern s32 D_801A2A34; -extern s32 D_801A2A38; - -void func_8013CAE8(void) { - D_801A2A28 = 1; - D_801A2A34 = 0; - D_801A2A2C = 0; - D_801A2A30 = -1; - D_801A2A38 = 0; -} - - - -extern s32 D_801A2A34; -extern s32 D_801A2A38; -extern s32 D_801A2A60; -extern s32 D_801A2A64; - -void func_8013CB20(void) -{ - D_801A2A60 = D_801A2A38; - D_801A2A64 = D_801A2A34; - D_801A2A38 = 1; - D_801A2A34 = 0; -} - - - -extern s32 D_801A2A60; -extern s32 D_801A2A64; -extern s32 D_801A2A38; -extern s32 D_801A2A34; - -void func_8013CB5C(void) { - D_801A2A38 = D_801A2A60; - D_801A2A34 = D_801A2A64; -} - - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013CB84); - -// @class: struct -// @stuck: none — MATCH (63 ins) -// -// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) -// and registers each via func_80028620(i, &rec[i]). -// -// Keys to the byte match: -// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized -// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). -// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of -// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie -// barrier (cookbook §21) also launders base, but the barrier pins the schedule and -// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the -// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). -// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not -// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only -// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 -// fold entirely (base opaque, all offsets small). -// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so -// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). -// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; -// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). -#include "common.h" - - -void func_8013CF68() -{ - extern void func_80028620(); - extern u8 D_800A5E94[]; - extern s32 D_800A5E8C; - extern s32 D_800A5E90; - extern u8 D_800A5E95; - extern u8 D_800A5E96; - extern u8 D_801A3C80; - extern u8 D_801A3C81; - extern u8 D_801A3C82; - extern u8 D_801A3C83; - extern u8 D_801A3C84; - extern u8 D_801A3C85; - extern u8 D_801A3C86; - extern u8 D_801A3C87; - extern u8 D_801A3C88; - - u8 t0, t1, t2; - u8 *base; - __asm__("la %0, D_800A5E94" : "=r"(base)); - - *(s32 *)(base - 0xC) = 0; - t0 = D_801A3C80; t1 = D_801A3C81; t2 = D_801A3C82; - D_800A5E8C = 0x1E; - D_800A5E90 = 0; - base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; - func_80028620(0, base - 0xC); - - *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; - t0 = D_801A3C83; t1 = D_801A3C84; t2 = D_801A3C85; - *(s32 *)(base + 0xC) = 0x14; - base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; - func_80028620(1, base + 4); - - *(s32 *)(base + 0x14) = 0; - t0 = D_801A3C86; t1 = D_801A3C87; t2 = D_801A3C88; - *(s32 *)(base + 0x18) = -0x12; - *(s32 *)(base + 0x1C) = 0; - base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; - func_80028620(2, base + 0x14); -} - - - - -// @class: schedule -// @stuck: testing if/else-if with ==2 placed as the else (tail) block - -extern s32 D_801A2A40; -extern s32 D_801A2A28; -extern s32 D_801A2A44; -extern s32 D_801A2A34; -extern void func_8013D9B0(void); - -void func_8013D064(void) -{ - if (D_801A2A40 != 0) { - if (D_801A2A40 != 2) { - if (((D_801A2A40 < 3) && (D_801A2A40 == 1)) && - (D_801A2A44 = D_801A2A44 + 1, 0x23a < D_801A2A44)) { - D_801A2A28 = D_801A2A40; - D_801A2A40 = 2; - } - } else { - D_801A2A28 = D_801A2A28 + -1; - if (D_801A2A28 == 0) { - D_801A2A28 = D_801A2A40; - ((void (*)(s32))func_8013D9B0)(2); - if (D_801A2A34 == 0) { - D_801A2A40 = D_801A2A40 + 1; - } - } - } - } - return; -} - - - - -extern void func_8013D9B0(void); -extern s32 D_801A2A34; - -s32 func_8013D13C(void) { - func_8013D9B0(); - return D_801A2A34; -} - - - -extern s32 D_801A2A40; - -void func_8013D164(void) { - D_801A2A40 = 1; -} - - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013D178); - - -// @class: other -// @stuck: none — MATCH (three step-toward-target byte clamps + word store) - -extern u8 D_801A3D62; -extern u8 D_801A3DD6; -extern u8 D_801A3C8A; -extern u8 D_801A3D44; -extern u8 D_801A3C68; -extern u8 D_801A3C89; -extern s32 D_801A3D48; - -void func_8013D330(void) { - if ((D_801A3D62 & 0xff) != D_801A3DD6) { - D_801A3D62 = ((D_801A3D62 & 0xff) < D_801A3DD6) ? (D_801A3D62 + 1) : (D_801A3D62 - 1); - } - if ((D_801A3C8A & 0xff) != D_801A3D44) { - D_801A3C8A = ((D_801A3C8A & 0xff) < D_801A3D44) ? (D_801A3C8A + 1) : (D_801A3C8A - 1); - } - if ((D_801A3C68 & 0xff) != D_801A3C89) { - D_801A3C68 = ((D_801A3C68 & 0xff) < D_801A3C89) ? (D_801A3C68 + 1) : (D_801A3C68 - 1); - } - D_801A3D48 = 1; -} - - - - -// @class: regalloc-order -// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) - -extern u8 D_80078E78[]; - -extern void *D_801A2A18; -extern void *D_801A2A1C; -extern void *D_801A2A20; -extern s32 D_801A2A48; -extern s32 D_801A2A4C; -extern s32 D_801A2A50; -extern s32 D_801A3CBC[]; - -extern u8 D_8017E5E4[]; -extern u8 D_8017E68C[]; -extern u8 D_8017E53C[]; -extern u8 D_8017E638[]; -extern u8 D_8017E6B8[]; -extern u8 D_8017E590[]; - -extern void func_8013D53C(void); -extern void func_8013DD68(void); -extern void func_8013D8FC(void); -extern void func_8013CF68(void); - -void func_8013D3D4(int param_1, int param_2) -{ - u8 *p = D_80078E78; - - D_801A2A48 = param_2; - D_801A2A4C = (param_2 >> 2) & 3; - D_801A2A50 = (param_2 >> 4) & 1; - if (((param_2 >> 2) & 3) == 0) { - D_801A2A18 = D_8017E5E4; - D_801A2A1C = D_8017E68C; - D_801A2A20 = D_8017E53C; - } else { - D_801A2A18 = D_8017E638; - D_801A2A1C = D_8017E6B8; - D_801A2A20 = D_8017E590; - } - func_8013D53C(); - if ((param_2 & 1) != 0) { - if (D_801A2A50 != 0) { - func_8013DD68(); - } else { - func_8013D8FC(); - } - func_8013CF68(); - if ((D_801A2A48 & 2) != 0) { - D_801A3CBC[0] = 0x140; - D_801A3CBC[3] = 0x80; - if (p[0x37] == 4) { - D_801A3CBC[0] = 0x140; - D_801A3CBC[3] = 0; - } - if (p[0x37] == 0) { - D_801A3CBC[0] = 0x140; - D_801A3CBC[3] = 0x80; - } - } - } -} - - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013D53C); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013D8FC); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013D9B0); - - -// @class: struct -// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith -// `(int*)(param_1*12 + (int)D_801A2A20)` makes the addu `offset+base` (dest=v0) so x/y/z -// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → -// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED -// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the -// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared -// sites; the merged form emits one slti + unconditional store and diverges. - -extern void *D_801A2A20; -extern s16 *D_801A2A24; -extern s32 D_801A2A34; -extern s32 D_801A2A54; -extern s32 D_801A2A58; -extern s32 D_801A2A5C; - -extern void func_8013DD68(void); - -void func_8013DBE4(int param_1) -{ - int *p; - int x, y, z; - int flag; - - if (D_801A2A24 != 0) { - D_801A2A34 = 0; - p = (int *)(param_1 * 12 + (int)D_801A2A20); - x = p[0]; - y = p[1]; - z = p[2]; - flag = 0; - if (D_801A2A54 != x) { - flag = 1; - if (D_801A2A54 < x) { - if (x - D_801A2A54 < 5) { - D_801A2A54 = x; - } else { - D_801A2A54 = D_801A2A54 + 4; - } - } else { - if (D_801A2A54 - x < 5) { - D_801A2A54 = x; - } else { - D_801A2A54 = D_801A2A54 - 4; - } - } - } - if (D_801A2A58 != y) { - flag = 1; - if (D_801A2A58 < y) { - if (y - D_801A2A58 < 5) { - D_801A2A58 = y; - } else { - D_801A2A58 = D_801A2A58 + 4; - } - } else { - if (D_801A2A58 - y < 5) { - D_801A2A58 = y; - } else { - D_801A2A58 = D_801A2A58 - 4; - } - } - } - if (D_801A2A5C != z) { - flag = 1; - if (D_801A2A5C < z) { - if (z - D_801A2A5C < 5) { - D_801A2A5C = z; - } else { - D_801A2A5C = D_801A2A5C + 4; - } - } else { - if (D_801A2A5C - z < 5) { - D_801A2A5C = z; - } else { - D_801A2A5C = D_801A2A5C - 4; - } - } - } - if (flag != 0) { - func_8013DD68(); - } - D_801A2A34 = flag; - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. - -typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; -typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ -typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ - - -#define IDVAL (*(u16 *)(pbase + 0xA3D2)) -#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) - -void func_8013DD68() { - extern void SetDrawEnv(void *p, void *env); - extern u16 D_800AF7B8; - extern u8 D_800BA0E4[]; - extern u8 D_8017E748[]; - - u32 *p; - u16 uVar1; - u16 *puVar16; - u16 *q; - u16 *puVar10; - register u16 uVar2 __asm__("$3"); - int uVar5; - register int iVar14 __asm__("$7"); - Buf_8013DD68 buf; - u8 *pbase; - u8 *base; - - pbase = D_800AF630; - puVar16 = (*(u16 * *)&D_801A2A24); - p = (*(u32 * *)&D_800A5E60); - uVar1 = *puVar16; - puVar16 = puVar16 + 1; - base = pbase + (u32)D_800AF7B8 * 0x5C; - buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); - *((u8 *)&buf + 0x18) = 0; - SetDrawEnv(p, &buf); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - iVar14 = 0; - if (uVar1 != 0) { - register int c5 __asm__("$11") = 5; - puVar10 = (u16 *)((int)p + 0x18); - q = puVar16 + 8; - do { - *(u8 *)((int)puVar10 + -0x15) = c5; - uVar2 = q[-6]; - *(u8 *)((int)puVar10 + -0xd) = 100; - *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A2A54); - *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A2A58); - uVar5 = (*(int*)&D_801A2A5C); - *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; - *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; - *(u16 *)((int)puVar10 + -0xc) = q[-4]; - iVar14 = iVar14 + 1; - *(u16 *)((int)puVar10 + -0xa) = q[-3]; - *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; - uVar2 = q[-7]; - *(u16 *)((int)puVar10 + -6) = 0x7800; - *(u8 *)((int)puVar10 + -7) = (u8)uVar2; - puVar16 = puVar16 + 8; - *(u16 *)((int)puVar10 + -4) = q[-2]; - *(u16 *)((int)puVar10 + -2) = q[-1]; - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - puVar10 = puVar10 + 0xc; - OTE->addr = (u32)p; - p = p + 6; - q = q + 8; - } while (iVar14 < (int)(u32)uVar1); - } - SetDrawEnv(p, D_8017E748); - ((P_TAG_8013DD68 *)p)->addr = OTE->addr; - OTE->addr = (u32)p; - p = p + 0x10; - (*(u32 * *)&D_800A5E60) = p; - return; -} - - - - -extern s32 D_801A2A3C; - -s32 func_8013E054(void) { - return D_801A2A3C; -} - - -DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ - -DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ - -DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ - -DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ - -DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ - -DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ - -DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ - -DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ - -DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ - -DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ - -DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ - -DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013E5E8); - -DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (90 ins, relocation-masked) - -extern u8 D_80078EC0; -extern u16 D_8011511A; -extern u16 D_80115124; -extern u8 D_80115148[]; -extern u8 D_80115140[]; -extern s32 D_8017F144; -extern u16 D_80115110; -extern s32 D_80115188; -extern s16 currentLocationId; -extern s16 D_8017F11C; -extern s16 D_8017F11E; -extern unsigned short D_80115112; - -extern void func_8013E83C(void); -extern s32 func_80029504(void); - -void func_8013E6AC(void) { - short i; - - func_8013E83C(); - D_8011511A = 0; - D_80115124 = D_80078EC0; - for (i = 0; i < 8; i++) { - *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; - D_80115140[i] = 0; - } - if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { - register s32 *ep __asm__("$8"); - register s32 *fp __asm__("$9"); - fp = (s32 *)&D_80115110; - ep = (s32 *)&D_8017F144; - for (i = 0; i < 5; i++) { - register s32 *fa __asm__("$6"); - s32 v; - fa = (s32 *)(i * 4 + (s32)fp); - v = ep[i] * 3 >> 2; - fa[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - D_8017F11C = 2; - D_8017F11E = 1; - { u16 *q = &D_80115112; *q += 1; } - } else { - func_8013E83C(); - D_8011511A = 7; - D_8017F11E = 0; - D_8017F11C = 0; - D_80115112 = 6; - } -} - - -DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ - -// @class: plumbing -// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) - -void func_8013E83C() { - extern void func_80141C0C(int); - extern unsigned short D_80115118; - extern unsigned short D_80115128; - extern unsigned short D_8011512E; - extern unsigned int D_80115130; - extern unsigned short D_80115158; - extern unsigned short D_8011515A; - extern unsigned short D_8011515C; - extern unsigned short D_8011515E; - extern unsigned short D_80115162; - extern unsigned short D_80115166; - extern void * D_801A2A70; - extern void * D_801A2A74; - extern unsigned char D_8017EDBC; - extern unsigned char D_8017EDD4; - extern unsigned char D_8017EE48; - extern unsigned char D_8017EE50; - - - D_80115118 = 0; - D_80115130 = 0; - if (D_8011511A >= 4) { - D_8011511A = D_8011511A - 3; - } - D_80115158 = 0x106; - - if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { - D_801A2A70 = &D_8017EDBC; - D_801A2A74 = &D_8017EE48; - } else { - D_801A2A70 = &D_8017EDD4; - D_801A2A74 = &D_8017EE50; - } - - D_8011515A = 0x104; - D_8011515C = 0x104; - D_8011515E = 0x129; - D_80115162 = 0x103; - D_80115166 = 0x105; - D_80115128 = 0; - D_8011512E = 0; - - if (D_80115110 == 3) { - ((void(*)(int, int))func_8002D4C8)(0x46e, 0); - } else { - func_80141C0C(0); - } -} - - - -// @class: schedule -// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the -// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept -// three bases (D_80115110/D_8017F144/D_80115188) and buried the branch-delay `sll` (i<<16 carry) -// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form -// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving -// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F144 -> $a3) and freeing the delay slot -// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally -// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. - -void func_8013E958() -{ - extern void func_8014AA28(void); - extern s32 func_800D0488(s32); - extern void func_80141C0C(s32); - - - s16 *p = &(*(s16*)&D_80115124); - s16 i; - s32 v; - s16 m; - - D_800B9A15 = 0; - func_80139954(); - if (D_80078EC0 != *p) { - func_8014AA28(); - if ((D_80078EC0 & 0x7F) != 0) { - m = D_80078EC0 & 0x7F; - *p = m; - if (m == 0 || func_800D0488(m) == 0) - goto loop; - } - } - *p = 0; -loop: - for (i = 0; i < 5; i++) { - s32 *q = &((s32 *)&D_80115110)[i]; - v = ((s32 *)&D_8017F144)[i] >> 6; - q[0x16] = v; - *(s32 *)((char *)&D_80115188 + (i << 2)) = v; - } - func_80141C0C(7); - (*(u16*)&D_80115112) = 4; -} - - - -DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ - - -// @class: regalloc-order -// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) - - -extern s32 func_80141C50(void); -extern void func_8013F350(void); -extern void func_8013FAF8(s32 a0, s32 a1); -extern s16 func_8014168C(s16 a0); -extern s32 func_8014032C(s32 a0, s32 a1); -extern void func_80139954(void); -extern void func_801376E8(int a0, int a1); -extern void func_80137B80(void); -extern unsigned char *func_80141CA4(void); -extern void func_8002D4C8(s32 a0, s32 a1); -extern void func_8013E958(void); - -extern short D_800B9A02; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; -extern u16 D_8011511E; -extern short D_80115128; -extern unsigned short D_80115112; -extern s16 D_8011512A; -extern s32 D_80115130; -extern unsigned char D_8017F120; - -void func_8013EB7C(void) { - s32 sp10[2]; - short sVar1; - register short sVar2 __asm__("$2"); - s32 a0v; - s32 iVar4; - - if ((s16)func_80141C50() == 0) { - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - sVar1 = ((short (*)(void))func_8013F350)(); - if (D_8011511A >= 4) { - func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); - } - func_8013FAF8(0, 5); - if (D_8011511A == 5) { - sVar2 = ((short (*)(s32))func_8014168C)(2); - a0v = 2; - } else { - sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); - a0v = (s16)D_8011511A; - } - iVar4 = func_8014032C(a0v, sVar2); - if (iVar4 != 0) { - s32 *p130 = &D_80115130; - if (iVar4 != *p130) { - *p130 = iVar4; - func_80139954(); - func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F120)); - } - } - func_80137B80(); - if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { - (*(s16 *)&D_80115128) = 0; - func_8002D4C8(0x466, 0); - if (D_8011511A != 4) { - func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F120)); - } - (*(unsigned short *)&D_80115112) -= 1; - } else { - if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { - func_8013E958(); - } - } - } - (void)sp10; -} - - -DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ - -extern short D_800B9A02; -extern unsigned short D_80115112; -extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern s16 D_8017F11C; -extern s16 D_8017F11E; -extern unsigned char D_8017F120; -extern void func_801376E8(int a0, int a1); -extern void func_8013FAF8(s32 a0, s32 a1); -extern unsigned char *func_80141CA4(void); - -// @class: struct -// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold -// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each -// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; -// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F11E` bump and -// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. -// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop -// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, -// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). -// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` -// cast on the `s16 D_8017F11C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. - -typedef struct { s32 f0; } E4; - - - -s32 func_8013EE10() { - extern E4 aD80115188[] __asm__("D_80115188"); - extern E4 D_80115168[]; - extern unsigned short D_80115118; - - short i; - u16 *p; - u16 old; - s16 *r; - u16 *c; - s32 sp10[2]; - - D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; - func_8013FAF8(0, 5); - for (i = 0; i < 5; i++) { - s32 t = D_80115168[i].f0 * 3 >> 2; - aD80115188[i].f0 = t; - D_80115168[i].f0 = D_80115168[i].f0 - t; - } - r = &D_8017F11E; - if (*r < 3) { - *r = *r + 1; - } - D_8017F11C = (u16)D_8017F11C + 2; - p = &D_80115118; - old = *p; - *p = old + 1; - if (old >= 5) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F120); - for (i = 0; i < 5; i++) { - s32 *q = (s32 *)((char *)p - 8); - *(s32 *)((char *)&q[i] + 0x78) = 0; - D_80115168[i].f0 = 0; - } - c = &D_80115112; - *c += 1; - } - (void)sp10; -} - - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013EF88); - - -// @class: struct -// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) - - -extern unsigned short D_80115118; -extern unsigned short D_80115112; -extern u16 D_80115110; -extern unsigned char D_8017F120; - -extern unsigned char *func_80141CA4(void); -extern void func_801376E8(int a0, int a1); - -void func_8013F138(void) { - u16 *p = &D_80115118; - *p += 0x10; - if ((u16)*p >= 0x40) { - if (D_80115110 == 0) { - ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F120); - } - D_80115112 += 1; - } -} - - -DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ - -DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013F350); - -INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_8012ACE0", func_8013FAF8); diff --git a/src/ov_SC07_009/ov_SC07_009_jr_801380E0.c b/src/ov_SC07_009/ov_SC07_009_jr_801380E0.c new file mode 100644 index 000000000..38f9dc41b --- /dev/null +++ b/src/ov_SC07_009/ov_SC07_009_jr_801380E0.c @@ -0,0 +1,2385 @@ +#include "common.h" +#include "../shared/engine_core.h" + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { int a; short cmd; short b; } Elem_8012ACE0_8012ACE0; /* 8-byte element, cmd @ +4 */ +typedef struct { char pad[0x90]; Elem_8012ACE0_8012ACE0 *list; } Owner_8012ACE0_8012ACE0; /* list ptr @ +0x90 */ +struct S8012D664_8012D664 { short a, b, c; }; +typedef struct Entry_8012DDA4 { + u16 active; + unsigned char pad[0x10C - 2]; +} Entry_8012DDA4; +typedef struct { char _b[8]; } M8_801312D0; /* size 8, alignment 1 -> unaligned copy */ +typedef struct { u16 f0, f2, f4; s16 f6; } Box_80133784; +typedef struct { + u16 f0; /* 0x0 */ + u16 f2; /* 0x2 */ + u16 f4; /* 0x4 */ + s16 f6; /* 0x6 */ +} Foo_80134510_80134510; +typedef struct { + /* 0x00 */ u16 f0; + /* 0x02 */ s16 f2; + /* 0x04 */ s16 f4; + /* 0x06 */ s16 f6; + /* 0x08 */ s16 f8; + /* 0x0A */ s16 fa; + /* 0x0C */ s16 fc; + /* 0x0E */ s16 fe; + /* 0x10 */ s16 f10; + /* 0x12 */ s16 f12; + /* 0x14 */ s16 f14; +} S0_801347A0; +typedef struct { + /* 0x0 */ s16 f0; + /* 0x2 */ s16 f2; + /* 0x4 */ s16 f4; + /* 0x6 */ s16 f6; +} Elem_801347A0; +typedef struct { + /* 0x0 */ u16 f0; + /* 0x2 */ u16 f2; + /* 0x4 */ u16 f4; + /* 0x6 */ u16 f6; +} SVec_801347A0; +typedef struct { char s[10]; } S10_80136C90; +extern void func_80128288(void); +extern void func_80128158(void); +extern void func_801285E4(void); +extern void func_80128178(void); +extern void func_80128678(void); +extern void func_80128198(void); +extern void func_80128714(void); +extern void func_801281B8(void); +extern void func_8013E67C(void); +extern void func_801281D8(void); +extern void func_8013E558(void); +extern void func_801281F8(void); +extern s32 D_801A17C4; +extern s32 func_80128218(void); +extern void func_80128A28(void); +extern void func_80128228(void); +extern void func_80128AF4(void); +extern void func_80128248(void); +extern void func_801282EC(void); +extern void func_80128268(void); +extern u16 D_800B99F6; +extern void (*D_8017E03C[])(void); +extern void func_80011B7C(int); +extern void func_801282CC(void); +extern void func_8001C0C8(void); +extern void func_80015310(void); +extern void func_80129258(void); +extern void func_801378F0(void); +extern void func_80010E14(void); +extern s16 currentLocationId; +extern s32 func_80029504(void); +extern s32 func_800CF854(s32); +extern s32 func_80128998(void); +extern s32 func_801289F0(void); +extern s32 func_801288E8(s32); +extern s32 func_80128940(s32); +extern s32 func_80029178(s32); +extern s32 func_801288B0(void); +extern void func_80011C10(void); +extern void func_8012832C(void); +extern void func_80129220(void); +extern void func_80011E24(void); +extern void func_80128C14(void); +extern void func_8002AEF8(void); +extern void func_800CFBBC(void); +extern void SsUtReverbOff(void); +extern void func_8013C98C(void); +extern void func_80129C40(s32 a0); +extern void func_800D0630(void); +extern void func_80145CEC(void); +extern void func_80144B9C(void); +extern u8 D_800B9A17; +extern u8 D_800B9A10; +extern void func_80128420(void); +extern s32 func_800D0588(void); +extern void func_801284B8(void); +extern void func_80175308(void); +extern void func_8016E8F0(void); +extern void func_80175494(void); +extern u8 D_800B9A64; +extern void func_801284F0(void); +extern void func_80146074(void); +extern void func_8012853C(void); +extern void func_80178608(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern s32 func_80011A3C(void); +extern short currentLocationId; +extern short D_800B99F2; +extern void func_80128564(void); +extern u8 D_800B9A11; +extern void func_801285D4(void); +extern s32 func_800D18DC(void); +extern void func_8014607C(void); +extern void func_801287B8(void); +extern s32 D_801A292C; +extern void func_80029444(void); +extern void func_800D1754(void); +extern s32 D_80126B58; +extern s32 D_801A3D68; +extern u16 D_800B99DA; +extern void func_80129CF8(void); +extern void func_8017849C(void); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_801505FC(s32 a0); +extern void func_801508B4(void *a0); +extern void func_80165E90(void); +extern void func_801627E8(void); +extern void func_80162B1C(void); +extern void func_80165CA0(void); +extern void func_80129010(void); +extern void func_8013CA14(void); +extern void func_800190AC(void); +extern void func_8012956C(void); +extern void func_8016E95C(void); +extern void func_801754A8(void); +extern void func_8013BC7C(void); +extern void func_8013BCDC(void); +extern void func_801379FC(void); +extern void func_8001212C(void); +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); +extern u8 D_800AEFD0; +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AF558; +extern int D_801A17C4; +extern int func_801288E8(int arg0); +extern u8 D_800AF560; +extern s32 func_80128940(s32 _arg0); +extern int D_800AECB0; +extern u8 D_800AECB8; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); +extern s16 D_800B9A00; +extern M2C_UNK (*D_8017DD78)(); +extern s16 (*D_8017DD7C)(); +extern M2C_UNK (*D_8017DD84)(); +extern s32 (*D_8017DD88)(); +extern s32 D_801A2928; +extern void func_80010AE0(s32 a0); +extern void func_80018450(s32 a0, s32 a1); +extern void func_800183E0(s32 a0); +extern void func_80128D60(s32 a0, s32 *a1, s32 *a2); +extern s32 func_80128DB4(s32 a0, s32 *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern M2C_UNK D_801A17C8; +extern void func_80128FAC(u16 *arg0); +extern s16 D_8011DB2C; +extern s16 D_8011DB30; +extern s32 D_80126AEC; +extern u8 *func_8012913C(s32 a0); +extern u8 * func_801290DC(s32 a0, u8 *a1); +extern void func_8001D074(s32 a, s32 b); +extern u8 *func_801291C0(void); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 * func_8012913C(s32 arg0); +extern void func_80016714(void *a0, s32 a1); +extern u8 * func_801291C0(void); +extern void func_80129248(s16 a0); +extern void func_801292C8(u8 *a0); +extern void func_8012927C(void); +extern void func_8012931C(struct vec *a0); +extern void func_80129350(s32 a0, s32 a1); +extern void func_80129374(s32 a0, s32 a1); +extern s16 D_800B9AAC[]; +extern s16 D_800B9AAE[]; +extern s16 D_800B9AB0[]; +extern s16 D_800B9AB2[]; +extern s16 D_800B9AB4[]; +extern s16 D_800B9AB6[]; +extern s16 D_800B9AB8[]; +extern s16 D_800B9ABA[]; +extern void func_80129398(void); +extern s16 D_80114EE0; +extern void func_80129428(void); +extern void func_8012943C(void); +extern s32 D_8005128C; +extern u8 D_800B9A78; +extern void func_801298F4(void *arg0); +extern void func_801299C8(s32 a, s32 b, s32 c); +extern void func_8012944C(void); +extern unsigned short D_800B99F0; +extern void func_8012A328(void); +extern void func_80053308(s32); +extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); (s16)-cast the return for the sll/sra */ +extern void GsSetRefView2L(void *); +extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ +extern u8 D_80127504; +extern s32 D_80126E60[]; +extern s32 D_80126F04[]; +extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_80126FA8[]; +extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +extern s32 D_800AE688[]; +extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +extern void func_8012A018(s32 a, s32 b); +extern void func_80129FF4(void); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern s16 D_80126940; +extern s16 D_80126942; +extern s16 D_80126944; +extern void func_8012A048(void *a0, s32 a1, u8 a2); +extern void *memcpy(void *, const void *, unsigned int); +extern void func_8012A094(s32 a0); +extern void func_8012A100(s8 a0); +extern void func_8012A0E0(void); +extern s8 D_801150D6; +extern s32 D_80120204; +extern s32 D_80120200; +extern s32 D_8012020C; +extern s32 D_80120208; +extern s16 D_80120218; +extern s16 D_80120210; +extern s16 D_8012021A; +extern s16 D_80120212; +extern s16 D_8012021C; +extern s16 D_80120214; +extern s16 D_80120226; +extern s16 D_80120220; +extern s16 D_80120228; +extern s16 D_80120222; +extern s16 D_8012022A; +extern s16 D_80120224; +extern s32 D_80120294; +extern s16 D_80120298; +extern s16 D_8012029A; +extern void func_8012A110(void); +extern s8 D_801152C0; +extern void func_8012A2F4(void); +extern s16 D_80127080; +extern s16 D_801152C2; +extern void func_8012A304(s32 a0, s32 a1); +extern s32 D_801151D4; +extern void func_8012A4BC(void); +extern void func_8012A62C(s32); +extern void func_8012A5F8(void (*a0)(void), s32 a1); +extern void func_8012A62C(s32 a0); +extern void func_8012A7D4(void *a0, void *a1); +extern s32 func_8012A6D0(void *a0, void *a1); +extern s16 func_8012A68C(void); +extern s16 func_8012A79C(s16 *a0, s16 *a1); +extern s16 func_8012A758(void); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_8012A7D4(void *arg0, void *arg1); +extern void func_8012AAAC(void); +extern void func_8012A828(s32 a0, void * a1); +extern int func_8012ACE0(void *a0); +extern void func_8012A860(void *a0, int a1); +extern void func_8012A8B0(u8 *a0, s32 a1); +extern void func_8012A8E8(void); +extern u8 D_801202A0[]; +extern u16 D_801270C0; +extern void func_8012A988(u8 *a0); +extern void func_8012A908(void); +extern s32 func_8012ACE0(void *a0); +extern M2C_UNK D_8017E0D0; +extern void func_8012ACA0(void *arg0); +extern s32 func_8012ACE0(void *o); +extern void func_8012AD44(s32 *a0, s16 a1); +extern s32 func_8012AD50(void * arg0); +extern void func_8012AD64(s32 *a0, s16 a1); +extern void func_8012AD6C(void *a0); +extern void func_8012AD80(s32 a0); +extern void func_8012ADE4(u8 *a0); +extern s32 *D_80126B78; +extern s32 *D_80126B90; +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80013478(s32 a0, s32 a1); +extern s32 func_8012AE00(s32 a0); +extern s32 func_8012AF0C(s32 a0, s32 a1); +extern s32 func_80134510(s32 arg); +extern s32 func_8012B030(u8 *a0); +extern int func_80047948(int a0); +extern int func_8004787C(int a0); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_8012B14C(s32 a0, s32 a1); +extern void func_8012B178(s32 a0, s32 a1); +extern void func_8012B1B4(s32 a0, s32 a1); +extern void func_8012B200(u8 *a0); +extern void func_8012B21C(void *a0); +extern void func_8012B23C(s32 a0); +extern void func_8012B260(u8 *a0); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern void RotMatrixYXZ(void *m, void *p); +extern void func_8012B370(int a0); +extern void func_8004978C(s16 *a0, void *a1); +extern void func_8012B414(int a0); +extern s32 func_8012B608(s32 a0, s32 a1, s32 a2); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern s32 func_8012B70C(s16 *a0, s16 *a1); +extern s32 ratan2(s32 x, s32 y); +extern s32 func_8012B744(void *a0, void *a1); +extern s16 D_80126CB8; +extern s16 D_80126CB4; +extern s32 func_8012B864(s32 a0); +extern s32 func_8012B8A4(s16 *a0); +extern s32 func_8012B8E4(s32 arg0, s32 arg1); +extern s32 func_8012BA10(s32 arg0, s32 arg1); +extern s32 func_8012BB3C(s32 arg0, s32 arg1, u32 arg2, s32 arg3); +extern void Square0(s32 *a0, s32 *a1); +extern s32 func_8012BC60(struct Vec *a0, struct Vec *a1); +extern s16 D_80126CBA; +extern s32 func_8012BCCC(s32 a0); +extern void func_80013350(s32 a0, void *a1); +extern u8 D_80126B5C; +extern void func_8012BD14(s32 a0); +extern s32 func_8012BDBC(s32 a0, s32 a1); +extern s32 func_8012BD3C(s32 a0, s32 a1, s32 a2); +extern void func_8012BE98(s32 a0, u16 *a1); +extern void func_8012BE54(s32 a0); +extern s32 func_800132BC(s32 a0, s32 a1); +extern void func_8012BE98(s32 arg0, u16 * arg1); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BF10(s32 a0, s32 a1); +extern void func_8012BF4C(s32 *a0, s32 a1); +extern void func_8012BF54(void *a0); +extern void func_8012BF68(void *a0); +extern s16 D_80126CB0; +extern s32 func_8012BF7C(s16 *a0); +extern s16 D_80126CAC; +extern short D_80126CAE; +extern int func_8012BFA8(short *a0); +extern s32 D_801274D4; +extern s32 D_801274E0; +extern s32 func_8012C044(s32 a0); +extern void func_8012C194(void); +extern void func_8001CFDC(s32 a, s32 b); +extern void func_8012C1B8(void); +extern u8 D_800B3DF0[]; +extern s32 func_8012C1DC(s32 a0); +extern void func_8012C218(void *a0); +extern u8 D_80126720[]; +extern u16 * func_8012C284(u16 *a0); +extern u8 D_80120194[]; +extern s32 func_8012C2D0(void); +extern s32 func_8012C31C(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern u8 D_80078EAE; +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern s32 func_8012C438(s32 a0, s32 a1); +extern s32 func_8012C890(s32 a0, s32 a1, s32 a2); +extern s32 func_8012C51C(void *a0, s32 a1); +extern s32 func_8012C588(s32 a0, s32 a1); +extern void func_8012C724(s32 a0, s32 a1); +extern s32 func_8012C820(u8 *a0); +extern s32 D_801815B4; +extern s16 D_801270C4; +extern u16 D_801274E4[]; +extern s32 D_8011DB08; +extern s32 func_8012CB64(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +extern void func_8012CC88(s32 a, s32 b, s32 c); +extern u8 D_800D3918[]; +extern void func_8012CBA4(s32 a0); +extern void func_8012CBCC(s32 a0); +extern void func_8012CBF4(s32 a0); +extern void func_8012CC1C(s32 arg0, s32 arg1); +extern void func_8012CC40(s32 arg0, s32 arg1); +extern void func_8012CC88(s32 a0, s32 a1, s32 a2); +extern void func_8012CC64(s32 a0, s32 a1); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern s32 func_8012CE2C(s32 a0); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); +extern void func_8012CFA8(s32 arg0); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_8012D3B4(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012D098(u16 *param_1, u32 param_2); +extern void func_8012D098(); +extern void func_8012D38C(int a0); +extern void func_8012D3AC(void); +extern s32 AddPrim(s32, void *); +extern s32 RotTransPers(s32, s32, s32 *, s32 *); +extern void SetLineF2(void *); +extern void *func_80010A08(s32); +extern void func_8004914C(void *); +extern void func_800491AC(void *); +extern s32 D_800A651C; +extern u8 D_800AF648; +extern s16 D_800B9A02; +extern void func_8012D4B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_8012D5DC(void); +extern s16 D_80126B98; +extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2); +extern s32 func_8012D5E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern int func_8012D664(); +extern void func_8012D624(s32 a0); +extern int func_8012D664(int arg0, int arg1, int arg2); +extern s32 func_8012D714(s32 param_1, u32 param_2); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8014C978(void); +extern M2C_UNK D_8017E0E8; +extern M2C_UNK D_8017E0F0; +extern s32 func_8012DB84(void); +extern s32 func_8012DE2C(s32 a0); +extern s32 func_8012DDA4(void); +extern s32 func_8012DBD0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8012DDA4(); +extern s32 func_8012DF34(s32 a0, s32 a1, s32 a2); +extern s16 D_80126B9A; +extern u8 D_801152A8[]; +extern void func_8012DFBC(void); +extern void func_8012DFCC(void); +extern void func_8012E014(void); +extern void func_8012E138(void); +extern void func_8012DFD4(u8 *a0); +extern s32 func_8012E27C(void); +extern void func_8012E284(void); +extern s32 GetTPage(s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern void func_8012E28C(s32 arg0, s32 arg1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void func_8012E32C(void); +extern s32 func_8012E470(s32 a0); +extern void func_8012E4C8(s32 a0); +extern s32 func_8012E504(s32 a0, s32 a1); +extern s32 func_8012E544(s32 a0); +extern s32 func_8012E57C(s32 a0, s32 a1); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E688(s32 param_1, u16 param_2, u16 param_3); +extern void func_8012E88C(u8 *a0); +extern void func_8012E8A8(u8 *a0); +extern void func_8012E8C4(u8 *a0); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8016AA50(int, int); +extern void func_8016B428(int); +extern void func_80019064(void *); +extern int D_8017E0F8; +extern void func_8012E9C0(int param_1); +extern void func_8012EC04(s32 param_1, s32 param_2, s32 *param_3); +extern s32 func_8002A4FC(s32 a0); +extern s32 func_8012EECC(s32 a0); +extern void func_8012EFB8(s32 a0); +extern void func_8012EF34(s32 a0, s32 a1); +extern void func_8012EF70(s32 a0, s32 a1); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2); +extern void RotTransSV(s32 a0, s32 a1, void *a2); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2); +extern void func_8012F2E8(s32 a0, s32 a1, s32 a2); +extern s16 D_80126CB6; +extern void func_8012F374(s32 a0, s32 a1); +extern void *memcpy(void *, const void *, u32); +extern u8 D_80126C38; +extern u8 D_80126C40; +extern u16 D_80126B94; +extern u16 D_80126B96; +extern void func_8012F568(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5, s32 param_6); +extern void func_80131B14(); +extern void func_80131E00(struct S80131E00 *a0, s32 a1); +extern s32 func_80131A34(s32, s32); +extern void func_80131CA8(int a0, int a1); +extern void func_8012F5F4(s32 arg0); +extern void func_80131C78(s32 a0); +extern void func_8012F68C(s32 arg0); +extern void func_8012F75C(s32 a0); +extern s32 func_8012BEE8(s32); +extern void func_8012F7B4(s32 a0); +extern void func_80131170(); +extern void func_80131CA8(); +extern unsigned char D_8017E114[]; +extern void func_8012F828(int param_1); +extern void func_80131340(s32 a0); +extern void func_8012F87C(s32 a0); +extern void func_80131170(s32 a0, s32 a1, s32 a2); +extern u8 D_8017E120[]; +extern void func_8012F8C8(u8* arg0); +extern void func_8012F91C(s32 a0); +extern s32 func_80131A34(s32 a0, s32 a1); +extern void func_80131CA8(s32 a0, s32 a1); +extern void func_8012F968(s32 param_1); +extern void func_801319E0(s32 a0); +extern s32 func_80143B6C(s32 a0, s32 a1); +extern void func_8012FB54(s32 a0); +extern void func_8012FC30(s32 a0); +extern void func_8012FCA4(int a0); +extern s32 func_8012FCC4(s32 param_1); +extern void func_8012FDA8(int param_1); +extern void func_8012FE70(s32 a0); +extern void func_8012FF00(s32 a0); +extern void func_8012FF4C(s32 a0); +extern void func_80130D48(s32 a0); +extern void func_8012FF98(u8 *a0); +extern s32 func_80131AC8(void *a0); +extern void func_8013001C(void *a0); +extern void func_80130088(void *a0); +extern s32 func_8012BCCC(s32); +extern void func_801300F4(s32 a0); +extern void func_801301E8(u8 *a0); +extern void func_80130278(s32 arg0); +extern void func_80130314(s32 a0); +extern void func_80130360(s32 a0); +extern void func_8012E364(void); +extern void func_801303A0(s32 a0); +extern void func_801303EC(void *a0); +extern void func_80143CD4(s32 a0); +extern void func_800CB0E8(s32 a0); +extern void func_80130438(s32 a0); +extern void func_801319E0(int); +extern int func_80131D68(int, int); +extern int func_8012BEE8(int); +extern void func_80131CA8(int, int); +extern void func_80130514(int param_1); +extern void func_801305CC(u8 *a0); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80130740(void *a0, u16 *a1); +extern s32 func_801312D0(s32 a0, void *a1); +extern void func_801307B0(s32 a0); +extern void func_80130858(s32 a0); +extern void func_80130898(u8 *a0); +extern void func_801308DC(s32 a0); +extern void func_80166244(); +extern void func_80130974(int param_1); +extern void func_80130AC4(s32 a0); +extern int func_80131A34(int a0, int a1); +extern void func_80130AF0(int param_1); +extern void (*D_8017E134[])(void); +extern void func_80130D0C(void *a0); +extern s32 rand(void); +extern u8 D_80078E78[]; +extern u16 D_80078EB2; +extern u16 D_80078EB4; +extern s16 D_8017E184[]; +extern s16 D_8017E1B4[]; +extern s16 D_8017E214[]; +extern s16 D_8017E21C[]; +extern s16 D_8017E23C[]; +extern void func_80130D48(s32 arg0); +extern void func_80131170(s32 p, s32 b, s32 c); +extern s32 func_801312D0(s32 param_1, void *param_2); +extern void func_8002A04C(s32 a0); +extern void func_801319E0(s32 arg0); +extern s32 func_80131CF4(s32 a0); +extern void (*D_8017E274[])(struct S80131E00 *a0); +extern void func_80131E38(u8 *a0); +extern void func_80131E7C(s32 a0); +extern void func_80131EE4(void); +extern void (*D_8017E2CC[])(void); +extern void func_80131EEC(void *a0); +extern void (*D_8017E314[])(void); +extern void func_80131F28(void *a0); +extern void (*D_8017E31C[])(void); +extern void func_80131F64(void *a0); +extern void (*D_8017E324[])(void); +extern void func_80131FA0(void *a0); +extern void (*D_8017E32C[])(void); +extern void func_80131FDC(void *a0); +extern void func_801320D0(void); +extern void func_8001C214(int, int); +extern int D_8017E2D4; +extern void func_801320D8(int param_1); +extern s32 func_80132144(s32 param_1); +extern int D_8017E2F4; +extern void func_801321B0(int param_1); +extern int D_8017E304; +extern void func_8013221C(int param_1); +extern void func_8005C324(int dst, int src, int n) __asm__("memcpy"); /* Phase-24: 0x8005C324 is named memcpy for overlays (whale needs it); keep the non-builtin C name here (else built-in codegen), emit via asm-label */ +extern void func_801325B8(int a0, int a1, int a2, int a3, int a4); +extern void func_80132288(int *param_1, int *param_2, int param_3); +extern void func_801325B8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_8013240C(s32 a0); +extern void func_8013277C(void); +extern void func_80020F34(s32 a0, s32 a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_80132784(s32 a0, s32 a1, u32 a2); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_80132DC4(s32 a0, s32 a1, s32 a2); +extern s32 func_80132E6C(s16 *a0); +extern void func_80132EC4(void *a0, s16 a1); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void func_801330E0(s16 *a0, s16 *a1, s32 a2); +extern void func_80133060(u8 *a0, s32 *a1, s32 a2); +extern void func_8013339C(short *param_1, short *param_2); +extern s32 func_8013361C(s16 *a0, s16 *a1, s16 *a2, s16 *a3); +extern s32 D_801A2998; +extern s32 D_801A299C[]; +extern int D_801A29A0; +extern void func_80136BC4(s32 a0); +extern void func_801336E8(void *a0, int a1, int a2); +extern void func_80136BC4(s32); +extern void func_8013373C(s16 arg0); +extern s32 func_80133784(s32 arg0, void *arg1, s32 arg2); +extern s32 func_80133CD4(); +extern s32 func_8013435C(s16 *a0, s16 *a1, s32 a2, s16 *a3); +extern s32 func_801343C4(s32 angle, s32 p1, s32 p2); +extern s32 func_80134510(s32 param); +extern s32 func_801345F8(s32 arg); +extern s32 func_801347A0(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134A28(s32 a0, s32 a1, s32 a2); +extern s32 func_80134C20(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_80134FB8(s32 a0, s32 a1, s32 a2); +extern s32 func_80135004(s32 arg0, s32 p1, s32 p2); +extern u8 D_8017E338; +extern u8 D_8017E334; +extern s16 *D_8017E33C; +extern u8 D_8017E340; +extern int D_801A2998; +extern u16 D_801A29A8; +extern int func_80134A74(int, s16, s16, int); +extern int func_80135168(u16 arg0, u16 *p1, u16 *p2); +extern s16 func_80135480(void *param_1, s32 param_2, s16 *param_3, s16 *param_4); +extern s32 func_80136334(void *arg0, s32 arg1, s32 arg2); +extern s32 func_80136824(s32 arg0, s32 arg1, s32 arg2); +extern s16 *D_8017E33C; /* holds a pointer value (*(u16**)&D_8017E33C) */ +extern s32 func_80136A94(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80136C3C(void); +extern void func_80136C1C(void); +extern void func_80136C44(void); +extern void func_80136C4C(void); +extern void (*D_8017E350[])(void); +extern void func_80136C54(void); +extern s32 func_80136C90(); +extern void func_80136D00(void); +extern void SetLineG2(void *); +extern void func_80136D08(s32 arg0, s32 arg1); +extern void func_80136EC4(void); +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern void GsSortLine(void *a0, void *a1, s32 a2); +extern void func_80136ECC(s16 a0, s16 a1, s16 a2, s16 a3, u8 r, u8 g, u8 b); +extern void func_80137030(s16 a0, s16 a1); +extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); +extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); +extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); +extern void func_80137178(s32 x, s32 y); +extern u8 D_800AF630[]; +extern u16 aD800B9A02 __asm__("D_800B9A02"); +extern void func_801372B0(void); +extern void func_80137614(s32 a0, s32 a1, s32 a2); +extern void func_801375EC(s32 a0, s16 a1); +extern s32 func_801399A8(void); +extern void func_801377B4(s32 a0, s32 a1, s32 a2); +extern s32 func_8013767C(s32 a0); +extern void func_801376E8(int a0, int a1); +extern void func_801376C8(int a0); +extern s32 D_80127524; +extern s32 D_80127528; +extern void func_80137840(s32 a0); +extern void func_80139634(void *); +extern void func_80139DC8(void); +extern s16 D_8012752E; +extern void func_801379D8(void); +extern void func_801379EC(void); +extern s32 D_80127548[]; +extern int D_8017E3A4; +extern int D_801269F0; +extern void func_80138BE0(int p); +extern void func_80137B80(void); +extern void func_801392FC(); +extern void func_801397B0(s32 a0); +extern void func_80137DD4(s32 a0, u8 *a1, u8 *a2); +extern void func_80139680(s32 a0, u8 *a1); +extern u16 D_800B99D8; +extern void func_80137BD8(s32 a0); +extern unsigned char D_80126A0E; +extern short D_80126A0A; +extern s16 D_801269F4; +extern int D_800A5E60; +extern int func_80137D08(int arg0, int arg1, short arg2); +extern void func_80137FD8(s32 a0, s32 a1, s32 a2, s32 a3); +/* ==== end §8b carried decl layer ==== */ + +/* func_801380E0 (ov_SC01_077_a, 438 ins, jtbl_801D81F0) — Phase 26 crack + * Script-command interpreter: for(;;) fetch cmd byte, dispatch (>=0x20 -> extern + * handler; ==0 -> END; else 25-case jump table), loop while `cont`. + * PIN-FREE. Offset-pure (s32 arg0 + raw offsets) — x134 template-safe. + * + * match_one: MATCH (438 ins). jtbl VERIFIED: 25 entries, byte-identical offsets + * (0x17C 0x184 0x220 0x218 0x20C 0x254 0x13C 0x168 0x404 0x118 0x268 0x3C0 0x3D0 + * 0x424 0x444 0x454 0x47C 0x494 0x4EC 0x544 0x58C 0x1F8 0x5B4 0x5C0 0x5E4); + * bound `sltiu 0x19`; default -> +0x624; case 0 peel `beqz` -> +0x634; .text 0x6D8. + * + * FOUR levers made this land (all in the cookbook's §46/§47 family): + * L-A s32 (NOT pointer) address arithmetic. `pc + base` vs `base + pc` is a real + * byte difference (`addu $v0,$v0,$s3` vs `addu $v0,$s3,$v0`): C's + * pointer_int_sum() canonicalises ptr-first and DESTROYS source operand order, + * so a `u8 *base` can never emit the idx-first form. Plain int + a cast at the + * deref keeps gcc's PLUS operand order == source order. + * L-B `u32 cmd` — the `cmd >= 0x20` guard must be UNSIGNED (`sltiu`, not `slti`). + * L-C THE $s5 HOIST (this is the crack). The target holds &D_8012752E in a + * callee-saved reg across the whole loop and reaches D_8012752C at -2($s5). + * gcc will NOT do this for a plain global (a symbolic address is a legitimate + * MIPS address — GO_IF_LEGITIMATE_ADDRESS/CONSTANT_ADDRESS_P), and a local + * `s16 *snd = &D_8012752E;` written INSIDE case 11 gets constant-folded straight + * back into `sh $x, %lo(D_8012752E)-2($at)` by cse's find_best_addr. + * §46-L2 is the fix: set the pointer at the LOOP TOP, so its def and its uses + * live in DIFFERENT extended basic blocks (the case-11 body is only reachable + * through the `jr` table, so cse starts a fresh hash table there and cannot + * fold). The `la` then survives cse, loop.c's move_movables hoists it into the + * PREHEADER (exactly .L80138138), and global-alloc gives it $s5. + * Case 25 deliberately keeps the PLAIN global (lui/lh) — matching the target. + * L-D PER-CASE temps. Sharing one `q` across cases 18/19/20 makes the pseudo + * multi-block => it leaves local-alloc for global-alloc and both branches of + * case 18/19 land their result in $v0 — which lets the post-reload cross_jump + * tail-merge the `sh $v0,0($s0)` with the default block's store (2 ins short). + * Separate q18/q19/q20 keeps each block-local; the true-branch gets $v1, the + * false-branch $v0, and the tails stay APART (the §46-L5 register-divergence + * rule, here obtained for free by scoping rather than by pinning). + * + * Bonus (no lever needed, just don't fight it): the two out-of-line blocks at the top + * of the function (func_80139914+return, and state=0xD+return) are loop.c + * find_and_verify_loops (loop.c:2382) MOVING a loop-exiting block to the barrier + * before the loop and inverting the branch around it. Writing the natural + * `if (...) { call(); return; }` inside a real `for(;;)` reproduces it exactly. + + */ + + +s32 func_801380E0(s32 arg0) { + extern void func_8001931C(s32); + extern void func_8001AAD0(s32, s32); + extern s32 func_8001B22C(void); + extern void func_80029124(s32, s32); + extern s32 func_800CF864(s32, s32); + extern void func_80138AB4(s32, s32); + extern s32 func_80138C60(s32, s32); + extern void func_80138D58(s32, s32); + extern s32 func_80138DE0(s32, s32, s32); + extern void func_801391F0(s32, s32); + extern void func_80139220(s32, s32); + extern void func_80139788(s32); + extern void func_80139914(s32); + extern void func_80139A8C(s32); + extern void func_80139B18(s32); + extern s16 D_8012752C; + extern s32 D_80127530[]; + + u16 *p; + s32 base; + s32 cont; + u32 cmd; + s32 sub; + s32 pc; + s32 t; + s32 f; + s32 f0; + s32 q18; + s32 q19; + s32 q20; + u32 idx; + s16 *snd; + + t = *(u8 *)(arg0 + 0xC); + if (t != 0) { + *(u8 *)(arg0 + 0xC) = t - 1; + goto done; + } + + for (;;) { + cont = 0; + snd = &D_8012752E; + if (*(s32 *)(arg0 + 8) & 0x400) { + base = D_80127530[*(u16 *)(arg0 + 0x4A)]; + p = (u16 *)(arg0 + 0x44); + } else { + p = (u16 *)(arg0 + 0x10); + base = *(s32 *)(arg0 + 0); + } + pc = *p; + cmd = *(u8 *)(pc + base); + sub = *(u8 *)(pc + base + 1); + + if (cmd >= 0x20) { + cont = func_80138DE0(arg0, cmd, sub); + if (!(*(s32 *)(arg0 + 8) & 0x80220)) { + cont = 0; + } + } else if (cmd != 0) { + switch (cmd) { + case 10: + func_80139220(arg0, cmd); + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) & ~0x80000; + break; + + case 7: + if (*(s32 *)(arg0 + 8) & 0x10000) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 3; + } + *p += 1; + break; + + case 8: + func_801391F0(arg0, cmd); + *p += 1; + break; + + case 1: + *(u8 *)(arg0 + 0x23) = sub; + cont = 1; + *p += 2; + break; + + case 2: + *(u8 *)(arg0 + 0x22) = sub; + *(u8 *)(arg0 + 0x20) = *(u8 *)(*p + base + 2); + *p += 3; + if (func_80138C60(arg0, cmd) == 0) { + func_80139914(arg0); + return; + } + *(s16 *)(arg0 + 4) = 9; + if (*(u8 *)(base + *p) == 5) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + *p += 1; + } + break; + + case 22: + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x20) | 0x4001; + cont = 1; + *p += 1; + break; + + case 5: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4000; + cont = 1; + *p += 1; + break; + + case 4: + *(u8 *)(arg0 + 0xD) = sub; + cont = 1; + *p += 2; + break; + + case 3: + if (*(s32 *)(arg0 + 8) & 0x20000) { + cont = 1; + *p += 2; + } else { + *(s16 *)(arg0 + 4) = 0xB; + *(u8 *)(arg0 + 0xD) = sub; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) | 0x8000) & ~0x20; + } + break; + + case 6: + *(s16 *)(arg0 + 4) = 4; + *p += 1; + break; + + case 11: + if ((*snd != 0) || (*(s32 *)(arg0 + 8) & 0x20) + || (func_800CF864(pc, cmd) == 0)) { + cont = 1; + *p += 4; + } else { + snd[-1] = *(u8 *)(*p + base + 2) + (*(u8 *)(*p + base + 3) << 8); + *p += 4; + *(s32 *)(arg0 + 8) = (*(s32 *)(arg0 + 8) & ~0x60020) | 0x10000; + if (snd[-1] != 0) { + func_8001AAD0(sub & 0x7F, snd[-1]); + if (sub & 0x80) { + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x40000; + } + if ((*(u8 *)(base + *p) == 2) || (*(s32 *)(arg0 + 8) & 0x40000)) { + cont = 1; + } else { + *(s16 *)(arg0 + 4) = 0x10; + } + if (func_8001B22C() == 0) { + f = *(s32 *)(arg0 + 8); + if (f & 1) { + func_8001931C(f); + } else { + *(s32 *)(arg0 + 8) = (f & ~0x10000) | 0x20020; + func_80139788(f); + } + *(s16 *)(arg0 + 4) = 2; + } + } else { + cont = 1; + } + } + break; + + case 12: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 2; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 13: + *(s16 *)(arg0 + 4) = 6; + *(u8 *)(arg0 + 0x21) = 3; + *p += 1; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x4300; + break; + + case 9: + func_80138D58(arg0, sub); + cont = 1; + *p += 2; + break; + + case 14: + *(s16 *)(arg0 + 4) = 8; + *(u16 *)(arg0 + 0x44) = 0; + func_80138AB4(arg0, cmd); + *p += 1; + break; + + case 15: + *(u16 *)(arg0 + 0x44) = 0; + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x400; + cont = 1; + *p += 1; + break; + + case 16: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 1); + cont = 1; + *p += 3; + break; + + case 17: + func_80029124(sub | (*(u8 *)(*p + base + 2) << 8), 0); + cont = 1; + *p += 3; + break; + + case 18: + if (((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q18 = *p; + *p = *(u8 *)(q18 + base + 3) + (q18 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 19: + if (!((u8(*)(s32, s32))func_80029178)(sub | (*(u8 *)(*p + base + 2) << 8), cmd)) { + q19 = *p; + *p = *(u8 *)(q19 + base + 3) + (q19 + 4); + } else { + *p = *p + 4; + } + cont = 1; + break; + + case 20: + if (!(*(s32 *)(arg0 + 8) & 0x20000)) { + q20 = *p + base; + *(u16 *)(arg0 + 0xE) = *(u8 *)(q20 + 1) + (*(u8 *)(q20 + 2) << 8); + } + cont = 1; + *p += 3; + break; + + case 21: + if (*(u16 *)(arg0 + 0xE) != 0) { + *(s16 *)(arg0 + 4) = 0xF; + } else { + cont = 1; + } + *p += 1; + break; + + case 23: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 2; + cont = 1; + *p += 1; + break; + + case 24: + *(s32 *)(arg0 + 8) = *(s32 *)(arg0 + 8) | 0x80000; + cont = 1; + *p += 1; + break; + + case 25: + *p += 1; + if ((*(s32 *)(arg0 + 8) & 0x10000) && (D_8012752C != 0)) { + *(s16 *)(arg0 + 4) = 0x10; + } else { + cont = 1; + } + break; + + default: + *p = pc + 1; + cont = 1; + break; + } + } else { + f0 = *(s32 *)(arg0 + 8); + if (f0 & 0x400) { + idx = *(u16 *)(arg0 + 0x4A); + *(s32 *)(arg0 + 8) = f0 & ~0x400; + if (idx < 3) { + *(u16 *)(arg0 + 0x4A) = idx + 1; + } + } else if (f0 & 0x2000) { + *(s16 *)(arg0 + 4) = 0xD; + return; + } else { + *(s16 *)(arg0 + 4) = 0xA; + return; + } + } + + if (cont == 0) { + break; + } + } + + if (*(u8 *)(arg0 + 0xC) == 0) { + *(u8 *)(arg0 + 0xC) = *(u8 *)(arg0 + 0xD); + } +done: + func_80139A8C(arg0); + func_80139B18(arg0); +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_801387B8); + +DEFINE_func_80138948() /* dedup: shared engine-core @0x80138948 (src/shared) */ + +DEFINE_func_8013895C() /* dedup: shared engine-core @0x8013895C (src/shared) */ + +DEFINE_func_80138AB4() /* dedup: shared engine-core @0x80138AB4 (src/shared) */ + +DEFINE_func_80138B88() /* dedup: shared engine-core @0x80138B88 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one: MATCH 20 ins) + +extern void (*D_8017E3A8[])(void); + +void func_80138BE0(int p) +{ + if (*(unsigned short *)(p + 0xe) != 0) { + *(unsigned short *)(p + 0xe) -= 1; + } + D_8017E3A8[*(short *)(p + 4)](); +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_80138C30); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_80138C60); + +DEFINE_func_80138D58() /* dedup: shared engine-core @0x80138D58 (src/shared) */ + +DEFINE_func_80138DB8() /* dedup: shared engine-core @0x80138DB8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_80138DE0); + +DEFINE_func_80138ED0() /* dedup: shared engine-core @0x80138ED0 (src/shared) */ + +DEFINE_func_8013914C() /* dedup: shared engine-core @0x8013914C (src/shared) */ + +DEFINE_func_801391F0() /* dedup: shared engine-core @0x801391F0 (src/shared) */ + +DEFINE_func_80139220() /* dedup: shared engine-core @0x80139220 (src/shared) */ + +DEFINE_func_801392C8() /* dedup: shared engine-core @0x801392C8 (src/shared) */ + +DEFINE_func_801392FC() /* dedup: shared engine-core @0x801392FC (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_801395D4); + +DEFINE_func_80139634() /* dedup: shared engine-core @0x80139634 (src/shared) */ + +DEFINE_func_80139680() /* dedup: shared engine-core @0x80139680 (src/shared) */ + +DEFINE_func_80139788() /* dedup: shared engine-core @0x80139788 (src/shared) */ + + +extern short D_800B9A02; +extern u8 D_800A6518[]; +extern u8 D_8017E3EC; +extern u8 D_8017E430; +extern void GsSortSprite(void *a0, u8 *a1, s32 a2); + +void func_801397B0(s32 arg0) +{ + register u8 *e __asm__("$7"); + register s32 off __asm__("$4"); + s32 buf[12]; + u8 *b164; + u8 *b1A8; + s32 sc; + s32 t2; + s32 t0; + s32 hi; + s32 lo; + s32 uu; + s32 vv; + + e = (u8 *)arg0; + b164 = (u8 *)&D_8017E3EC; + off = ((s32)*(u8 *)(e + 0x20) - 1) << 2; + b164 = off + b164; + + *(s32 *)((u8 *)buf + 0x00) = 0; + + t2 = *(s16 *)(b164 + 2); + t0 = *(s16 *)(b164 + 0); + hi = (t2 & 0x100) >> 4; + lo = ((t0 & 0x3C0) >> 6) | 0x20; + *(s16 *)((u8 *)buf + 0x0C) = hi | lo | ((t2 & 0x200) << 2); + + b1A8 = (u8 *)&D_8017E430 + off; + *(s16 *)((u8 *)buf + 0x10) = *(u16 *)(b1A8 + 0); + *(s16 *)((u8 *)buf + 0x12) = *(u16 *)(b1A8 + 2); + *(u8 *)((u8 *)buf + 0x16) = 0x80; + *(u8 *)((u8 *)buf + 0x15) = 0x80; + *(u8 *)((u8 *)buf + 0x14) = 0x80; + *(s16 *)((u8 *)buf + 0x06) = *(u16 *)(e + 0x32); + *(s16 *)((u8 *)buf + 0x08) = 0x20; + *(s16 *)((u8 *)buf + 0x0A) = 0x28; + + uu = (*(u16 *)(b164 + 0) & 0x3F) << 2; + *(u8 *)((u8 *)buf + 0x0E) = uu; + vv = *(u16 *)(b164 + 2); + *(u8 *)((u8 *)buf + 0x0F) = vv; + + if (*(u8 *)(e + 0x22) & 8) { + *(s16 *)((u8 *)buf + 0x04) = + *(u16 *)(e + 0x30) + *(u16 *)(e + 0x34) + 0x28; + sc = -*(u16 *)(e + 0x28); + } else { + *(s16 *)((u8 *)buf + 0x04) = *(u16 *)(e + 0x30) - 0x28; + sc = *(u16 *)(e + 0x28); + } + *(s16 *)((u8 *)buf + 0x1C) = sc; + *(s16 *)((u8 *)buf + 0x1E) = *(u16 *)(e + 0x2A); + *(s16 *)((u8 *)buf + 0x1A) = 0; + *(s16 *)((u8 *)buf + 0x18) = 0; + *(s32 *)((u8 *)buf + 0x20) = 0; + + GsSortSprite(buf, &D_800A6518[(u16)D_800B9A02 * 20], + *(u16 *)(e + 0x1A)); +} + + +DEFINE_func_80139914() /* dedup: shared engine-core @0x80139914 (src/shared) */ + +DEFINE_func_80139954() /* dedup: shared engine-core @0x80139954 (src/shared) */ + +DEFINE_func_801399A8() /* dedup: shared engine-core @0x801399A8 (src/shared) */ + +DEFINE_func_801399F0() /* dedup: shared engine-core @0x801399F0 (src/shared) */ + +DEFINE_func_80139A34() /* dedup: shared engine-core @0x80139A34 (src/shared) */ + +DEFINE_func_80139A44() /* dedup: shared engine-core @0x80139A44 (src/shared) */ + +DEFINE_func_80139A68() /* dedup: shared engine-core @0x80139A68 (src/shared) */ + +DEFINE_func_80139A8C() /* dedup: shared engine-core @0x80139A8C (src/shared) */ + +DEFINE_func_80139B18() /* dedup: shared engine-core @0x80139B18 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_80139BE0); + +DEFINE_func_80139C7C() /* dedup: shared engine-core @0x80139C7C (src/shared) */ + +DEFINE_func_80139D04() /* dedup: shared engine-core @0x80139D04 (src/shared) */ + +DEFINE_func_80139DC8() /* dedup: shared engine-core @0x80139DC8 (src/shared) */ + +DEFINE_func_80139DEC() /* dedup: shared engine-core @0x80139DEC (src/shared) */ + +DEFINE_func_80139DF4() /* dedup: shared engine-core @0x80139DF4 (src/shared) */ + +DEFINE_func_80139E84() /* dedup: shared engine-core @0x80139E84 (src/shared) */ + +DEFINE_func_80139F0C() /* dedup: shared engine-core @0x80139F0C (src/shared) */ + +DEFINE_func_80139FBC() /* dedup: shared engine-core @0x80139FBC (src/shared) */ + +DEFINE_func_80139FE8() /* dedup: shared engine-core @0x80139FE8 (src/shared) */ + +DEFINE_func_8013A0A4() /* dedup: shared engine-core @0x8013A0A4 (src/shared) */ + +DEFINE_func_8013A164() /* dedup: shared engine-core @0x8013A164 (src/shared) */ + +DEFINE_func_8013A1E8() /* dedup: shared engine-core @0x8013A1E8 (src/shared) */ + +DEFINE_func_8013A250() /* dedup: shared engine-core @0x8013A250 (src/shared) */ + +DEFINE_func_8013A2BC() /* dedup: shared engine-core @0x8013A2BC (src/shared) */ + +DEFINE_func_8013A378() /* dedup: shared engine-core @0x8013A378 (src/shared) */ + +DEFINE_func_8013A380() /* dedup: shared engine-core @0x8013A380 (src/shared) */ + +DEFINE_func_8013A448() /* dedup: shared engine-core @0x8013A448 (src/shared) */ + +DEFINE_func_8013A4C4() /* dedup: shared engine-core @0x8013A4C4 (src/shared) */ + +DEFINE_func_8013A530() /* dedup: shared engine-core @0x8013A530 (src/shared) */ + +DEFINE_func_8013A860() /* dedup: shared engine-core @0x8013A860 (src/shared) */ + +DEFINE_func_8013A8B0() /* dedup: shared engine-core @0x8013A8B0 (src/shared) */ + +DEFINE_func_8013A8BC() /* dedup: shared engine-core @0x8013A8BC (src/shared) */ + +DEFINE_func_8013A8FC() /* dedup: shared engine-core @0x8013A8FC (src/shared) */ + +DEFINE_func_8013A9B4() /* dedup: shared engine-core @0x8013A9B4 (src/shared) */ + +DEFINE_func_8013A9F8() /* dedup: shared engine-core @0x8013A9F8 (src/shared) */ + +DEFINE_func_8013AA24() /* dedup: shared engine-core @0x8013AA24 (src/shared) */ + +DEFINE_func_8013AB54() /* dedup: shared engine-core @0x8013AB54 (src/shared) */ + +// @class: schedule +// @stuck: none — MATCH (122 ins). GTE lerp+mvmva loop. Two levers: (1) flat `extern s16` +// source arrays indexed [2*i]/[2*i+1] force 4 separate walking IVs (t2/t3/t4/t5) instead of +// one shared offset-IV + symbol(reg) addressing; (2) INVERTED-arm if/else +// `if (flag<0) out3=-tbl; else out3=tbl;` gives the target's bgez polarity + reload-per-arm +// sign-flip block (a plain ?: hoists the common lbu; the inverted if/else does not, and gcc +// still merges the sb). out2[i]=out2[0] tail-copy of the align-2 Pair_8013AD38 emits lwl/lwr/swl/swr. +#include "common.h" + +typedef struct { s16 x, y; } Pair_8013AD38; + +extern s16 D_800D45F4[]; /* src0 (flat: [2*i]=x, [2*i+1]=y) */ +extern u8 D_8017E474[]; /* sign table, alt (when a1 < 0xC00) */ + +#define gte_ldv0(r0) __asm__ __volatile__( \ + "lwc2 $0, 0(%0)\n" \ + "lwc2 $1, 4(%0)\n" \ + : : "r"(r0) : "memory") + +#define gte_mvmva0() __asm__ __volatile__( \ + "nop\n" \ + "nop\n" \ + "mvmva 1, 0, 0, 0, 0\n" \ + : : : "memory") + +#define gte_stlvnl(r0) __asm__ __volatile__( \ + "swc2 $25, 0(%0)\n" \ + "swc2 $26, 4(%0)\n" \ + "swc2 $27, 8(%0)\n" \ + : : "r"(r0) : "memory") + +void func_8013AD38(void *flag, s32 a1, void *out2, void *out3) +{ + extern s16 D_800D466C[]; + extern u8 D_8017E4B0[]; + + u8 *tbl; + s16 vec[4]; + s32 res[3]; + s32 i; + + tbl = D_8017E4B0; + if (((s16)a1) < 0xC00) { + tbl = D_8017E474; + } + + for (i = 0; i < 30; i++) { + vec[0] = D_800D45F4[2 * i] + (((D_800D466C[2 * i] - D_800D45F4[2 * i]) * ((s16)a1)) >> 12); + vec[1] = D_800D45F4[2 * i + 1] + (((D_800D466C[2 * i + 1] - D_800D45F4[2 * i + 1]) * ((s16)a1)) >> 12); + gte_ldv0(vec); + gte_mvmva0(); + gte_stlvnl(res); + ((Pair_8013AD38 *)out2)[i].x = res[0]; + ((Pair_8013AD38 *)out2)[i].y = res[1]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[2 * i]; else ((s8 *)out3)[2 * i] = tbl[2 * i]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[2 * i + 1]; else ((s8 *)out3)[2 * i + 1] = tbl[2 * i + 1]; + } + ((Pair_8013AD38 *)out2)[i] = ((Pair_8013AD38 *)out2)[0]; + if (((s16 *)flag)[0] < 0) ((s8 *)out3)[2 * i] = -tbl[0]; else ((s8 *)out3)[2 * i] = tbl[0]; + if (((s16 *)flag)[1] < 0) ((s8 *)out3)[2 * i + 1] = -tbl[1]; else ((s8 *)out3)[2 * i + 1] = tbl[1]; +} + + + +DEFINE_func_8013AF20() /* dedup: shared engine-core @0x8013AF20 (src/shared) */ + +DEFINE_func_8013B204() /* dedup: shared engine-core @0x8013B204 (src/shared) */ + + + +extern void *func_80010A08(s32); +extern s16 D_8017E4EC, D_8017E4EE, D_8017E4F0, D_8017E4F2, D_8017E4F4, D_8017E4F6; +extern u16 D_800D45F6; + +void func_8013B274(s32 a0, s32 a1, void *a2) +{ + u8 *p; + s32 L[10]; + s16 sa; + s32 quot; + s16 ang; + + p = (u8 *)func_80010A08(0x28); + p[3] = 9; + p[7] = 0x2C; + p[4] = 0x80; + p[5] = 0x80; + p[6] = 0x80; + *(s16 *)(p + 0x16) = 0x37; + *(s16 *)(p + 0xE) = 0x6FD6; + p[0xC] = 0xE0; + p[0xD] = 0; + p[0x14] = 0xEF; + p[0x15] = 0; + p[0x1C] = 0xE0; + p[0x1D] = 0xF; + p[0x24] = 0xEF; + p[0x25] = 0xF; + + sa = (s16)a1; + if (sa == 0) { + *(s16 *)L = 0; + } else { + quot = ((s32)sa << 12) / ((s16*)a2)[0]; + ang = (s16)quot; + if (!(D_8017E4EE < ang)) goto outer_else; + if (!(ang < D_8017E4F4)) goto inner_else; + if (ang < D_8017E4F0) { *(s16 *)L = D_8017E4F0; goto done; } + if (D_8017E4F2 < ang) { *(s16 *)L = D_8017E4F2; goto done; } + *(s16 *)L = quot; + goto done; + outer_else: + if (ang < D_8017E4EC) { *(s16 *)L = D_8017E4EC; goto done; } + *(s16 *)L = quot; + goto done; + inner_else: + if (D_8017E4F6 < ang) { *(s16 *)L = D_8017E4F6; goto done; } + *(s16 *)L = quot; + done: ; + } + *(s16 *)((u8 *)L + 2) = D_800D45F6; + + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 0, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 8) : "memory"); + + if (((s16*)a2)[1] > 0) + *(s32 *)((u8 *)L + 0xC) -= 1; + else + *(s32 *)((u8 *)L + 0xC) += 2; + + *(s16 *)L = 9; + *(s16 *)((u8 *)L + 2) = 9; + __asm__ __volatile__( + "lwc2 $0, 0(%0)\n" + "lwc2 $1, 4(%0)\n" + "nop\n" "nop\n" + "mvmva 1, 0, 0, 3, 0\n" + : : "r"(L) : "memory"); + __asm__ __volatile__( + "swc2 $25, 0(%0)\n" + "swc2 $26, 4(%0)\n" + "swc2 $27, 8(%0)\n" + : : "r"((u8 *)L + 0x18) : "memory"); + + *(s16 *)(p + 8) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0xA) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x10) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x12) = *(volatile s32 *)((u8 *)L + 0xC); + *(s16 *)(p + 0x18) = *(volatile s32 *)((u8 *)L + 8); + *(s16 *)(p + 0x1A) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + *(s16 *)(p + 0x20) = *(volatile s32 *)((u8 *)L + 8) + *(volatile s32 *)((u8 *)L + 0x18); + *(s16 *)(p + 0x22) = *(volatile s32 *)((u8 *)L + 0xC) + *(volatile s32 *)((u8 *)L + 0x1C); + + ((P_TAG *)p)->addr = ((P_TAG *)a0)->addr; + ((P_TAG *)a0)->addr = (u32)p; +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013B568); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013B598); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013B6A0); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013B7AC); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013B7F4); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013B83C); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013BC7C); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013BCDC); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013BD34); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013BD74); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013C08C); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013C0F8); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013C360); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013C414); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013C938); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013C964); + + +/* ==== Phase-17 canonical-sig layer (tools/derive_canonical_sigs.py) =================== + * ONE byte-neutral canonical signature per undeclared-stub conflict callee, so the parallel + * hand-matching wave declares each shared callee consistently and the one-big-TU build stops + * failing on `conflicting types` (hand-matching-process.md §7c). Form: s32 return (void->s32 + * byte-neutral, §3a-1) + s32 params (matched bodies cast int->ptr), arity from Ghidra-C + asm + * read-before-write $a0-$a3 (agree on all 14 cached; 6 stubs call-site-validated). LOCAL to + * this TU on purpose (reach-1 names like func_801809BC differ across overlays, so NOT in the + * shared engine_core.h). Whole-binary harvest_verify byte-gate remains the sole arbiter (G3/P9). */ +extern s32 func_8016EC0C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012B4B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); /* derive-decl, arity 4 */ +extern s32 func_80169A4C(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8016A8FC(s32 a0); /* match-first, arity 1 */ +extern s32 func_8012B8E4(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8015E1B8(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015EE08(s32 a0); /* match-first, arity 1 */ +extern s32 func_8015F7D4(s32 a0); /* match-first, arity 1 */ +extern s32 func_80160B34(s32 a0); /* match-first, arity 1 */ +extern s32 func_80165140(s32 a0); /* match-first, arity 1 */ +extern s32 func_80161CD0(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_80175268(s32 a0); /* match-first, arity 1 */ +extern s32 func_8017EC7C(s32 a0); /* match-first, arity 1 */ +extern s32 func_801809BC(s32 a0, s32 a1); /* match-first, arity 2 */ +extern s32 func_8012DE2C(s32 a0); /* derive-decl, arity 1 */ +extern s32 func_8012DDA4(void); /* derive-decl, arity 0 */ +extern s32 func_801759D8(void); /* derive-decl, arity 0 */ +extern s32 func_80175820(void); /* derive-decl, arity 0 */ +extern s32 func_801758FC(void); /* derive-decl, arity 0 */ +/* ==== end canonical-sig layer ==================================================== */ + +extern void func_80016714(void *a0, s32 a1); +extern s32 D_801A2A10; +extern s32 D_801269D4; +extern s32 D_801269C8; + +void func_8013C98C(void) { + func_80016714(&D_801A2A10, 8); + D_801269D4 = 0; + D_801269C8 = 0; +} + + +extern M2C_UNK D_80062BC0; +extern s32 D_801A2A10; +extern s8 D_801A2A14; +extern s8 D_801A2A15; + +void func_8013C9C4(void * arg0) +{ + D_801A2A10 = arg0; + D_801A2A14 = 0; + D_801A2A15 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + + + + +extern s32 D_801A2A10; +extern s8 D_801A2A14; +extern s8 D_801A2A15; +extern s32 D_801269C8; +extern s32 D_801269D4; +void func_8013CA14(void) +{ + int *base = &D_801A2A10; + signed char *p; + unsigned char c; + int t; + if ((*base) != 0) + { + c = D_801A2A15; + if (c == 0) + { + p = (signed char *) ((((unsigned int) ((unsigned char) D_801A2A14)) * 2) + D_801A2A10); + t = (int) (*p); + D_801269D4 = t; + D_801269C8 = t; + D_801A2A15 = (unsigned char) p[1]; + D_801A2A14 = D_801A2A14 + 1; + if (D_801A2A15 == 0) + { + D_801269D4 = 0; + D_801269C8 = 0; + D_801A2A14 = 0; + *base = 0; + } + } + else + { + D_801A2A15 = c - 1; + } + } + return; +} + + + +extern s32 D_801A2A34; +extern s32 D_801A2A28; +extern s32 D_801A2A2C; +extern s32 D_801A2A38; + +void func_8013CABC(void) { + D_801A2A34 = 1; + D_801A2A28 = 1; + D_801A2A2C = 0; + D_801A2A38 = 1; +} + + + +extern s32 D_801A2A28; +extern s32 D_801A2A2C; +extern s32 D_801A2A30; +extern s32 D_801A2A34; +extern s32 D_801A2A38; + +void func_8013CAE8(void) { + D_801A2A28 = 1; + D_801A2A34 = 0; + D_801A2A2C = 0; + D_801A2A30 = -1; + D_801A2A38 = 0; +} + + + +extern s32 D_801A2A34; +extern s32 D_801A2A38; +extern s32 D_801A2A60; +extern s32 D_801A2A64; + +void func_8013CB20(void) +{ + D_801A2A60 = D_801A2A38; + D_801A2A64 = D_801A2A34; + D_801A2A38 = 1; + D_801A2A34 = 0; +} + + + +extern s32 D_801A2A60; +extern s32 D_801A2A64; +extern s32 D_801A2A38; +extern s32 D_801A2A34; + +void func_8013CB5C(void) { + D_801A2A38 = D_801A2A60; + D_801A2A34 = D_801A2A64; +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013CB84); + +// @class: struct +// @stuck: none — MATCH (63 ins) +// +// Sets up 3 consecutive 16-byte records (at D_800A5E88[0..2]: {s32 a,b,c; u8 d,e,f,g}) +// and registers each via func_80028620(i, &rec[i]). +// +// Keys to the byte match: +// (1) The base pointer is anchored at D_800A5E94 (= &rec0.d, i.e. rec0+0xC) and materialized +// via a NON-volatile inline-asm `la` so gcc treats it as OPAQUE (not a const symbol). +// Opacity is what makes the base-relative stores FOLD into `off($s0)` instead of +// const-folding to a direct `lui $at; sw %lo(sym)`. A `__asm__ __volatile__` re-tie +// barrier (cookbook §21) also launders base, but the barrier pins the schedule and +// pushes the first call's `a0=0` down; the non-volatile `la` avoids the barrier so the +// scheduler still hoists `addu $a0,$zero,$zero` to the top (matches target idx1). +// (2) rec0's inner fields (E8C/E90 ints, E95/E96 bytes) are written as DIRECT globals, not +// base-relative — in the entry block gcc emits them as `lui $at; sw/sb %lo(sym)`. Only +// the address-taken E88 (= call arg base-0xC) and the offset-0 E94 fold via $s0. rec1/rec2 +// fold entirely (base opaque, all offsets small). +// (3) The three source bytes per record are loaded into temps t0/t1/t2 BEFORE the stores so +// gcc keeps them live in three registers ($v1/$a2/$a3) as a group (not one-at-a-time in $v0). +// (4) Statement order matches the target scheduler: rec1 stores b(=7) before the loads; +// rec2 stores b(=-0x12) AFTER the loads (the differing constants drive the scheduler). +#include "common.h" + + +void func_8013CF68() +{ + extern void func_80028620(); + extern u8 D_800A5E94[]; + extern s32 D_800A5E8C; + extern s32 D_800A5E90; + extern u8 D_800A5E95; + extern u8 D_800A5E96; + extern u8 D_801A3C80; + extern u8 D_801A3C81; + extern u8 D_801A3C82; + extern u8 D_801A3C83; + extern u8 D_801A3C84; + extern u8 D_801A3C85; + extern u8 D_801A3C86; + extern u8 D_801A3C87; + extern u8 D_801A3C88; + + u8 t0, t1, t2; + u8 *base; + __asm__("la %0, D_800A5E94" : "=r"(base)); + + *(s32 *)(base - 0xC) = 0; + t0 = D_801A3C80; t1 = D_801A3C81; t2 = D_801A3C82; + D_800A5E8C = 0x1E; + D_800A5E90 = 0; + base[0] = t0; D_800A5E95 = t1; D_800A5E96 = t2; + func_80028620(0, base - 0xC); + + *(s32 *)(base + 4) = 0; *(s32 *)(base + 8) = 7; + t0 = D_801A3C83; t1 = D_801A3C84; t2 = D_801A3C85; + *(s32 *)(base + 0xC) = 0x14; + base[0x10] = t0; base[0x11] = t1; base[0x12] = t2; + func_80028620(1, base + 4); + + *(s32 *)(base + 0x14) = 0; + t0 = D_801A3C86; t1 = D_801A3C87; t2 = D_801A3C88; + *(s32 *)(base + 0x18) = -0x12; + *(s32 *)(base + 0x1C) = 0; + base[0x20] = t0; base[0x21] = t1; base[0x22] = t2; + func_80028620(2, base + 0x14); +} + + + + +// @class: schedule +// @stuck: testing if/else-if with ==2 placed as the else (tail) block + +extern s32 D_801A2A40; +extern s32 D_801A2A28; +extern s32 D_801A2A44; +extern s32 D_801A2A34; +extern void func_8013D9B0(void); + +void func_8013D064(void) +{ + if (D_801A2A40 != 0) { + if (D_801A2A40 != 2) { + if (((D_801A2A40 < 3) && (D_801A2A40 == 1)) && + (D_801A2A44 = D_801A2A44 + 1, 0x23a < D_801A2A44)) { + D_801A2A28 = D_801A2A40; + D_801A2A40 = 2; + } + } else { + D_801A2A28 = D_801A2A28 + -1; + if (D_801A2A28 == 0) { + D_801A2A28 = D_801A2A40; + ((void (*)(s32))func_8013D9B0)(2); + if (D_801A2A34 == 0) { + D_801A2A40 = D_801A2A40 + 1; + } + } + } + } + return; +} + + + + +extern void func_8013D9B0(void); +extern s32 D_801A2A34; + +s32 func_8013D13C(void) { + func_8013D9B0(); + return D_801A2A34; +} + + + +extern s32 D_801A2A40; + +void func_8013D164(void) { + D_801A2A40 = 1; +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013D178); + + +// @class: other +// @stuck: none — MATCH (three step-toward-target byte clamps + word store) + +extern u8 D_801A3D62; +extern u8 D_801A3DD6; +extern u8 D_801A3C8A; +extern u8 D_801A3D44; +extern u8 D_801A3C68; +extern u8 D_801A3C89; +extern s32 D_801A3D48; + +void func_8013D330(void) { + if ((D_801A3D62 & 0xff) != D_801A3DD6) { + D_801A3D62 = ((D_801A3D62 & 0xff) < D_801A3DD6) ? (D_801A3D62 + 1) : (D_801A3D62 - 1); + } + if ((D_801A3C8A & 0xff) != D_801A3D44) { + D_801A3C8A = ((D_801A3C8A & 0xff) < D_801A3D44) ? (D_801A3C8A + 1) : (D_801A3C8A - 1); + } + if ((D_801A3C68 & 0xff) != D_801A3C89) { + D_801A3C68 = ((D_801A3C68 & 0xff) < D_801A3C89) ? (D_801A3C68 + 1) : (D_801A3C68 - 1); + } + D_801A3D48 = 1; +} + + + + +// @class: regalloc-order +// @stuck: none — MATCH (match_one 90/90); base &D_80078E78 cached in a pointer local so gcc pins it into callee-saved $s1 and hoists the addr to the prologue (live across all 4 calls); direct array access D_80078E78[0x37] instead folds %lo per use (no $s1, frame 0x18 not 0x20) + +extern u8 D_80078E78[]; + +extern void *D_801A2A18; +extern void *D_801A2A1C; +extern void *D_801A2A20; +extern s32 D_801A2A48; +extern s32 D_801A2A4C; +extern s32 D_801A2A50; +extern s32 D_801A3CBC[]; + +extern u8 D_8017E5E4[]; +extern u8 D_8017E68C[]; +extern u8 D_8017E53C[]; +extern u8 D_8017E638[]; +extern u8 D_8017E6B8[]; +extern u8 D_8017E590[]; + +extern void func_8013D53C(void); +extern void func_8013DD68(void); +extern void func_8013D8FC(void); +extern void func_8013CF68(void); + +void func_8013D3D4(int param_1, int param_2) +{ + u8 *p = D_80078E78; + + D_801A2A48 = param_2; + D_801A2A4C = (param_2 >> 2) & 3; + D_801A2A50 = (param_2 >> 4) & 1; + if (((param_2 >> 2) & 3) == 0) { + D_801A2A18 = D_8017E5E4; + D_801A2A1C = D_8017E68C; + D_801A2A20 = D_8017E53C; + } else { + D_801A2A18 = D_8017E638; + D_801A2A1C = D_8017E6B8; + D_801A2A20 = D_8017E590; + } + func_8013D53C(); + if ((param_2 & 1) != 0) { + if (D_801A2A50 != 0) { + func_8013DD68(); + } else { + func_8013D8FC(); + } + func_8013CF68(); + if ((D_801A2A48 & 2) != 0) { + D_801A3CBC[0] = 0x140; + D_801A3CBC[3] = 0x80; + if (p[0x37] == 4) { + D_801A3CBC[0] = 0x140; + D_801A3CBC[3] = 0; + } + if (p[0x37] == 0) { + D_801A3CBC[0] = 0x140; + D_801A3CBC[3] = 0x80; + } + } + } +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013D53C); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013D8FC); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013D9B0); + + +// @class: struct +// @stuck: none — MATCH (match_one 97/97). Two levers: (1) offset-first pointer arith +// `(int*)(param_1*12 + (int)D_801A2A20)` makes the addu `offset+base` (dest=v0) so x/y/z +// load into a0/a1/a2 and each global loads LATE into v1 (base-first gave addu dest=v1 → +// global hoisted into a0, shifting x/y/z to a1/a2/a3). (2) the clamp must be NESTED +// if/else (slti dup'd inside each <,>= branch), NOT a merged `if(diff<5)` after the +// branch — gcc cross-jumps the identical `G=x` and `G=t` store tails into the two shared +// sites; the merged form emits one slti + unconditional store and diverges. + +extern void *D_801A2A20; +extern s16 *D_801A2A24; +extern s32 D_801A2A34; +extern s32 D_801A2A54; +extern s32 D_801A2A58; +extern s32 D_801A2A5C; + +extern void func_8013DD68(void); + +void func_8013DBE4(int param_1) +{ + int *p; + int x, y, z; + int flag; + + if (D_801A2A24 != 0) { + D_801A2A34 = 0; + p = (int *)(param_1 * 12 + (int)D_801A2A20); + x = p[0]; + y = p[1]; + z = p[2]; + flag = 0; + if (D_801A2A54 != x) { + flag = 1; + if (D_801A2A54 < x) { + if (x - D_801A2A54 < 5) { + D_801A2A54 = x; + } else { + D_801A2A54 = D_801A2A54 + 4; + } + } else { + if (D_801A2A54 - x < 5) { + D_801A2A54 = x; + } else { + D_801A2A54 = D_801A2A54 - 4; + } + } + } + if (D_801A2A58 != y) { + flag = 1; + if (D_801A2A58 < y) { + if (y - D_801A2A58 < 5) { + D_801A2A58 = y; + } else { + D_801A2A58 = D_801A2A58 + 4; + } + } else { + if (D_801A2A58 - y < 5) { + D_801A2A58 = y; + } else { + D_801A2A58 = D_801A2A58 - 4; + } + } + } + if (D_801A2A5C != z) { + flag = 1; + if (D_801A2A5C < z) { + if (z - D_801A2A5C < 5) { + D_801A2A5C = z; + } else { + D_801A2A5C = D_801A2A5C + 4; + } + } else { + if (D_801A2A5C - z < 5) { + D_801A2A5C = z; + } else { + D_801A2A5C = D_801A2A5C - 4; + } + } + } + if (flag != 0) { + func_8013DD68(); + } + D_801A2A34 = flag; + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (187 ins). Levers: struct-assign DRAWENV copy (align via type); pbase local for $s2-relative D_800B9A02; two-biv SPRT loop (q anchored one-above -> gcc re-anchors, no bare-deref); P_TAG_8013DD68 addPrim; single p var coalesces puVar7->puVar15; pins uVar2=$v1,iVar14=$a3,c5=$t3; biv-increment order sets q-init-before-puVar10-init; Buf_8013DD68 0x68 -> frame 0xA0. + +typedef struct { u32 addr : 24; u32 len : 8; u8 r0, g0, b0, code; } P_TAG_8013DD68; +typedef struct { u32 w[23]; } DrawEnv_8013DD68; /* 0x5C copy unit, align 4 */ +typedef struct { DrawEnv_8013DD68 env; u8 pad[0x0C]; } Buf_8013DD68; /* -> frame 0xA0 (gcc adds 0x10 for the struct-copy) */ + + +#define IDVAL (*(u16 *)(pbase + 0xA3D2)) +#define OTE ((P_TAG_8013DD68 *)(D_800BA0E4 + IDVAL * 0x10)) + +void func_8013DD68() { + extern void SetDrawEnv(void *p, void *env); + extern u16 D_800AF7B8; + extern u8 D_800BA0E4[]; + extern u8 D_8017E748[]; + + u32 *p; + u16 uVar1; + u16 *puVar16; + u16 *q; + u16 *puVar10; + register u16 uVar2 __asm__("$3"); + int uVar5; + register int iVar14 __asm__("$7"); + Buf_8013DD68 buf; + u8 *pbase; + u8 *base; + + pbase = D_800AF630; + puVar16 = (*(u16 * *)&D_801A2A24); + p = (*(u32 * *)&D_800A5E60); + uVar1 = *puVar16; + puVar16 = puVar16 + 1; + base = pbase + (u32)D_800AF7B8 * 0x5C; + buf.env = *(DrawEnv_8013DD68 *)(base + 0x38); + *((u8 *)&buf + 0x18) = 0; + SetDrawEnv(p, &buf); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + iVar14 = 0; + if (uVar1 != 0) { + register int c5 __asm__("$11") = 5; + puVar10 = (u16 *)((int)p + 0x18); + q = puVar16 + 8; + do { + *(u8 *)((int)puVar10 + -0x15) = c5; + uVar2 = q[-6]; + *(u8 *)((int)puVar10 + -0xd) = 100; + *(u8 *)((int)puVar10 + -0x10) = (u8)(*(int*)&D_801A2A54); + *(u8 *)((int)puVar10 + -0xf) = (u8)(*(int*)&D_801A2A58); + uVar5 = (*(int*)&D_801A2A5C); + *(u32 *)((int)puVar10 + -0x14) = uVar2 & 0x9ff | 0xe1000400; + *(u8 *)((int)puVar10 + -0xe) = (u8)uVar5; + *(u16 *)((int)puVar10 + -0xc) = q[-4]; + iVar14 = iVar14 + 1; + *(u16 *)((int)puVar10 + -0xa) = q[-3]; + *(u8 *)((int)puVar10 + -8) = (u8)*puVar16; + uVar2 = q[-7]; + *(u16 *)((int)puVar10 + -6) = 0x7800; + *(u8 *)((int)puVar10 + -7) = (u8)uVar2; + puVar16 = puVar16 + 8; + *(u16 *)((int)puVar10 + -4) = q[-2]; + *(u16 *)((int)puVar10 + -2) = q[-1]; + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + puVar10 = puVar10 + 0xc; + OTE->addr = (u32)p; + p = p + 6; + q = q + 8; + } while (iVar14 < (int)(u32)uVar1); + } + SetDrawEnv(p, D_8017E748); + ((P_TAG_8013DD68 *)p)->addr = OTE->addr; + OTE->addr = (u32)p; + p = p + 0x10; + (*(u32 * *)&D_800A5E60) = p; + return; +} + + + + +extern s32 D_801A2A3C; + +s32 func_8013E054(void) { + return D_801A2A3C; +} + + +DEFINE_func_8013E064() /* dedup: shared engine-core @0x8013E064 (src/shared) */ + +DEFINE_func_8013E0FC() /* dedup: shared engine-core @0x8013E0FC (src/shared) */ + +DEFINE_func_8013E194() /* dedup: shared engine-core @0x8013E194 (src/shared) */ + +DEFINE_func_8013E22C() /* dedup: shared engine-core @0x8013E22C (src/shared) */ + +DEFINE_func_8013E298() /* dedup: shared engine-core @0x8013E298 (src/shared) */ + +DEFINE_func_8013E2C4() /* dedup: shared engine-core @0x8013E2C4 (src/shared) */ + +DEFINE_func_8013E370() /* dedup: shared engine-core @0x8013E370 (src/shared) */ + +DEFINE_func_8013E410() /* dedup: shared engine-core @0x8013E410 (src/shared) */ + +DEFINE_func_8013E448() /* dedup: shared engine-core @0x8013E448 (src/shared) */ + +DEFINE_func_8013E4B4() /* dedup: shared engine-core @0x8013E4B4 (src/shared) */ + +DEFINE_func_8013E558() /* dedup: shared engine-core @0x8013E558 (src/shared) */ + +DEFINE_func_8013E588() /* dedup: shared engine-core @0x8013E588 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013E5E8); + +DEFINE_func_8013E67C() /* dedup: shared engine-core @0x8013E67C (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (90 ins, relocation-masked) + +extern u8 D_80078EC0; +extern u16 D_8011511A; +extern u16 D_80115124; +extern u8 D_80115148[]; +extern u8 D_80115140[]; +extern s32 D_8017F144; +extern u16 D_80115110; +extern s32 D_80115188; +extern s16 currentLocationId; +extern s16 D_8017F11C; +extern s16 D_8017F11E; +extern unsigned short D_80115112; + +extern void func_8013E83C(void); +extern s32 func_80029504(void); + +void func_8013E6AC(void) { + short i; + + func_8013E83C(); + D_8011511A = 0; + D_80115124 = D_80078EC0; + for (i = 0; i < 8; i++) { + *(s16 *)((char *)&D_80115148 + (i << 1)) = 0; + D_80115140[i] = 0; + } + if (!((u32)func_80029504() < 5 || currentLocationId == 0x302A || currentLocationId == 0x3073)) { + register s32 *ep __asm__("$8"); + register s32 *fp __asm__("$9"); + fp = (s32 *)&D_80115110; + ep = (s32 *)&D_8017F144; + for (i = 0; i < 5; i++) { + register s32 *fa __asm__("$6"); + s32 v; + fa = (s32 *)(i * 4 + (s32)fp); + v = ep[i] * 3 >> 2; + fa[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + D_8017F11C = 2; + D_8017F11E = 1; + { u16 *q = &D_80115112; *q += 1; } + } else { + func_8013E83C(); + D_8011511A = 7; + D_8017F11E = 0; + D_8017F11C = 0; + D_80115112 = 6; + } +} + + +DEFINE_func_8013E814() /* dedup: shared engine-core @0x8013E814 (src/shared) */ + +// @class: plumbing +// @stuck: none — MATCH (direct u16 global reads fold to lui/lhu; scheduler hoists the D_8011511A read above the prologue, reproduced by -O2) + +void func_8013E83C() { + extern void func_80141C0C(int); + extern unsigned short D_80115118; + extern unsigned short D_80115128; + extern unsigned short D_8011512E; + extern unsigned int D_80115130; + extern unsigned short D_80115158; + extern unsigned short D_8011515A; + extern unsigned short D_8011515C; + extern unsigned short D_8011515E; + extern unsigned short D_80115162; + extern unsigned short D_80115166; + extern void * D_801A2A70; + extern void * D_801A2A74; + extern unsigned char D_8017EDBC; + extern unsigned char D_8017EDD4; + extern unsigned char D_8017EE48; + extern unsigned char D_8017EE50; + + + D_80115118 = 0; + D_80115130 = 0; + if (D_8011511A >= 4) { + D_8011511A = D_8011511A - 3; + } + D_80115158 = 0x106; + + if ((((int(*)(int))func_80029178)(0x1c) & 0xFF) == 0) { + D_801A2A70 = &D_8017EDBC; + D_801A2A74 = &D_8017EE48; + } else { + D_801A2A70 = &D_8017EDD4; + D_801A2A74 = &D_8017EE50; + } + + D_8011515A = 0x104; + D_8011515C = 0x104; + D_8011515E = 0x129; + D_80115162 = 0x103; + D_80115166 = 0x105; + D_80115128 = 0; + D_8011512E = 0; + + if (D_80115110 == 3) { + ((void(*)(int, int))func_8002D4C8)(0x46e, 0); + } else { + func_80141C0C(0); + } +} + + + +// @class: schedule +// @stuck: none — MATCH (63 ins). The idx-32+ residual was a THIRD held base pointer for the +// D_80115188 store: the draft's `((Cell*)&D_80115188)[i].v = v` allocates a pointer, so gcc kept +// three bases (D_80115110/D_8017F144/D_80115188) and buried the branch-delay `sll` (i<<16 carry) +// under the extra store. Switching to the sibling func_8013E6AC's relocation-masked form +// `*(s32*)((char*)&D_80115188 + (i<<2))` recomputes that address via per-iteration %hi/%lo, leaving +// only TWO held pointers (fp=&D_80115110 -> $t0, ep=&D_8017F144 -> $a3) and freeing the delay slot +// to carry `i<<16` in $a0 exactly as the target does. Head (idx 0-31) already matched; i naturally +// lands in $a2 from the goto-loop delay slots, driving the fp/ep/fa=$8/$7/$5 alloc with no pins. + +void func_8013E958() +{ + extern void func_8014AA28(void); + extern s32 func_800D0488(s32); + extern void func_80141C0C(s32); + + + s16 *p = &(*(s16*)&D_80115124); + s16 i; + s32 v; + s16 m; + + D_800B9A15 = 0; + func_80139954(); + if (D_80078EC0 != *p) { + func_8014AA28(); + if ((D_80078EC0 & 0x7F) != 0) { + m = D_80078EC0 & 0x7F; + *p = m; + if (m == 0 || func_800D0488(m) == 0) + goto loop; + } + } + *p = 0; +loop: + for (i = 0; i < 5; i++) { + s32 *q = &((s32 *)&D_80115110)[i]; + v = ((s32 *)&D_8017F144)[i] >> 6; + q[0x16] = v; + *(s32 *)((char *)&D_80115188 + (i << 2)) = v; + } + func_80141C0C(7); + (*(u16*)&D_80115112) = 4; +} + + + +DEFINE_func_8013EA54() /* dedup: shared engine-core @0x8013EA54 (src/shared) */ + + +// @class: regalloc-order +// @stuck: none — MATCH (sVar2 pinned to $v0 forces in-place sll/sra sign-ext scratch) + + +extern s32 func_80141C50(void); +extern void func_8013F350(void); +extern void func_8013FAF8(s32 a0, s32 a1); +extern s16 func_8014168C(s16 a0); +extern s32 func_8014032C(s32 a0, s32 a1); +extern void func_80139954(void); +extern void func_801376E8(int a0, int a1); +extern void func_80137B80(void); +extern unsigned char *func_80141CA4(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8013E958(void); + +extern short D_800B9A02; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern u16 D_8011511A; +extern u16 D_8011511E; +extern short D_80115128; +extern unsigned short D_80115112; +extern s16 D_8011512A; +extern s32 D_80115130; +extern unsigned char D_8017F120; + +void func_8013EB7C(void) { + s32 sp10[2]; + short sVar1; + register short sVar2 __asm__("$2"); + s32 a0v; + s32 iVar4; + + if ((s16)func_80141C50() == 0) { + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + sVar1 = ((short (*)(void))func_8013F350)(); + if (D_8011511A >= 4) { + func_8013FAF8((s16)D_8011511A, (s16)(D_8011511A + 1)); + } + func_8013FAF8(0, 5); + if (D_8011511A == 5) { + sVar2 = ((short (*)(s32))func_8014168C)(2); + a0v = 2; + } else { + sVar2 = ((short (*)(s32))func_8014168C)((s16)D_8011511A); + a0v = (s16)D_8011511A; + } + iVar4 = func_8014032C(a0v, sVar2); + if (iVar4 != 0) { + s32 *p130 = &D_80115130; + if (iVar4 != *p130) { + *p130 = iVar4; + func_80139954(); + func_801376E8(iVar4, (s32)&(*(u8 *)&D_8017F120)); + } + } + func_80137B80(); + if ((D_8011511E & 0x10) != 0 && D_8011511A < 5 && sVar1 == 0) { + (*(s16 *)&D_80115128) = 0; + func_8002D4C8(0x466, 0); + if (D_8011511A != 4) { + func_801376E8((s32)((s32 (*)(void))func_80141CA4)(), (s32)&(*(u8 *)&D_8017F120)); + } + (*(unsigned short *)&D_80115112) -= 1; + } else { + if ((D_8011511E & 0x800) != 0 || D_8011512A != 0) { + func_8013E958(); + } + } + } + (void)sp10; +} + + +DEFINE_func_8013ED6C() /* dedup: shared engine-core @0x8013ED6C (src/shared) */ + +extern short D_800B9A02; +extern unsigned short D_80115112; +extern u8 D_801151C8[]; +extern s32 D_801151D0; +extern s16 D_8017F11C; +extern s16 D_8017F11E; +extern unsigned char D_8017F120; +extern void func_801376E8(int a0, int a1); +extern void func_8013FAF8(s32 a0, s32 a1); +extern unsigned char *func_80141CA4(void); + +// @class: struct +// @stuck: none — MATCH (94 ins, relocation-masked). Keys: (1) §18 array-of-STRUCT fold +// `typedef struct{s32 f0;} E4; extern E4 arr[]; arr[i].f0` defeats gcc's base-CSE/loop-hoist so each +// global-array access stays a per-access `lui %hi; addu idx; lw/sw %lo(sym)($at)` (a plain `s32 arr[]; +// arr[i]` HOISTS the base into a reg → wrong). (2) §21 global-RMW: the conditional `D_8017F11E` bump and +// the `D_80115112` increment keep the address in ONE reg → access via a pointer var, not the bare global. +// (3) the 2nd-loop base `q = p-8` (=&D_80115118 kept in $s0 across the calls) is declared INSIDE the loop +// so loop.c hoists it to the preheader slot AFTER `i=0` (an explicit pre-loop `q=` emits it BEFORE i=0, +// +2 off). (4) dead `s32 sp10[2];(void)sp10;` reserves the extra 8 frame bytes (0x28, not 0x20). +// Conflict-safe externs: asm-alias `aD80115188` (file-scope decl is scalar `s32 D_80115188`); `(u16)` +// cast on the `s16 D_8017F11C` read for the `lhu`; `D_80115168` is undeclared elsewhere in the TU. + +typedef struct { s32 f0; } E4; + + + +s32 func_8013EE10() { + extern E4 aD80115188[] __asm__("D_80115188"); + extern E4 D_80115168[]; + extern unsigned short D_80115118; + + short i; + u16 *p; + u16 old; + s16 *r; + u16 *c; + s32 sp10[2]; + + D_801151D0 = *(s32 *)&D_801151C8[(u16)D_800B9A02 * 4]; + func_8013FAF8(0, 5); + for (i = 0; i < 5; i++) { + s32 t = D_80115168[i].f0 * 3 >> 2; + aD80115188[i].f0 = t; + D_80115168[i].f0 = D_80115168[i].f0 - t; + } + r = &D_8017F11E; + if (*r < 3) { + *r = *r + 1; + } + D_8017F11C = (u16)D_8017F11C + 2; + p = &D_80115118; + old = *p; + *p = old + 1; + if (old >= 5) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F120); + for (i = 0; i < 5; i++) { + s32 *q = (s32 *)((char *)p - 8); + *(s32 *)((char *)&q[i] + 0x78) = 0; + D_80115168[i].f0 = 0; + } + c = &D_80115112; + *c += 1; + } + (void)sp10; +} + + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013EF88); + + +// @class: struct +// @stuck: none — MATCH expected (u16* base materialization for read+write, %lo-folded single-access globals) + + +extern unsigned short D_80115118; +extern unsigned short D_80115112; +extern u16 D_80115110; +extern unsigned char D_8017F120; + +extern unsigned char *func_80141CA4(void); +extern void func_801376E8(int a0, int a1); + +void func_8013F138(void) { + u16 *p = &D_80115118; + *p += 0x10; + if ((u16)*p >= 0x40) { + if (D_80115110 == 0) { + ((void (*)(int, unsigned char *))func_801376E8)((int)func_80141CA4(), &D_8017F120); + } + D_80115112 += 1; + } +} + + +DEFINE_func_8013F1BC() /* dedup: shared engine-core @0x8013F1BC (src/shared) */ + +DEFINE_func_8013F244() /* dedup: shared engine-core @0x8013F244 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013F350); + +INCLUDE_ASM("asm/ov_SC07_009/nonmatchings/ov_SC07_009_jr_801380E0", func_8013FAF8); +